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 }