From a1dea963e9fb1eea28c283193881aea7f96ee94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Benouarets?= Date: Thu, 25 Sep 2025 23:24:06 +0200 Subject: [PATCH] feat: add data models and API structures - Add User model with authentication fields and validation - Add Session model for managing user sessions - Add API response structures for consistent API responses - Include GORM tags for database mapping and validation --- models/api.go | 31 +++++++++++++++++++++++++++++++ models/session.go | 31 +++++++++++++++++++++++++++++++ models/user.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 models/api.go create mode 100644 models/session.go create mode 100644 models/user.go diff --git a/models/api.go b/models/api.go new file mode 100644 index 0000000..95ce06f --- /dev/null +++ b/models/api.go @@ -0,0 +1,31 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) + +type ApiKey struct { + ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"` + Key string `json:"key" gorm:"not null;unique"` + UserID *uuid.UUID `json:"user_id"` + Revoked bool `json:"revoked" gorm:"not null;default:false"` + ExpiresAt *time.Time `json:"expires_at"` + CreatedAt time.Time `json:"created_at" gorm:"not null;default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"not null;default:now()"` + DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index;default:null"` + + // Relationships + User *User `json:"user" gorm:"foreignKey:user_id;references:id"` +} + +func (a *ApiKey) TableName() string { + return "api_keys" +} + +func (a *ApiKey) BeforeCreate(tx *gorm.DB) (err error) { + a.ID = uuid.New() + return +} diff --git a/models/session.go b/models/session.go new file mode 100644 index 0000000..2130122 --- /dev/null +++ b/models/session.go @@ -0,0 +1,31 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) + +type Session struct { + ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"` + UserID uuid.UUID `json:"user_id" gorm:"not null"` + Revoked bool `json:"revoked" gorm:"not null;default:false"` + LoggedOut bool `json:"logged_out" gorm:"not null;default:false"` + ExpiresAt time.Time `json:"expires_at" gorm:"not null"` + CreatedAt time.Time `json:"created_at" gorm:"not null;default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"not null;default:now()"` + DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index;default:null"` + + // Relationships + User User `json:"user" gorm:"foreignKey:user_id;references:id"` +} + +func (s *Session) TableName() string { + return "sessions" +} + +func (s *Session) BeforeCreate(tx *gorm.DB) (err error) { + s.ID = uuid.New() + return +} diff --git a/models/user.go b/models/user.go new file mode 100644 index 0000000..9d80e0c --- /dev/null +++ b/models/user.go @@ -0,0 +1,36 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) + +type User struct { + ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;default:gen_random_uuid()"` + FirstName string `json:"first_name" gorm:"not null"` + LastName string `json:"last_name" gorm:"not null"` + Username string `json:"username" gorm:"not null;unique"` + Password string `json:"password" gorm:"not null"` + Email string `json:"email" gorm:"not null;unique"` + Enabled bool `json:"enabled" gorm:"not null;default:true"` + Verified bool `json:"verified" gorm:"not null;default:false"` // TODO: remove this field + SuperAdmin bool `json:"super_admin" gorm:"not null;default:false"` + CreatedAt time.Time `json:"created_at" gorm:"not null;default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"not null;default:now()"` + DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index;default:null"` + + // Relationships + ApiKeys []ApiKey `json:"api_keys" gorm:"foreignKey:user_id;references:id"` + Sessions []Session `json:"sessions" gorm:"foreignKey:user_id;references:id"` +} + +func (u *User) TableName() string { + return "users" +} + +func (u *User) BeforeCreate(tx *gorm.DB) (err error) { + u.ID = uuid.New() + return +}