1 /**
2 	Copyright: © 2013 rejectedsoftware e.K.
3 	License: Subject to the terms of the GNU GPLv3 license, as written in the included LICENSE.txt file.
4 	Authors: Colden Cullen
5 */
6 module dubregistry.api;
7 
8 import dubregistry.dbcontroller;
9 import dubregistry.registry;
10 
11 import vibe.d;
12 
13 void registerDubRegistryWebApi(URLRouter router, DubRegistry registry)
14 {
15 	auto pkgs = new Packages(registry);
16 	router.registerRestInterface(pkgs, "/api/packages");
17 }
18 
19 interface IPackages {
20 	@path(":name/latest")
21 	string getLatestVersion(string _name);
22 
23 	@path(":name/stats")
24 	Json getStats(string _name);
25 
26 	@path(":name/:version/stats")
27 	Json getStats(string _name, string _version);
28 
29 	@path(":name/info")
30 	Json getInfo(string _name);
31 
32 	@path(":name/:version/info")
33 	Json getInfo(string _name, string _version);
34 }
35 
36 class Packages : IPackages {
37 	private {
38 		DubRegistry m_registry;
39 	}
40 
41 	this(DubRegistry registry)
42 	{
43 		m_registry = registry;
44 	}
45 
46 override {
47 	string getLatestVersion(string name) {
48 		return m_registry.getLatestVersion(rootOf(name))
49 			.check!(r => r.length)(HTTPStatus.notFound, "Package not found");
50 	}
51 
52 	Json getStats(string name) {
53 		return m_registry.getPackageStats(rootOf(name))
54 			.check!(r => r.type != Json.Type.null_)(HTTPStatus.notFound, "Package not found");
55 	}
56 
57 	Json getStats(string name, string ver) {
58 		return m_registry.getPackageStats(rootOf(name), ver)
59 			.check!(r => r.type != Json.Type.null_)(HTTPStatus.notFound, "Package/Version not found");
60 	}
61 
62 	Json getInfo(string name) {
63 		return m_registry.getPackageInfo(rootOf(name))
64 			.check!(r => r.type != Json.Type.null_)(HTTPStatus.notFound, "Package/Version not found");
65 	}
66 
67 	Json getInfo(string name, string ver) {
68 		return m_registry.getPackageVersionInfo(rootOf(name), ver)
69 			.check!(r => r.type != Json.Type.null_)(HTTPStatus.notFound, "Package/Version not found");
70 	}
71 }
72 
73 private:
74 	string rootOf(string pkg) {
75 		import std.algorithm: findSplitBefore;
76 		return pkg.urlDecode().findSplitBefore(":")[0];
77 	}
78 }
79 
80 
81 private	auto ref T check(alias cond, T)(auto ref T t, HTTPStatus status, string msg)
82 {
83 	enforce(cond(t), new HTTPStatusException(status, msg));
84 	return t;
85 }