1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: Apache-2.0
 4
 5package db
 6
 7import (
 8	"database/sql"
 9	"time"
10)
11
12// DeleteUser deletes specific user from the database and returns an error if it
13// fails
14func DeleteUser(db *sql.DB, user string) error {
15	_, err := db.Exec("DELETE FROM users WHERE username = ?", user)
16	return err
17}
18
19// CreateUser creates a new user in the database and returns an error if it fails
20func CreateUser(db *sql.DB, username, hash, salt string) error {
21	_, err := db.Exec("INSERT INTO users (username, hash, salt) VALUES (?, ?, ?)", username, hash, salt)
22	return err
23}
24
25// GetUser returns a user's hash and salt from the database as strings and
26// returns an error if it fails
27func GetUser(db *sql.DB, username string) (string, string, error) {
28	var hash, salt string
29	err := db.QueryRow("SELECT hash, salt FROM users WHERE username = ?", username).Scan(&hash, &salt)
30	return hash, salt, err
31}
32
33// GetUsers returns a list of all users in the database as a slice of strings
34// and returns an error if it fails
35func GetUsers(db *sql.DB) ([]string, error) {
36	rows, err := db.Query("SELECT username FROM users")
37	if err != nil {
38		return nil, err
39	}
40	defer rows.Close()
41
42	var users []string
43	for rows.Next() {
44		var user string
45		err = rows.Scan(&user)
46		if err != nil {
47			return nil, err
48		}
49		users = append(users, user)
50	}
51
52	return users, nil
53}
54
55// GetSession accepts a session ID and returns the username associated with it
56// and an error
57func GetSession(db *sql.DB, session string) (string, time.Time, error) {
58	var username string
59	var expiresString string
60	err := db.QueryRow("SELECT username, expires FROM sessions WHERE token = ?", session).Scan(&username, &expiresString)
61	if err != nil {
62		return "", time.Time{}, err
63	}
64
65	expires, err := time.Parse(time.RFC3339, expiresString)
66	if err != nil {
67		return "", time.Time{}, err
68	}
69	return username, expires, nil
70}
71
72// InvalidateSession invalidates a session by setting the expiration date to the
73// provided time.
74func InvalidateSession(db *sql.DB, session string, expiry time.Time) error {
75	_, err := db.Exec("UPDATE sessions SET expires = ? WHERE token = ?", expiry.Format(time.RFC3339), session)
76	return err
77}
78
79// CreateSession creates a new session in the database and returns an error if
80// it fails
81func CreateSession(db *sql.DB, username, token string, expiry time.Time) error {
82	_, err := db.Exec("INSERT INTO sessions (token, username, expires) VALUES (?, ?, ?)", token, username, expiry.Format(time.RFC3339))
83	return err
84}