mood/inspo boards

database schema

besaid.zone 6a49a953 92eb6e01

verified
Changed files
+48 -14
cmd
internal
db
server
+3 -1
.gitignore
··· 1 build 2 - .env
··· 1 build 2 + .env 3 + *.db* 4 + *.shm
+1 -8
cmd/main.go
··· 3 import ( 4 "context" 5 "os" 6 - "time" 7 8 "github.com/charmbracelet/log" 9 _ "github.com/joho/godotenv/autoload" ··· 53 } 54 55 func runServer(ctx context.Context, cmd *cli.Command) error { 56 - appContext, cancel := context.WithTimeout(ctx, time.Minute*5) 57 - defer cancel() 58 logger := log.New(os.Stdout) 59 db, err := db.NewSQLiteDB() 60 if err != nil { ··· 62 } 63 logger.Info("database created") 64 65 - server := server.NewServer(appContext, cmd.String("port"), db, logger) 66 67 if err := server.Start(); err != nil { 68 log.Fatal(err) ··· 70 71 return nil 72 } 73 - 74 - // func migrate(db *sql.DB) { 75 - // _, err = db. 76 - // }
··· 3 import ( 4 "context" 5 "os" 6 7 "github.com/charmbracelet/log" 8 _ "github.com/joho/godotenv/autoload" ··· 52 } 53 54 func runServer(ctx context.Context, cmd *cli.Command) error { 55 logger := log.New(os.Stdout) 56 db, err := db.NewSQLiteDB() 57 if err != nil { ··· 59 } 60 logger.Info("database created") 61 62 + server := server.NewServer(cmd.String("port"), db, logger) 63 64 if err := server.Start(); err != nil { 65 log.Fatal(err) ··· 67 68 return nil 69 }
+43 -2
internal/db/db.go
··· 7 _ "github.com/mattn/go-sqlite3" 8 ) 9 10 - 11 func NewSQLiteDB() (*sql.DB, error) { 12 db, err := sql.Open("sqlite3", "./pallet.db") 13 14 if err != nil { 15 log.Fatal("error initializing database", err) ··· 17 18 defer db.Close() 19 return db, nil 20 - }
··· 7 _ "github.com/mattn/go-sqlite3" 8 ) 9 10 func NewSQLiteDB() (*sql.DB, error) { 11 db, err := sql.Open("sqlite3", "./pallet.db") 12 + _, err = db.Exec(` 13 + pragma foreign_keys = on; 14 + pragma journal_mode = wal; 15 + 16 + create table if not exists boards ( 17 + uri text primary key, 18 + cid text not null, 19 + rkey text not null, 20 + owner text not null, 21 + name text not null, 22 + description text, 23 + created_at datetime default current_timestamp, 24 + indexed_at text not null 25 + ); 26 + 27 + create table if not exists board_item ( 28 + uri text primary key, 29 + cid text not null, 30 + rkey text not null, 31 + owner text not null, 32 + board_id text not null, 33 + type text not null check(type in ('text', 'image')), 34 + text text, 35 + 36 + blob_cid text, 37 + mime_type text, 38 + width integer, 39 + height integer, 40 + alt_text text, 41 + 42 + position integer, 43 + created_at datetime default current_timestamp, 44 + indexed_at text not null, 45 + 46 + foreign key(board_id) references boards(rkey) on delete cascade, 47 + 48 + check ( 49 + (type = 'text' and text is not null and blob_cid is null) or 50 + (type = 'image' and blob_cid is not null and text is null) 51 + ) 52 + ); 53 + `) 54 55 if err != nil { 56 log.Fatal("error initializing database", err) ··· 58 59 defer db.Close() 60 return db, nil 61 + }
+1 -3
internal/server/server.go
··· 12 ) 13 14 type Server struct { 15 - ctx context.Context 16 addr string 17 db *sql.DB 18 logger *log.Logger ··· 23 status int 24 } 25 26 - func NewServer(ctx context.Context, addr string, db *sql.DB, logger *log.Logger) *Server { 27 return &Server{ 28 - ctx, 29 addr, 30 db, 31 logger,
··· 12 ) 13 14 type Server struct { 15 addr string 16 db *sql.DB 17 logger *log.Logger ··· 22 status int 23 } 24 25 + func NewServer(addr string, db *sql.DB, logger *log.Logger) *Server { 26 return &Server{ 27 addr, 28 db, 29 logger,