a mini social media app for small communities
1module main 2 3import veb 4import entity { User } 5 6fn (mut app App) index(mut ctx Context) veb.Result { 7 ctx.title = app.config.instance.name 8 user := app.whoami(mut ctx) or { User{} } 9 recent_posts := app.get_recent_posts() 10 pinned_posts := app.get_pinned_posts() 11 motd := app.get_motd() 12 return $veb.html() 13} 14 15fn (mut app App) login(mut ctx Context) veb.Result { 16 ctx.title = 'login to ${app.config.instance.name}' 17 user := app.whoami(mut ctx) or { User{} } 18 return $veb.html() 19} 20 21fn (mut app App) register(mut ctx Context) veb.Result { 22 ctx.title = 'register for ${app.config.instance.name}' 23 user := app.whoami(mut ctx) or { User{} } 24 return $veb.html() 25} 26 27fn (mut app App) me(mut ctx Context) veb.Result { 28 user := app.whoami(mut ctx) or { 29 ctx.error('not logged in') 30 return ctx.redirect('/login') 31 } 32 ctx.title = '${app.config.instance.name} - ${user.get_name()}' 33 return ctx.redirect('/user/${user.username}') 34} 35 36fn (mut app App) settings(mut ctx Context) veb.Result { 37 user := app.whoami(mut ctx) or { 38 ctx.error('not logged in') 39 return ctx.redirect('/login') 40 } 41 ctx.title = '${app.config.instance.name} - settings' 42 return $veb.html() 43} 44 45fn (mut app App) admin(mut ctx Context) veb.Result { 46 ctx.title = '${app.config.instance.name} dashboard' 47 user := app.whoami(mut ctx) or { User{} } 48 return $veb.html() 49} 50 51fn (mut app App) inbox(mut ctx Context) veb.Result { 52 user := app.whoami(mut ctx) or { 53 ctx.error('not logged in') 54 return ctx.redirect('/login') 55 } 56 ctx.title = '${app.config.instance.name} inbox' 57 notifications := app.get_notifications_for(user.id) 58 return $veb.html() 59} 60 61fn (mut app App) logout(mut ctx Context) veb.Result { 62 user := app.whoami(mut ctx) or { 63 ctx.error('not logged in') 64 return ctx.redirect('/login') 65 } 66 ctx.title = '${app.config.instance.name} logout' 67 return $veb.html() 68} 69 70@['/user/:username'] 71fn (mut app App) user(mut ctx Context, username string) veb.Result { 72 user := app.whoami(mut ctx) or { User{} } 73 viewing := app.get_user_by_name(username) or { 74 ctx.error('user not found') 75 return ctx.redirect('/') 76 } 77 ctx.title = '${app.config.instance.name} - ${user.get_name()}' 78 return $veb.html() 79} 80 81@['/post/:post_id'] 82fn (mut app App) post(mut ctx Context, post_id int) veb.Result { 83 post := app.get_post_by_id(post_id) or { 84 ctx.error('no such post') 85 return ctx.redirect('/') 86 } 87 ctx.title = '${app.config.instance.name} - ${post.title}' 88 user := app.whoami(mut ctx) or { User{} } 89 90 mut replying_to_post := app.get_unknown_post() 91 mut replying_to_user := app.get_unknown_user() 92 93 if post.replying_to != none { 94 replying_to_post = app.get_post_by_id(post.replying_to) or { 95 app.get_unknown_post() 96 } 97 replying_to_user = app.get_user_by_id(replying_to_post.author_id) or { 98 app.get_unknown_user() 99 } 100 } 101 102 return $veb.html() 103} 104 105@['/post/:post_id/edit'] 106fn (mut app App) edit(mut ctx Context, post_id int) veb.Result { 107 user := app.whoami(mut ctx) or { 108 ctx.error('not logged in') 109 return ctx.redirect('/login') 110 } 111 post := app.get_post_by_id(post_id) or { 112 ctx.error('no such post') 113 return ctx.redirect('/') 114 } 115 if post.author_id != user.id { 116 ctx.error('insufficient permissions') 117 return ctx.redirect('/post/${post_id}') 118 } 119 ctx.title = '${app.config.instance.name} - editing ${post.title}' 120 return $veb.html() 121} 122 123@['/post/:post_id/reply'] 124fn (mut app App) reply(mut ctx Context, post_id int) veb.Result { 125 user := app.whoami(mut ctx) or { 126 ctx.error('not logged in') 127 return ctx.redirect('/login') 128 } 129 post := app.get_post_by_id(post_id) or { 130 ctx.error('no such post') 131 return ctx.redirect('/') 132 } 133 ctx.title = '${app.config.instance.name} - reply to ${post.title}' 134 replying := true 135 replying_to := post_id 136 replying_to_user := app.get_user_by_id(post.author_id) or { 137 ctx.error('no such post') 138 return ctx.redirect('/') 139 } 140 return $veb.html('templates/new_post.html') 141} 142 143@['/post/new'] 144fn (mut app App) new(mut ctx Context) veb.Result { 145 user := app.whoami(mut ctx) or { 146 ctx.error('not logged in') 147 return ctx.redirect('/login') 148 } 149 ctx.title = '${app.config.instance.name} - new post' 150 replying := false 151 replying_to := 0 152 replying_to_user := User{} 153 return $veb.html('templates/new_post.html') 154} 155 156@['/tag/:tag'] 157fn (mut app App) tag(mut ctx Context, tag string) veb.Result { 158 user := app.whoami(mut ctx) or { 159 ctx.error('not logged in') 160 return ctx.redirect('/login') 161 } 162 ctx.title = '${app.config.instance.name} - #${tag}' 163 offset := 0 164 return $veb.html() 165} 166 167@['/tag/:tag/:offset'] 168fn (mut app App) tag_with_offset(mut ctx Context, tag string, offset int) veb.Result { 169 user := app.whoami(mut ctx) or { 170 ctx.error('not logged in') 171 return ctx.redirect('/login') 172 } 173 ctx.title = '${app.config.instance.name} - #${tag}' 174 return $veb.html('templates/tag.html') 175}