package models import ( "errors" "gorm.io/gorm" . "planner/errors" ) func GetPlan(orm *gorm.DB, user User, id uint) (*Plan, error) { var plan Plan = Plan{ ID: id, } result := orm.Take(&plan) if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, ErrNotFound } else if result.Error != nil { return nil, result.Error } if plan.Owner == user.Username { return &plan, nil } isMember, err := plan.IsMember(orm, &user) if !isMember || err != nil { return nil, err } 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) IsMember(orm *gorm.DB, u *User) (bool, error) { var user User 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) { return false, ErrNotMember } return result == nil, result }