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}