1 module vibenotes.vibenotes; 2 3 import vibenotes.broadcast : WebSocketBroadcastService; 4 5 import vibe.http.server : HTTPServerResponse, HTTPServerRequest, HTTPStatus, enforceHTTP; 6 import vibe.http.websockets : handleWebSockets; 7 import vibe.web.common: contentType, path; 8 import vibe.web.web : SessionVar, render, redirect, terminateSession; 9 10 11 class VibeNotesWeb { 12 private struct LoginData { 13 string username; 14 bool loggedIn; 15 } 16 17 private { 18 SessionVar!(LoginData,"user") s_loginData; 19 WebSocketBroadcastService m_broadcastService; 20 } 21 22 this() 23 { 24 m_broadcastService = new WebSocketBroadcastService(); 25 } 26 27 @path("/") 28 void getIndex() 29 { 30 redirect("home"); 31 } 32 33 void getHome() 34 { 35 auto channels = m_broadcastService.channels; 36 render!("home.dt",channels); 37 } 38 39 void postHome(string name) 40 { 41 redirect("/n/"~name); 42 } 43 44 @path("/n/:name") 45 void getEditor(string _name) 46 { 47 auto name = _name; 48 render!("editor.dt",name); 49 } 50 51 void getLogin(string error = null) 52 { 53 if (s_loginData.loggedIn) terminateSession(); 54 render!("login.dt",error); 55 } 56 57 void postLogin(string username, string password) 58 { 59 enforceHTTP(username.length > 0, HTTPStatus.forbidden, 60 "User name must not be empty."); 61 //enforceHTTP(checkpassword(username,password), HTTPStatus.forbidden, 62 //"Invalid username or password."); 63 64 s_loginData = LoginData(username, true); 65 66 redirect("/"); 67 } 68 69 @path("/n/:channel/ws") 70 void getChannelWS(HTTPServerRequest req, HTTPServerResponse res, string _channel) 71 { 72 return handleWebSockets(m_broadcastService.getChannelHandler(_channel))(req,res); 73 } 74 }