a mini social media app for small communities
1module main
2
3import db.pg
4import veb
5import auth
6import entity
7import os
8import webapp { App, Context, StringValidator }
9import beep_sql
10import util
11
12@[inline]
13fn connect(mut app App) {
14 println('-> connecting to database...')
15 app.db = pg.connect(pg.Config{
16 host: app.config.postgres.host
17 dbname: app.config.postgres.db
18 user: app.config.postgres.user
19 password: app.config.postgres.password
20 port: app.config.postgres.port
21 }) or {
22 panic('failed to connect to database: ${err}')
23 }
24}
25
26@[inline]
27fn init_db(mut app App) {
28 println('-> initializing database')
29 sql app.db {
30 create table entity.Site
31 create table entity.User
32 create table entity.Post
33 create table entity.Like
34 create table entity.LikeCache
35 create table entity.Notification
36 create table entity.SavedPost
37 } or {
38 panic('failed to initialize database: ${err}')
39 }
40}
41
42@[inline]
43fn load_validators(mut app App) {
44 // vfmt off
45 user := app.config.user
46 app.validators.username = StringValidator.new(user.username_min_len, user.username_max_len, user.username_pattern)
47 app.validators.password = StringValidator.new(user.password_min_len, user.password_max_len, user.password_pattern)
48 app.validators.nickname = StringValidator.new(user.nickname_min_len, user.nickname_max_len, user.nickname_pattern)
49 app.validators.user_bio = StringValidator.new(user.bio_min_len, user.bio_max_len, user.bio_pattern)
50 app.validators.pronouns = StringValidator.new(user.pronouns_min_len, user.pronouns_max_len, user.pronouns_pattern)
51 post := app.config.post
52 app.validators.post_title = StringValidator.new(post.title_min_len, post.title_max_len, post.title_pattern)
53 app.validators.post_body = StringValidator.new(post.body_min_len, post.body_max_len, post.body_pattern)
54 // vfmt on
55}
56
57fn main() {
58 mut stopwatch := util.Stopwatch.new()
59
60 config := webapp.load_config_from(os.args[1])
61 mut app := &App{ config: config }
62
63 // connect to database
64 util.time_it(
65 it: fn [mut app] () {
66 connect(mut app)
67 }
68 name: 'connect to db'
69 log: true
70 )
71 defer { app.db.close() or { panic(err) } }
72
73 // initialize database
74 util.time_it(it: fn [mut app] () {
75 init_db(mut app)
76 }, name: 'init db', log: true)
77
78 // load sql files kept in beep_sql/
79 util.time_it(
80 it: fn [mut app] () {
81 beep_sql.load(mut app.db)
82 }
83 name: 'load beep_sql'
84 log: true
85 )
86
87 // add authenticator
88 app.auth = auth.new(app.db)
89
90 // load validators
91 load_validators(mut app)
92
93 // mount static things
94 app.mount_static_folder_at(app.config.static_path, '/static')!
95
96 // make the website config, if it does not exist
97 app.get_or_create_site_config()
98
99 if config.dev_mode {
100 println('\033[1;31mNOTE: YOU ARE IN DEV MODE\033[0m')
101 }
102
103 stop := stopwatch.stop()
104 println('-> took ${stop} to start app')
105
106 veb.run[App, Context](mut app, app.config.http.port)
107}