Members now can be non-users
This commit is contained in:
parent
bce6857b12
commit
acfe6b7d0c
5 changed files with 40 additions and 28 deletions
2
db.go
2
db.go
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,32 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
type User struct {
|
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 {
|
||||||
ID uint `gorm:"primaryKey;autoIncrement:true" json:"id"`
|
ID uint `gorm:"primaryKey;autoIncrement:true" json:"id"`
|
||||||
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:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CREATE TABLE polls(id INTEGER PRIMARY KEY AUTOINCREMENT, plan INTEGER, name STRING, options JSON, FOREIGN KEY plan REFERENCES plans(id))
|
// CREATE TABLE polls(id INTEGER PRIMARY KEY AUTOINCREMENT, plan INTEGER, name STRING, options JSON, FOREIGN KEY plan REFERENCES plans(id))
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue