104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
package storage
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func UpdateInviteStatus(db *sql.DB, inviteID int, status string) error {
|
|
_, err := db.Exec(`
|
|
UPDATE syndicate_invites
|
|
SET status = ?
|
|
WHERE id = ?
|
|
`, status, inviteID)
|
|
return err
|
|
}
|
|
|
|
// ToDo: both a read and inset break up
|
|
func AcceptInvite(db *sql.DB, inviteID, userID int) error {
|
|
var syndicateID int
|
|
err := db.QueryRow(`
|
|
SELECT syndicate_id FROM syndicate_invites
|
|
WHERE id = ? AND invited_user_id = ? AND status = 'pending'
|
|
`, inviteID, userID).Scan(&syndicateID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := UpdateInviteStatus(db, inviteID, "accepted"); err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = db.Exec(`
|
|
INSERT INTO syndicate_members (syndicate_id, user_id, joined_at)
|
|
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
`, syndicateID, userID)
|
|
return err
|
|
}
|
|
|
|
func CreateSyndicate(db *sql.DB, ownerID int, name, description string) (int64, error) {
|
|
tx, err := db.Begin()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
defer tx.Rollback()
|
|
|
|
result, err := tx.Exec(`
|
|
INSERT INTO syndicates (name, description, owner_id, created_at)
|
|
VALUES (?, ?, ?, ?)
|
|
`, name, description, ownerID, time.Now())
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to create syndicate: %w", err)
|
|
}
|
|
|
|
syndicateID, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to get syndicate ID: %w", err)
|
|
}
|
|
|
|
_, err = tx.Exec(`
|
|
INSERT INTO syndicate_members (syndicate_id, user_id, role, joined_at)
|
|
VALUES (?, ?, 'manager', CURRENT_TIMESTAMP)
|
|
`, syndicateID, ownerID)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to add owner as member: %w", err)
|
|
}
|
|
|
|
if err := tx.Commit(); err != nil {
|
|
return 0, fmt.Errorf("commit failed: %w", err)
|
|
}
|
|
|
|
return syndicateID, nil
|
|
}
|
|
|
|
func InviteToSyndicate(db *sql.DB, inviterID, syndicateID int, username string) error {
|
|
var inviteeID int
|
|
err := db.QueryRow(`
|
|
SELECT id FROM users WHERE username = ?
|
|
`, username).Scan(&inviteeID)
|
|
if err == sql.ErrNoRows {
|
|
return fmt.Errorf("user not found")
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
var count int
|
|
err = db.QueryRow(`
|
|
SELECT COUNT(*) FROM syndicate_members
|
|
WHERE syndicate_id = ? AND user_id = ?
|
|
`, syndicateID, inviteeID).Scan(&count)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if count > 0 {
|
|
return fmt.Errorf("user already a member or invited")
|
|
}
|
|
|
|
_, err = db.Exec(`
|
|
INSERT INTO syndicate_members (syndicate_id, user_id, is_manager, status)
|
|
VALUES (?, ?, 0, 'invited')
|
|
`, syndicateID, inviteeID)
|
|
return err
|
|
}
|