package repos import "apjournal/internal/models" type ActionRepo interface { DBActionCreate(req *models.Action) error DBActionList(username string) ([]models.Action, error) DBActionDone(name string) error DBActionsToReset() error } func (p *Provider) DBActionCreate(req *models.Action) error { _, err := p.db.NamedExec(` INSERT INTO action(username, name, magnitude, repeatable, type, done) VALUES (:username, :name, :magnitude, :repeatable, :type, :done);`, req) return err } func (p *Provider) DBActionList(username string) ([]models.Action, error) { resp := []models.Action{} query := "SELECT * FROM action WHERE username=$1;" if err := p.db.Select(&resp, query, username); err != nil { return nil, err } return resp, nil } func (p *Provider) DBActionDone(name string) error { // should reset at burn time stmt := "UPDATE action SET done=true WHERE name=$1;" _, err := p.db.Exec(stmt, name) return err } func (p *Provider) DBActionsToReset() error { stmts := []string{`UPDATE action SET done=false WHERE username IN (SELECT username FROM user_score WHERE burn_time < NOW());`, `UPDATE user_score SET burn_time=burn_time + INTERVAL '24 hours' WHERE burn_time < NOW();`} for _, s := range stmts { if _, err := p.db.Exec(s); err != nil { // rollback return err } } return nil }