From acfe6b7d0cb7e41e1747e637ac6d5c2cd5329ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Forc=C3=A9n=20Mu=C3=B1oz?= Date: Tue, 14 Jan 2025 20:14:07 +0100 Subject: [PATCH] Members now can be non-users --- db.go | 2 +- models/models.go | 32 +++++++++++++++++++++----------- models/plans.go | 22 ++++++++++------------ models/users.go | 8 ++++++-- planner.go | 4 ++-- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/db.go b/db.go index e3bef16..db40d4c 100644 --- a/db.go +++ b/db.go @@ -19,7 +19,7 @@ func bootstrapDatabase() *gorm.DB { return nil } - db.AutoMigrate(&User{}, &Plan{}, &Poll{}, &Vote{}) + db.AutoMigrate(&User{}, &Member{}, &Plan{}, &Poll{}, &Vote{}) //var tables = [...]struct { // key string diff --git a/models/models.go b/models/models.go index 0caeb51..e2778db 100644 --- a/models/models.go +++ b/models/models.go @@ -1,22 +1,32 @@ package models type User struct { - Username string `gorm:"primaryKey" json:"username"` - Password string `json:"password"` - OwnedPlans []Plan `gorm:"foreignKey:Owner;references:Username" json:"-"` - MemberPlans []Plan `gorm:"many2many:user_plans;" json:"-"` - Votes []Vote `gorm:"foreignKey:UsernameID" json:"-"` + Username string `gorm:"primaryKey" json:"username"` + Password string `json:"password"` + OwnedPlans []Plan `gorm:"foreignKey:Owner;references:Username" json:"-"` + MemberOf []Member `json:"-"` + Votes []Vote `gorm:"foreignKey:UsernameID" json:"-"` +} + +type Member struct { + ID uint `gorm:"primaryKey;autoIncrement:true"` + PlanID uint + Plan Plan + Type string `gorm:"check:type in ('member','non-member')"` + Name string `gorm:"check:type=='member' OR name IS NOT NULL" json:"name"` + UserID string + User User `gorm:"foreignKey:UserID"` } // CREATE TABLE plans(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING, owner STRING, FOREIGN KEY(owner) REFERENCES users(username)) // CREATE TABLE plan_user_relations(username STRING, plan INTEGER, PRIMARY KEY(username, plan), FOREIGN KEY username REFERENCES user(username), FOREIGN KEY plan REFERENCES plans(id)) type Plan struct { - ID uint `gorm:"primaryKey;autoIncrement:true" json:"id"` - Name string `json:"name"` - Owner string `json:"owner"` - Description string `json:"description"` - Members []User `gorm:"many2many:user_plans;" json:"-"` - Polls []Poll `gorm:"foreignKey:PlanID;references:ID" json:"-"` + ID uint `gorm:"primaryKey;autoIncrement:true" json:"id"` + Name string `json:"name"` + Owner string `json:"owner"` + Description string `json:"description"` + Members []Member `json:"-"` + Polls []Poll `gorm:"foreignKey:PlanID;references:ID" json:"-"` } // CREATE TABLE polls(id INTEGER PRIMARY KEY AUTOINCREMENT, plan INTEGER, name STRING, options JSON, FOREIGN KEY plan REFERENCES plans(id)) diff --git a/models/plans.go b/models/plans.go index 656ff6f..1e045bf 100644 --- a/models/plans.go +++ b/models/plans.go @@ -31,22 +31,20 @@ func GetPlan(orm *gorm.DB, user User, id uint) (*Plan, error) { return &plan, nil } -func (p *Plan) GetAllUsers(orm *gorm.DB) ([]User, error) { - var users []User - err := orm.Model(p).Association("Members").Find(&users) - return users, err +func (p *Plan) GetAllUsers(orm *gorm.DB) ([]Member, error) { + var members []Member + err := orm.Model(p).Association("Members").Find(&members) + return members, err } func (p *Plan) IsMember(orm *gorm.DB, u *User) (bool, error) { - var user User + var member_count int64 result := orm. - Table("users u"). - Select("u.*"). - Joins("JOIN user_plans up on u.username=up.user_username AND up.plan_id = ?", p.ID). - Where("u.username = ?", u.Username). - Take(&user).Error - if errors.Is(result, gorm.ErrRecordNotFound) { + Table("members"). + Where("user_id=? AND plan_id=?", u.Username, p.ID). + Count(&member_count).Error + if result != nil { return false, ErrNotMember } - return result == nil, result + return member_count == 1, nil } diff --git a/models/users.go b/models/users.go index bc9a6dc..cf25601 100644 --- a/models/users.go +++ b/models/users.go @@ -6,6 +6,10 @@ import ( func (u *User) GetPlans(orm *gorm.DB) ([]Plan, error) { var plans []Plan - err := orm.Model(u).Association("MemberPlans").Find(&plans) - return plans, err + err := orm.Debug().Table("plans p"). + Select("p.*"). + Joins("JOIN members m ON m.plan_id=p.id"). + Where("m.user_id=?", u.Username). + Find(&plans) + return plans, err.Error } diff --git a/planner.go b/planner.go index 5cb7a42..617745e 100644 --- a/planner.go +++ b/planner.go @@ -105,8 +105,8 @@ func main() { var plan Plan = Plan{ Name: plan_req.Name, Owner: u.Username, - Members: []User{ - {Username: u.Username}, + Members: []Member{ + {UserID: u.Username}, }, } result := orm.Create(&plan)