SiteApi.hx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package tools.haxelib;
  2. import tools.haxelib.Datas;
  3. import tools.haxelib.SiteDb;
  4. class SiteApi {
  5. var db : neko.db.Connection;
  6. public function new( db ) {
  7. this.db = db;
  8. }
  9. public function search( word : String ) : List<{ name : String }> {
  10. return Project.manager.containing(word);
  11. }
  12. public function infos( project : String ) : ProjectInfos {
  13. var p = Project.manager.search({ name : project }).first();
  14. if( p == null )
  15. throw "No such Project : "+project;
  16. var vl = Version.manager.search({ project : p.id });
  17. var versions = new Array();
  18. for( v in vl )
  19. versions.push({ name : v.name, comments : v.comments, date : v.date });
  20. return {
  21. name : p.name,
  22. curversion : if( p.version == null ) null else p.version.name,
  23. desc : p.description,
  24. versions : versions,
  25. owner : p.owner.name,
  26. website : p.website,
  27. license : p.license,
  28. };
  29. }
  30. public function user( name : String ) : UserInfos {
  31. var u = User.manager.search({ name : name }).first();
  32. if( u == null )
  33. throw "No such user : "+name;
  34. var pl = Project.manager.search({ owner : u.id });
  35. var projects = new Array();
  36. for( p in pl )
  37. projects.push(p.name);
  38. return {
  39. name : u.name,
  40. fullname : u.fullname,
  41. email : u.email,
  42. projects : projects,
  43. };
  44. }
  45. public function register( name : String, pass : String, mail : String, fullname : String ) : Bool {
  46. if( !Datas.alphanum.match(name) )
  47. throw "Invalid user name, please use alphanumeric characters";
  48. if( name.length < 3 )
  49. throw "User name must be at least 3 characters";
  50. var u = new User();
  51. u.name = name;
  52. u.pass = pass;
  53. u.email = mail;
  54. u.fullname = fullname;
  55. u.insert();
  56. return null;
  57. }
  58. public function isNewUser( name : String ) : Bool {
  59. return User.manager.search({ name : name }).first() == null;
  60. }
  61. public function checkDeveloper( prj : String, user : String ) : Void {
  62. var p = Project.manager.search({ name : prj }).first();
  63. if( p == null )
  64. return;
  65. for( d in Developer.manager.search({ project : p.id }) )
  66. if( d.user.name == user )
  67. return;
  68. throw "User '"+user+"' is not a developer of project '"+prj+"'";
  69. }
  70. public function checkPassword( user : String, pass : String ) : Bool {
  71. var u = User.manager.search({ name : user }).first();
  72. return u != null && u.pass == pass;
  73. }
  74. public function getSubmitId() : String {
  75. return Std.string(Std.random(100000000));
  76. }
  77. public function processSubmit( id : String, user : String, pass : String ) : String {
  78. var path = Site.TMP_DIR+"/"+Std.parseInt(id)+".tmp";
  79. var file = try neko.io.File.read(path,true) catch( e : Dynamic ) throw "Invalid file id #"+id;
  80. var zip = try neko.zip.Reader.readZip(file) catch( e : Dynamic ) { file.close(); neko.Lib.rethrow(e); };
  81. file.close();
  82. var infos = Datas.readInfos(zip);
  83. var u = User.manager.search({ name : user }).first();
  84. if( u == null || u.pass != pass )
  85. throw "Invalid username or password";
  86. var devs = infos.developers.map(function(user) {
  87. var u = User.manager.search({ name : user }).first();
  88. if( u == null )
  89. throw "Unknown user '"+user+"'";
  90. return u;
  91. });
  92. var p = Project.manager.search({ name : infos.project }).first();
  93. // create project if needed
  94. if( p == null ) {
  95. p = new Project();
  96. p.name = infos.project;
  97. p.description = infos.desc;
  98. p.website = infos.website;
  99. p.license = infos.license;
  100. p.owner = u;
  101. p.insert();
  102. for( u in devs ) {
  103. var d = new Developer();
  104. d.user = u;
  105. d.project = p;
  106. d.insert();
  107. }
  108. }
  109. // check submit rights
  110. var pdevs = Developer.manager.search({ project : p.id });
  111. var isdev = false;
  112. for( d in pdevs )
  113. if( d.user.id == u.id ) {
  114. isdev = true;
  115. break;
  116. }
  117. if( !isdev )
  118. throw "You are not a developer of this project";
  119. // update public infos
  120. var update = false;
  121. if( infos.desc != p.description || p.website != infos.website || pdevs.length != devs.length ) {
  122. if( u.id != p.owner.id )
  123. throw "Only project owner can modify project infos";
  124. p.description = infos.desc;
  125. p.website = infos.website;
  126. p.update();
  127. if( pdevs.length != devs.length ) {
  128. for( d in pdevs )
  129. d.delete();
  130. for( u in devs ) {
  131. var d = new Developer();
  132. d.user = u;
  133. d.project = p;
  134. d.insert();
  135. }
  136. }
  137. update = true;
  138. neko.FileSystem.deleteFile(path);
  139. return "Project infos updated : submit one more time to send a new version";
  140. }
  141. // check version
  142. var vl = Version.manager.search({ project : p.id });
  143. for( v in vl )
  144. if( v.name == infos.version ) {
  145. neko.FileSystem.deleteFile(path);
  146. return "This version is already commited, please change version number";
  147. }
  148. neko.FileSystem.rename(path,Site.REP_DIR+"/"+Datas.fileName(p.name,infos.version));
  149. var v = new Version();
  150. v.project = p;
  151. v.name = infos.version;
  152. v.comments = infos.versionComments;
  153. v.downloads = 0;
  154. v.date = Date.now().toString();
  155. v.insert();
  156. p.version = v;
  157. p.update();
  158. return "Version "+v.name+" (id#"+v.id+") added";
  159. }
  160. }