Completed db rewrite
This commit is contained in:
parent
54d7d14ef9
commit
cf4b8e0119
19 changed files with 481 additions and 276 deletions
118
core/plans.go
118
core/plans.go
|
|
@ -2,13 +2,13 @@ package core
|
|||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func CreatePlan(db *gorm.DB, user *User, name string) (*Plan, error) {
|
||||
func PlanCreate(db *sql.DB, user *User, name string) (*Plan, error) {
|
||||
join_code := make([]byte, 32)
|
||||
_, err := rand.Read(join_code)
|
||||
if err != nil {
|
||||
|
|
@ -16,100 +16,101 @@ func CreatePlan(db *gorm.DB, user *User, name string) (*Plan, error) {
|
|||
}
|
||||
|
||||
var plan Plan = Plan{
|
||||
Name: name,
|
||||
Owner: user.Username,
|
||||
Members: []Member{
|
||||
{
|
||||
UserID: user.Username,
|
||||
},
|
||||
},
|
||||
Name: name,
|
||||
Owner: user.Username,
|
||||
JoinCode: base64.URLEncoding.EncodeToString(join_code),
|
||||
}
|
||||
result := db.Create(&plan)
|
||||
if result.Error != nil {
|
||||
return nil, result.Error
|
||||
row := db.QueryRow(
|
||||
"INSERT INTO plans(name, owner, description, join_jode) VALUES (?, ?, '', ?) RETURNING id",
|
||||
plan.Name,
|
||||
plan.Owner,
|
||||
plan.JoinCode,
|
||||
)
|
||||
if err := row.Scan(&plan.Id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &plan, nil
|
||||
}
|
||||
|
||||
func GetPlan(orm *gorm.DB, id uint) (*Plan, error) {
|
||||
var plan Plan = Plan{
|
||||
ID: id,
|
||||
func PlanGet(db *sql.DB, id uint) (*Plan, error) {
|
||||
plan := Plan{}
|
||||
row := db.QueryRow("SELECT name,owner,description,join_code FROM plans WHERE id=?", id)
|
||||
if err := row.Scan(&plan.Name, &plan.Owner, &plan.Description, &plan.JoinCode); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
return nil, fmt.Errorf("Unexpected database error: %w", err)
|
||||
}
|
||||
result := orm.Take(&plan)
|
||||
|
||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrNotFound
|
||||
} else if result.Error != nil {
|
||||
return nil, result.Error
|
||||
}
|
||||
|
||||
return &plan, nil
|
||||
}
|
||||
|
||||
func (p *Plan) GetAllUsers(orm *gorm.DB) ([]Member, error) {
|
||||
var members []Member
|
||||
err := orm.Model(p).Association("Members").Find(&members)
|
||||
func (p *Plan) GetAllUsers(db *sql.DB) ([]Member, error) {
|
||||
members := []Member{}
|
||||
rows, err := db.Query("SELECT id,plan_id,name,user_id FROM members WHERE plan_id=?", p.Id)
|
||||
if err != nil {
|
||||
return members, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var m Member
|
||||
rows.Scan(&m.Id, &m.PlanId, &m.Name, &m.UserId)
|
||||
members = append(members, m)
|
||||
}
|
||||
return members, err
|
||||
}
|
||||
|
||||
func (p *Plan) IsMember(orm *gorm.DB, u *User) (bool, error) {
|
||||
var member_count int64
|
||||
result := orm.
|
||||
Table("members").
|
||||
Where("user_id=? AND plan_id=?", u.Username, p.ID).
|
||||
Count(&member_count).Error
|
||||
if result != nil {
|
||||
return false, ErrNotMember
|
||||
func (p *Plan) IsMember(db *sql.DB, u *User) (bool, error) {
|
||||
var member_count int
|
||||
row := db.QueryRow("SELECT count(1) FROM members WHERE plan_id=? AND user_id=?", p.Id, u.Username)
|
||||
if err := row.Scan(&member_count); err != nil {
|
||||
return false, nil
|
||||
}
|
||||
return member_count == 1, nil
|
||||
}
|
||||
|
||||
func (p *Plan) GetMember(orm *gorm.DB, u *User) (*Member, error) {
|
||||
func (p *Plan) GetMember(db *sql.DB, u *User) (*Member, error) {
|
||||
var m Member
|
||||
result := orm.
|
||||
Table("members").
|
||||
Where("user_id=? AND plan_id=?", u.Username, p.ID).
|
||||
Take(&m).Error
|
||||
if result != nil {
|
||||
return nil, ErrNotMember
|
||||
row := db.QueryRow("SELECT id,plan_id,name,user_id FROM members WHERE plan_id=? AND user_id=?", p.Id, u.Username)
|
||||
if err := row.Scan(&m.Id, &m.PlanId, &m.Name, &m.UserId); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, ErrNotMember
|
||||
}
|
||||
return nil, fmt.Errorf("Unable to check if user %s is member in plan %d: %w", u.Username, p.Id, err)
|
||||
}
|
||||
return &m, nil
|
||||
}
|
||||
|
||||
func (p *Plan) HasNonUser(orm *gorm.DB, name string) (bool, error) {
|
||||
var member_count int64
|
||||
result := orm.
|
||||
Table("members").
|
||||
Where("plan_id=? AND name=?", p.ID, name).
|
||||
Count(&member_count).Error
|
||||
if result != nil {
|
||||
return false, result
|
||||
func (p *Plan) HasNonUser(db *sql.DB, name string) (bool, error) {
|
||||
var member_count int
|
||||
row := db.QueryRow("SELECT count(1) FROM members WHERE plan_id=? AND name=?", p.Id, name)
|
||||
if err := row.Scan(&member_count); err != nil {
|
||||
return false, nil
|
||||
}
|
||||
return member_count == 1, nil
|
||||
}
|
||||
|
||||
func (p *Plan) AddMember(orm *gorm.DB, new_member *Member) error {
|
||||
func (p *Plan) AddMember(db *sql.DB, new_member *Member) error {
|
||||
if new_member == nil {
|
||||
return errors.New("Member is nil")
|
||||
}
|
||||
new_member.PlanID = p.ID
|
||||
new_member.PlanId = p.Id
|
||||
if new_member.Name != "" {
|
||||
found, err := p.HasNonUser(orm, new_member.Name)
|
||||
found, err := p.HasNonUser(db, new_member.Name)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
if found {
|
||||
return errors.New("Non user name taken")
|
||||
}
|
||||
return orm.Create(&new_member).Error
|
||||
} else if new_member.UserID != "" {
|
||||
user, err := GetUser(orm, new_member.UserID)
|
||||
_, err = db.Exec("INSERT INTO members(plan_id, name) VALUES (?,?)", new_member.PlanId, new_member.Name)
|
||||
return err
|
||||
} else if *new_member.UserId != "" {
|
||||
user, err := UserGet(db, *new_member.UserId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := p.IsMember(orm, &user)
|
||||
found, err := p.IsMember(db, &user)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
|
@ -117,7 +118,8 @@ func (p *Plan) AddMember(orm *gorm.DB, new_member *Member) error {
|
|||
return errors.New("User already is member")
|
||||
}
|
||||
|
||||
return orm.Create(&new_member).Error
|
||||
_, err = db.Exec("INSERT INTO members(plan_id, user_id) VALUES (?,?)", new_member.PlanId, new_member.UserId)
|
||||
return err
|
||||
} else {
|
||||
return errors.New("Member object requires one of Name or UserID to be filled")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue