package core import ( "database/sql" "errors" "fmt" ) func (u *User) ListPlans(db *sql.DB) ([]Plan, error) { var plans []Plan rows, err := db.Query( "SELECT p.id,p.name,p.owner,p.description,p.join_code FROM plans p "+ "JOIN members m ON m.plan_id=p.id "+ "WHERE m.user_id=?", u.Username, ) if err != nil { return plans, fmt.Errorf( "Unable to query plans for user %s: %w", u.Username, err, ) } defer rows.Close() for rows.Next() { p := Plan{} err = rows.Scan(&p.Id, &p.Name, &p.Owner, &p.Description, &p.JoinCode) if err != nil { return plans, fmt.Errorf( "Unable to scan plan for user %s: %w", u.Username, err, ) } plans = append(plans, p) } return plans, nil } func (u *User) GetPlan(db *sql.DB, plan_id uint) (*Plan, error) { plan, err := PlanGet(db, plan_id) if errors.Is(err, sql.ErrNoRows) { return nil, ErrNotFound } else if err != nil { return nil, err } if plan.Owner == u.Username { return plan, nil } isMember, err := plan.IsMember(db, u) if !isMember || err != nil { return nil, err } return plan, nil } func (u *User) GetMemberFromPlan(db *sql.DB, p Plan) (*Member, error) { m := Member{} row := db.QueryRow( "SELECT id,plan_id,name,user_id FROM members WHERE user_id=? AND plan_id=?", u.Username, p.Id, ) if err := row.Scan(&m.Id, &m.PlanId, &m.Name, &m.UserId); err != nil { return nil, fmt.Errorf( "Unable to get member from user %s and plan %d: %w", u.Username, p.Id, err, ) } return &m, nil } func UserGet(db *sql.DB, username string) (User, error) { var user User row := db.QueryRow("SELECT username, password FROM users WHERE username=?", username) err := row.Scan(&user.Username, &user.Password) return user, err } func (u *User) Create(db *sql.DB) error { _, err := db.Exec( "INSERT INTO users(username, password) VALUES (?,?)", u.Username, u.Password, ) return fmt.Errorf("Unable to create user %s: %w", u.Username, err) }