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 }