166 lines
3 KiB
V
166 lines
3 KiB
V
module main
|
|
|
|
import vweb
|
|
import db.sqlite
|
|
import time
|
|
import net.http
|
|
|
|
const http_port = 8080
|
|
|
|
enum Status {
|
|
besteld = 0
|
|
bakken = 1
|
|
klaar = 2
|
|
afgegeven = 3
|
|
}
|
|
|
|
pub fn (s Status) str() string {
|
|
return match s {
|
|
.besteld { 'Pannenkoek besteld' }
|
|
.bakken { 'Pannenkoek aan het bakken' }
|
|
.klaar { 'Pannenkoek klaar' }
|
|
.afgegeven { 'Pannenkoek afgegeven' }
|
|
}
|
|
}
|
|
|
|
struct Person {
|
|
id int @[primary; sql: serial]
|
|
status int
|
|
name string
|
|
remark string
|
|
order_time time.Time
|
|
}
|
|
|
|
pub fn (p Person) str() string {
|
|
return 'Person[id:${p.id}, status:${p.status}]'
|
|
}
|
|
|
|
pub fn (p Person) order_time_humanized() string {
|
|
return p.order_time.relative()
|
|
}
|
|
|
|
pub fn (p Person) remark() string {
|
|
return if p.remark.len > 0 {
|
|
'(${p.remark})'
|
|
} else {
|
|
''
|
|
}
|
|
}
|
|
|
|
pub fn (p Person) status_str() string {
|
|
unsafe {
|
|
s := Status(p.status)
|
|
return s.str()
|
|
}
|
|
}
|
|
|
|
// === Database ===
|
|
|
|
pub fn create_db_connection() !sqlite.DB {
|
|
return sqlite.connect('pancakes.db')!
|
|
}
|
|
|
|
fn get_people() ![]Person {
|
|
mut db := create_db_connection()!
|
|
status_filter := int(Status.afgegeven)
|
|
people := sql db {
|
|
select from Person where status < status_filter
|
|
}!
|
|
return people
|
|
}
|
|
|
|
fn status_update(user_id int) !Person {
|
|
mut db := create_db_connection()!
|
|
people := sql db {
|
|
select from Person where id == user_id
|
|
}!
|
|
person := people.first()
|
|
sql db {
|
|
update Person set status = person.status + 1 where id == person.id
|
|
}!
|
|
return person
|
|
}
|
|
|
|
fn add_person(name string, remark string) ! {
|
|
mut db := create_db_connection()!
|
|
people := sql db {
|
|
select from Person where name == name && status < 3
|
|
}!
|
|
|
|
if people.len == 0 {
|
|
p := Person{
|
|
status: 0
|
|
order_time: time.now()
|
|
name: name
|
|
remark: remark
|
|
}
|
|
sql db {
|
|
insert p into Person
|
|
}!
|
|
}
|
|
}
|
|
|
|
// === WEB ===
|
|
|
|
struct App {
|
|
vweb.Context
|
|
}
|
|
|
|
pub fn (app App) before_request() {
|
|
println('[Vweb] ${app.Context.req.method} ${app.Context.req.url}')
|
|
}
|
|
|
|
fn main() {
|
|
println('Start pannenkoeken webserver')
|
|
mut db := create_db_connection() or { panic(err) }
|
|
|
|
sql db {
|
|
create table Person
|
|
} or { panic('error on create table: ${err}') }
|
|
|
|
db.close() or { panic(err) }
|
|
|
|
vweb.run(&App{}, http_port)
|
|
}
|
|
|
|
@['/'; get]
|
|
pub fn (mut app App) home() vweb.Result {
|
|
people := get_people() or {
|
|
app.set_status(400, '')
|
|
return app.text('${err}')
|
|
}
|
|
return $vweb.html()
|
|
}
|
|
|
|
@['/status_update'; post]
|
|
pub fn (mut app App) status_update() vweb.Result {
|
|
if person := status_update(app.form['id'].int()) {
|
|
if person.status == 1 {
|
|
spawn fn () {
|
|
http.post('http://10.1.0.224:8080/blink', '') or {}
|
|
}()
|
|
spawn fn (name string) {
|
|
http.post('http://10.1.2.3', 'ScrollingText >>> ${name} <<< Enjoy! ') or {}
|
|
http.post('http://10.1.2.3', 'Option text_trailingWhitespace 1') or {}
|
|
}(person.name)
|
|
}
|
|
}
|
|
|
|
return app.redirect('/')
|
|
}
|
|
|
|
@['/add_person'; post]
|
|
pub fn (mut app App) add_person() vweb.Result {
|
|
name := app.form['name']
|
|
if name.len == 0 {
|
|
return app.redirect('/')
|
|
}
|
|
|
|
add_person(app.form['name'], app.form['remark']) or {
|
|
app.set_status(400, '')
|
|
return app.text('${err}')
|
|
}
|
|
|
|
return app.redirect('/')
|
|
}
|