Members now can be non-users

This commit is contained in:
Manuel Forcén Muñoz 2025-01-14 20:14:07 +01:00
parent bce6857b12
commit acfe6b7d0c
5 changed files with 40 additions and 28 deletions

2
db.go
View file

@ -19,7 +19,7 @@ func bootstrapDatabase() *gorm.DB {
return nil return nil
} }
db.AutoMigrate(&User{}, &Plan{}, &Poll{}, &Vote{}) db.AutoMigrate(&User{}, &Member{}, &Plan{}, &Poll{}, &Vote{})
//var tables = [...]struct { //var tables = [...]struct {
// key string // key string

View file

@ -4,10 +4,20 @@ type User struct {
Username string `gorm:"primaryKey" json:"username"` Username string `gorm:"primaryKey" json:"username"`
Password string `json:"password"` Password string `json:"password"`
OwnedPlans []Plan `gorm:"foreignKey:Owner;references:Username" json:"-"` OwnedPlans []Plan `gorm:"foreignKey:Owner;references:Username" json:"-"`
MemberPlans []Plan `gorm:"many2many:user_plans;" json:"-"` MemberOf []Member `json:"-"`
Votes []Vote `gorm:"foreignKey:UsernameID" 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 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)) // 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 { type Plan struct {
@ -15,7 +25,7 @@ type Plan struct {
Name string `json:"name"` Name string `json:"name"`
Owner string `json:"owner"` Owner string `json:"owner"`
Description string `json:"description"` Description string `json:"description"`
Members []User `gorm:"many2many:user_plans;" json:"-"` Members []Member `json:"-"`
Polls []Poll `gorm:"foreignKey:PlanID;references:ID" json:"-"` Polls []Poll `gorm:"foreignKey:PlanID;references:ID" json:"-"`
} }

View file

@ -31,22 +31,20 @@ func GetPlan(orm *gorm.DB, user User, id uint) (*Plan, error) {
return &plan, nil return &plan, nil
} }
func (p *Plan) GetAllUsers(orm *gorm.DB) ([]User, error) { func (p *Plan) GetAllUsers(orm *gorm.DB) ([]Member, error) {
var users []User var members []Member
err := orm.Model(p).Association("Members").Find(&users) err := orm.Model(p).Association("Members").Find(&members)
return users, err return members, err
} }
func (p *Plan) IsMember(orm *gorm.DB, u *User) (bool, error) { func (p *Plan) IsMember(orm *gorm.DB, u *User) (bool, error) {
var user User var member_count int64
result := orm. result := orm.
Table("users u"). Table("members").
Select("u.*"). Where("user_id=? AND plan_id=?", u.Username, p.ID).
Joins("JOIN user_plans up on u.username=up.user_username AND up.plan_id = ?", p.ID). Count(&member_count).Error
Where("u.username = ?", u.Username). if result != nil {
Take(&user).Error
if errors.Is(result, gorm.ErrRecordNotFound) {
return false, ErrNotMember return false, ErrNotMember
} }
return result == nil, result return member_count == 1, nil
} }

View file

@ -6,6 +6,10 @@ import (
func (u *User) GetPlans(orm *gorm.DB) ([]Plan, error) { func (u *User) GetPlans(orm *gorm.DB) ([]Plan, error) {
var plans []Plan var plans []Plan
err := orm.Model(u).Association("MemberPlans").Find(&plans) err := orm.Debug().Table("plans p").
return plans, err Select("p.*").
Joins("JOIN members m ON m.plan_id=p.id").
Where("m.user_id=?", u.Username).
Find(&plans)
return plans, err.Error
} }

View file

@ -105,8 +105,8 @@ func main() {
var plan Plan = Plan{ var plan Plan = Plan{
Name: plan_req.Name, Name: plan_req.Name,
Owner: u.Username, Owner: u.Username,
Members: []User{ Members: []Member{
{Username: u.Username}, {UserID: u.Username},
}, },
} }
result := orm.Create(&plan) result := orm.Create(&plan)