1 module handlers;
2 
3 import app;
4 import vibe.vibe;
5 import libyggdrasil.libyggdrasil;
6 import std.net.curl;
7 import std.json;
8 import std.stdio;
9 import std.socket;
10 import std.string;
11 import collector;
12 
13 void home(HTTPServerRequest request, HTTPServerResponse response)
14 {
15 	/* Render the template */
16 	response.render!("index.dt");
17 }
18 
19 
20 private string[] getKeys()
21 {
22 	return d.getKeys();
23 }
24 
25 void peerlist(HTTPServerRequest request, HTTPServerResponse response)
26 {
27 	/* Fetch the peers list from Arceliar's node */
28 	string[] peers = d.getKeys();
29 
30 	ulong offset = to!(ulong)(request.query["offset"]);
31 	peers = peers[offset..offset+10];
32 
33 	/* Fetch node names */
34 	Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090);
35 	YggdrasilPeer yggPeer = new YggdrasilPeer(testNode);
36 	
37 	/* Render the template */
38 	Collector collector = d;
39 	response.render!("peerlist.dt", peers, collector, yggPeer, offset);
40 }
41 
42 void peerinfo(HTTPServerRequest request, HTTPServerResponse response)
43 {
44 	/* Fetch the key */
45 	/* TODO: Validate the key */
46 	string key = request.query["key"];
47 
48 	Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090);
49 	YggdrasilPeer yggPeer = new YggdrasilPeer(testNode);
50 
51 	/* Fetch the node */
52 	YggdrasilNode yggNode = yggPeer.fetchNode(key);
53 
54 	/* Fetch the NodeInfo */
55 	NodeInfo nodeInfo = yggNode.getNodeInfo();
56 
57 	string ip, name, group, country, operator, nodeInfoJSON;
58 
59 	if(nodeInfo)
60 	{
61 		/* TODO: Fix up yggdraisl library for this */
62 		ip = "nodeInfo.getAddress();";
63 		name = nodeInfo.getName();
64 		group = nodeInfo.getGroup();
65 		country = nodeInfo.getLocation();
66 		operator = nodeInfo.getContact();
67 
68 		nodeInfoJSON = nodeInfo.getFullJSON().toPrettyString();
69 		
70 		writeln(request);
71 	}
72 	
73 	
74 	//response.writeBody(to!(string)(request));
75 	
76 	Collector collector = d;
77 	
78 	/* Render the template */
79 	response.render!("peerinfo.dt", key, ip, name, group, operator, country, nodeInfoJSON, collector);
80 }
81 
82 void buildinfo(HTTPServerRequest request, HTTPServerResponse response)
83 {
84 	/* Fetch the key */
85 	/* TODO: Validate the key */
86 	string key = request.query["key"];
87 
88 	Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090);
89 	YggdrasilPeer yggPeer = new YggdrasilPeer(testNode);
90 
91 	/* Fetch the node */
92 	YggdrasilNode yggNode = yggPeer.fetchNode(key);
93 
94 	/* Fetch the NodeInfo */
95 	NodeInfo nodeInfo = yggNode.getNodeInfo();
96 	JSONValue nodeinfo = nodeInfo.getFullJSON();
97 
98 	string name = nodeinfo["buildname"].str();
99 	string platform = nodeinfo["buildplatform"].str();
100 	string arch = nodeinfo["buildarch"].str();
101 	string _version = nodeinfo["buildversion"].str();
102 	
103 	//response.writeBody(to!(string)(request));
104 	
105 	
106 	/* Render the template */
107 	response.render!("buildinfo.dt", key, name, platform, arch, _version);
108 }
109 
110 void builddb(HTTPServerRequest request, HTTPServerResponse response)
111 {
112 	/* Render the template */
113 	Collector collector = d;
114 	response.render!("builddb.dt", collector);
115 }
116 
117 void about(HTTPServerRequest request, HTTPServerResponse response)
118 {
119 	/* Render the template */
120 	response.render!("about.dt", app.sourceCodeLink, app.moneroAddress, app._version);
121 }
122 
123 void error(HTTPServerRequest request, HTTPServerResponse response, HTTPServerErrorInfo error)
124 {
125 	/* Render the template */
126 	response.render!("error.dt", error);
127 }
128 
129 
130 /**
131 * API Handler
132 *
133 * This handles all requests in `/api/*`
134 */
135 void apiHandler(HTTPServerRequest request, HTTPServerResponse response)
136 {
137 	JSONValue resp;
138 
139 	/* Path */
140 	writeln(request.path);
141 
142 
143 	resp["name"] = d.getPlatforms();
144 	response.writeBody(resp.toString());
145 }
146 
147 /**
148 * API Handlers below
149 */
150 
151 /**
152 * Handler for `/api/builddb`
153 *
154 * This returns buid information in the format:
155 *
156 * platforms: [
157 				{ name: ' ', count: 0},
158 			],
159 			archs: [
160 				{ name: ' ', count: 0},
161 			],
162 			versions: [
163 				{ name: ' ', count: 0},
164 			],
165 */
166 void getbuilddb(HTTPServerRequest request, HTTPServerResponse response)
167 {
168 	/* JSON response */
169 	JSONValue responseJSON;
170 
171 
172 	/* Get all the platforms */
173 	JSONValue[] platformBlocks;
174 	string[] platforms = d.getPlatforms();
175 	foreach(string platform; platforms)
176 	{
177 		JSONValue platformBlock;
178 		platformBlock["name"] = platform;
179 		platformBlock["count"] = d.getPlatformCount(platform);
180 
181 		platformBlocks ~= platformBlock;
182 	}
183 	responseJSON["platforms"] = platformBlocks;
184 
185 	/* Get all the architectures */
186 	JSONValue[] archBlocks;
187 	string[] archs = d.getArchs();
188 	foreach(string arch; archs)
189 	{
190 		JSONValue archBlock;
191 		archBlock["name"] = arch;
192 		archBlock["count"] = d.getArchCount(arch);
193 
194 		archBlocks ~= archBlock;
195 	}
196 	responseJSON["archs"] = archBlocks;
197 
198 	/* Get all the versions */
199 	JSONValue[] versionBlocks;
200 	string[] versions = d.getVersions();
201 	foreach(string _version; versions)
202 	{
203 		JSONValue versionBlock;
204 		versionBlock["name"] = _version;
205 		versionBlock["count"] = d.getVersionCount(_version);
206 
207 		versionBlocks ~= versionBlock;
208 	}
209 	responseJSON["versions"] = versionBlocks;
210 
211 	writeln(responseJSON);
212 
213 	/* Write back response */
214 	response.writeBody(responseJSON.toString());
215 }
216 
217 void getpeerinfo(HTTPServerRequest request, HTTPServerResponse response)
218 {
219 	/* JSON response */
220 	JSONValue responseJSON;
221 
222 	
223 
224 	/* Fetch the key */
225 	/* TODO: Validate the key */
226 	string key = request.query["key"];
227 
228 	/* Fetch the NodeInfo */
229 	NodeInfo nodeInfo = d.getNodeInfo(key);
230 
231 
232 	if(nodeInfo)
233 	{
234 		/* Set the response */
235 		JSONValue nodeInfoBlock;
236 		nodeInfoBlock["name"] = nodeInfo.getName();
237 		nodeInfoBlock["domain"] = nodeInfo.getGroup();
238 		nodeInfoBlock["location"] = nodeInfo.getLocation();
239 		nodeInfoBlock["contact"] = nodeInfo.getContact();
240 		nodeInfoBlock["nodeinfo"] = nodeInfo.getFullJSON();
241 		responseJSON["response"] = nodeInfoBlock;
242 		
243 		
244 
245 		if(nodeInfo.isWellFormed())
246 		{
247 			
248 			
249 			
250 			
251 
252 			responseJSON["status"] = "ok";
253 		}
254 		else
255 		{
256 			responseJSON["status"] = "malformed";
257 		}
258 	}
259 	else
260 	{
261 		responseJSON["status"] = "timeout";
262 	}
263 
264 	/* Write back response */
265 	response.writeBody(responseJSON.toString());
266 }
267 
268 /**
269 * Checks if a node is online
270 *
271 * /api/pingnode?key=<key>
272 */
273 void pingnode(HTTPServerRequest request, HTTPServerResponse response)
274 {
275 	/* JSON response */
276 	JSONValue responseJSON;
277 
278 	/* Fetch the key */
279 	/* TODO: Validate the key */
280 	string key = request.query["key"];
281 
282 	Address testNode = parseAddress("201:6c56:f9d5:b7a5:8f42:b1ab:9e0e:5169", 9090);
283 	YggdrasilPeer yggPeer = new YggdrasilPeer(testNode);
284 
285 	/* Fetch the node */
286 	YggdrasilNode yggNode = yggPeer.fetchNode(key);
287 
288 	/* Ping the node */
289 	responseJSON["online"] = yggNode.ping();
290 
291 	/* Write the response */
292 	response.writeBody(responseJSON.toString());
293 }