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}