From 361fc13741ead00c39d3313c34d1a438dfb571e0 Mon Sep 17 00:00:00 2001 From: Xevion Date: Thu, 7 Nov 2024 11:03:21 -0600 Subject: [PATCH] Remove IPAddress model, add User model --- .../004_create_user_remove_ipaddress.py | 66 +++++++++++++++++++ backend/linkpulse/models.py | 15 +++-- 2 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 backend/linkpulse/migrations/004_create_user_remove_ipaddress.py diff --git a/backend/linkpulse/migrations/004_create_user_remove_ipaddress.py b/backend/linkpulse/migrations/004_create_user_remove_ipaddress.py new file mode 100644 index 0000000..9322940 --- /dev/null +++ b/backend/linkpulse/migrations/004_create_user_remove_ipaddress.py @@ -0,0 +1,66 @@ +"""Peewee migrations -- 004_create_user_remove_ipaddress.py. + +Some examples (model - class or model name):: + + > Model = migrator.orm['table_name'] # Return model in current state by name + > Model = migrator.ModelClass # Return model in current state by name + + > migrator.sql(sql) # Run custom SQL + > migrator.run(func, *args, **kwargs) # Run python function with the given args + > migrator.create_model(Model) # Create a model (could be used as decorator) + > migrator.remove_model(model, cascade=True) # Remove a model + > migrator.add_fields(model, **fields) # Add fields to a model + > migrator.change_fields(model, **fields) # Change fields + > migrator.remove_fields(model, *field_names, cascade=True) + > migrator.rename_field(model, old_field_name, new_field_name) + > migrator.rename_table(model, new_table_name) + > migrator.add_index(model, *col_names, unique=False) + > migrator.add_not_null(model, *field_names) + > migrator.add_default(model, field_name, default) + > migrator.add_constraint(model, name, sql) + > migrator.drop_index(model, *col_names) + > migrator.drop_not_null(model, *field_names) + > migrator.drop_constraints(model, *constraints) + +""" + +from contextlib import suppress + +import peewee as pw +from peewee_migrate import Migrator + + +with suppress(ImportError): + import playhouse.postgres_ext as pw_pext + + +def migrate(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your migrations here.""" + + @migrator.create_model + class User(pw.Model): + id = pw.AutoField() + email = pw.CharField(max_length=45, unique=True) + password_hash = pw.CharField(max_length=96) + created_at = pw.DateTimeField() + updated_at = pw.DateTimeField() + + class Meta: + table_name = "user" + + migrator.remove_model('ipaddress') + + +def rollback(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your rollback migrations here.""" + + @migrator.create_model + class IPAddress(pw.Model): + ip = pw.CharField(max_length=255, primary_key=True) + last_seen = pw.DateTimeField() + count = pw.IntegerField(default=0) + + class Meta: + table_name = "ipaddress" + + migrator.remove_model('user') diff --git a/backend/linkpulse/models.py b/backend/linkpulse/models.py index 2ae1be2..ec7fc70 100644 --- a/backend/linkpulse/models.py +++ b/backend/linkpulse/models.py @@ -3,10 +3,11 @@ This module defines the database models for the LinkPulse backend. It also provides a base model with database connection details. """ +from datetime import datetime from os import getenv import structlog -from peewee import CharField, DateTimeField, IntegerField, Model +from peewee import CharField, DateTimeField, IntegerField, AutoField, Model from playhouse.db_url import connect logger = structlog.get_logger() @@ -26,7 +27,11 @@ class BaseModel(Model): database = connect(url=_get_database_url()) -class IPAddress(BaseModel): - ip = CharField(primary_key=True) - last_seen = DateTimeField() # timezone naive - count = IntegerField(default=0) +class User(BaseModel): + id = AutoField(primary_key=True) + # arbitrary max length, but statistically reasonable and limits UI concerns/abuse cases + email = CharField(unique=True, max_length=45) + # full hash with encoded salt/parameters, argon2 but assume nothing + password_hash = CharField(max_length=96) + created_at = DateTimeField(default=datetime.now) + updated_at = DateTimeField(default=datetime.now)