summaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
Diffstat (limited to 'database')
-rw-r--r--database/migrate.go36
-rw-r--r--database/users.go47
2 files changed, 80 insertions, 3 deletions
diff --git a/database/migrate.go b/database/migrate.go
index a117480..e9e21b7 100644
--- a/database/migrate.go
+++ b/database/migrate.go
@@ -4,6 +4,7 @@ import (
"log"
"database/sql"
+
_ "github.com/mattn/go-sqlite3"
)
@@ -127,6 +128,40 @@ func MigrateGuestBook(dbConn *sql.DB) (*sql.DB, error) {
return dbConn, nil
}
+func MigrateProfiles(dbConn *sql.DB) (*sql.DB, error) {
+ log.Println("migrating profiles columns")
+
+ userColumns := map[string]bool{}
+ row, err := dbConn.Query(`PRAGMA table_info(users);`)
+ if err != nil {
+ return dbConn, err
+ }
+ defer row.Close()
+
+ for row.Next() {
+ var columnName string
+ row.Scan(nil, &columnName, nil, nil, nil, nil)
+ userColumns[columnName] = true
+ }
+
+ columns := map[string]string{}
+ columns["pronouns"] = "unspecified"
+ columns["bio"] = "a computer hater"
+ columns["location"] = "earth"
+ columns["website"] = "https://hatecomputers.club"
+ columns["avatar"] = "/static/img/default-avatar.png"
+
+ for column, defaultValue := range columns {
+ if userColumns[column] {
+ continue
+ }
+ log.Println("migrating column", column)
+ _, err = dbConn.Exec(`ALTER TABLE users ADD COLUMN ` + column + ` TEXT NOT NULL DEFAULT '` + defaultValue + `';`)
+ }
+
+ return dbConn, nil
+}
+
func Migrate(dbConn *sql.DB) (*sql.DB, error) {
log.Println("migrating database")
@@ -137,6 +172,7 @@ func Migrate(dbConn *sql.DB) (*sql.DB, error) {
MigrateDomainOwners,
MigrateDNSRecords,
MigrateGuestBook,
+ MigrateProfiles,
}
for _, migration := range migrations {
diff --git a/database/users.go b/database/users.go
index 6f9456e..804b723 100644
--- a/database/users.go
+++ b/database/users.go
@@ -24,6 +24,11 @@ type User struct {
Mail string `json:"email"`
Username string `json:"preferred_username"`
DisplayName string `json:"name"`
+ Bio string `json:"bio"`
+ Location string `json:"location"`
+ Website string `json:"website"`
+ Pronouns string `json:"pronouns"` // liberals!! :O
+ Avatar string `json:"avatar"`
CreatedAt time.Time `json:"created_at"`
}
@@ -33,13 +38,38 @@ type UserSession struct {
ExpireAt time.Time `json:"expire_at"`
}
+func ListUsers(dbConn *sql.DB) ([]*User, error) {
+ log.Println("listing users")
+
+ rows, err := dbConn.Query(`SELECT id, mail, username, display_name, bio, location, website, avatar, pronouns, created_at FROM users;`)
+ if err != nil {
+ log.Println(err)
+ return nil, err
+ }
+ defer rows.Close()
+
+ var users []*User
+ for rows.Next() {
+ var user User
+ err := rows.Scan(&user.ID, &user.Mail, &user.Username, &user.DisplayName, &user.Bio, &user.Location, &user.Website, &user.Avatar, &user.Pronouns, &user.CreatedAt)
+ if err != nil {
+ log.Println(err)
+ return nil, err
+ }
+
+ users = append(users, &user)
+ }
+
+ return users, nil
+}
+
func GetUser(dbConn *sql.DB, id string) (*User, error) {
log.Println("getting user", id)
- row := dbConn.QueryRow(`SELECT id, mail, username, display_name, created_at FROM users WHERE id = ?;`, id)
+ row := dbConn.QueryRow(`SELECT id, mail, username, display_name, bio, location, website, avatar, pronouns, created_at FROM users WHERE id = ?;`, id)
var user User
- err := row.Scan(&user.ID, &user.Mail, &user.Username, &user.DisplayName, &user.CreatedAt)
+ err := row.Scan(&user.ID, &user.Mail, &user.Username, &user.DisplayName, &user.Bio, &user.Location, &user.Website, &user.Avatar, &user.Pronouns, &user.CreatedAt)
if err != nil {
log.Println(err)
return nil, err
@@ -48,7 +78,7 @@ func GetUser(dbConn *sql.DB, id string) (*User, error) {
return &user, nil
}
-func FindOrSaveUser(dbConn *sql.DB, user *User) (*User, error) {
+func FindOrSaveBaseUser(dbConn *sql.DB, user *User) (*User, error) {
log.Println("finding or saving user", user.ID)
_, err := dbConn.Exec(`INSERT INTO users (id, mail, username, display_name) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET mail = excluded.mail, username = excluded.username, display_name = excluded.display_name;`, user.ID, user.Mail, user.Username, user.DisplayName)
@@ -59,6 +89,17 @@ func FindOrSaveUser(dbConn *sql.DB, user *User) (*User, error) {
return user, nil
}
+func SaveUser(dbConn *sql.DB, user *User) (*User, error) {
+ log.Println("saving user", user.ID)
+
+ _, err := dbConn.Exec(`INSERT INTO users (id, mail, username, display_name, bio, location, website, pronouns, avatar) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET mail = excluded.mail, username = excluded.username, display_name = excluded.display_name, bio = excluded.bio, location = excluded.location, website = excluded.website, pronouns = excluded.pronouns, avatar = excluded.avatar;`, user.ID, user.Mail, user.Username, user.DisplayName, user.Bio, user.Location, user.Website, user.Pronouns, user.Avatar)
+ if err != nil {
+ return nil, err
+ }
+
+ return user, nil
+}
+
func MakeUserSessionFor(dbConn *sql.DB, user *User) (*UserSession, error) {
log.Println("making session for user", user.ID)