mock平台

project.js 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. const yapi = require('../yapi.js');
  2. const baseModel = require('./base.js');
  3. class projectModel extends baseModel {
  4. getName() {
  5. return 'project';
  6. }
  7. constructor(){
  8. super()
  9. this.handleEnvNullData = this.handleEnvNullData.bind(this)
  10. }
  11. getAuthList(uid){
  12. return this.model.find({
  13. $or: [{
  14. 'members.uid': uid,
  15. project_type: 'private'
  16. }, {
  17. uid,
  18. project_type: 'private'
  19. }, {
  20. project_type: 'public'
  21. }]
  22. }).select('group_id')
  23. .exec();
  24. }
  25. getSchema() {
  26. return {
  27. uid: { type: Number, required: true },
  28. name: { type: String, required: true },
  29. basepath: { type: String },
  30. switch_notice: { type: Boolean, default: true },
  31. desc: String,
  32. group_id: { type: Number, required: true },
  33. project_type: { type: String, required: true, enum: ['public', 'private'] },
  34. members: [
  35. {
  36. uid: Number,
  37. role: { type: String, enum: ['owner', 'dev'] },
  38. username: String,
  39. email: String,
  40. email_notice: { type: Boolean, default: true }
  41. }
  42. ],
  43. env: [{ name: String, domain: String, header: Array, global: [{
  44. name: String,
  45. value: String
  46. }] }],
  47. icon: String,
  48. color: String,
  49. add_time: Number,
  50. up_time: Number,
  51. pre_script: String,
  52. after_script: String,
  53. project_mock_script: String,
  54. is_mock_open: { type: Boolean, default: false },
  55. strice: { type: Boolean, default: false },
  56. is_json5: { type: Boolean, default: true },
  57. tag: [{name: String, desc: String}]
  58. };
  59. }
  60. updateMember(data) {
  61. return this.model.update(
  62. {
  63. 'members.uid': data.uid
  64. },
  65. {
  66. $set: {
  67. 'members.$.username': data.username,
  68. 'members.$.email': data.email
  69. }
  70. }
  71. );
  72. }
  73. save(data) {
  74. let m = new this.model(data);
  75. return m.save();
  76. }
  77. handleEnvNullData(data){
  78. data = data.toObject();
  79. data.toObject = ()=> data;
  80. let isFix = false;
  81. if(Array.isArray(data.env)){
  82. data.env = data.env.map(item=>{
  83. item.global = item.global.filter(g=>{
  84. if(!g || typeof g !== 'object'){
  85. isFix = true;
  86. return false;
  87. }
  88. return true;
  89. })
  90. return item;
  91. })
  92. }
  93. if(isFix){
  94. this.model.update(
  95. {
  96. _id: data._id
  97. },
  98. {
  99. $set: { env: data.env }
  100. },
  101. { runValidators: true }
  102. );
  103. }
  104. return data;
  105. }
  106. get(id) {
  107. return this.model
  108. .findOne({
  109. _id: id
  110. })
  111. .exec().then(this.handleEnvNullData)
  112. }
  113. getByEnv(id) {
  114. return this.model
  115. .findOne({
  116. _id: id
  117. })
  118. .select('env')
  119. .exec().then(this.handleEnvNullData);
  120. }
  121. getProjectWithAuth(group_id, uid) {
  122. return this.model.countDocuments({
  123. group_id: group_id,
  124. 'members.uid': uid
  125. });
  126. }
  127. getBaseInfo(id, select) {
  128. select =
  129. select ||
  130. '_id uid name basepath switch_notice desc group_id project_type env icon color add_time up_time pre_script after_script project_mock_script is_mock_open strice is_json5 tag';
  131. return this.model
  132. .findOne({
  133. _id: id
  134. })
  135. .select(select)
  136. .exec().then(this.handleEnvNullData);
  137. }
  138. getByDomain(domain) {
  139. return this.model
  140. .find({
  141. prd_host: domain
  142. })
  143. .exec().then(this.handleEnvNullData);
  144. }
  145. checkNameRepeat(name, groupid) {
  146. return this.model.countDocuments({
  147. name: name,
  148. group_id: groupid
  149. });
  150. }
  151. checkDomainRepeat(domain, basepath) {
  152. return this.model.countDocuments({
  153. prd_host: domain,
  154. basepath: basepath
  155. });
  156. }
  157. list(group_id) {
  158. let params = { group_id: group_id };
  159. return this.model
  160. .find(params)
  161. .select(
  162. '_id uid name basepath switch_notice desc group_id project_type color icon env add_time up_time'
  163. )
  164. .sort({ _id: -1 })
  165. .exec();
  166. }
  167. // 获取项目数量统计
  168. getProjectListCount() {
  169. return this.model.countDocuments();
  170. }
  171. countWithPublic(group_id) {
  172. let params = { group_id: group_id, project_type: 'public' };
  173. return this.model.countDocuments(params);
  174. }
  175. listWithPaging(group_id, page, limit) {
  176. page = parseInt(page);
  177. limit = parseInt(limit);
  178. return this.model
  179. .find({
  180. group_id: group_id
  181. })
  182. .sort({ _id: -1 })
  183. .skip((page - 1) * limit)
  184. .limit(limit)
  185. .exec();
  186. }
  187. listCount(group_id) {
  188. return this.model.countDocuments({
  189. group_id: group_id
  190. });
  191. }
  192. countByGroupId(group_id) {
  193. return this.model.countDocuments({
  194. group_id: group_id
  195. });
  196. }
  197. del(id) {
  198. return this.model.remove({
  199. _id: id
  200. });
  201. }
  202. delByGroupid(groupId) {
  203. return this.model.remove({
  204. group_id: groupId
  205. });
  206. }
  207. up(id, data) {
  208. data.up_time = yapi.commons.time();
  209. return this.model.update(
  210. {
  211. _id: id
  212. },
  213. data,
  214. { runValidators: true }
  215. );
  216. }
  217. addMember(id, data) {
  218. return this.model.update(
  219. {
  220. _id: id
  221. },
  222. {
  223. // $push: { members: data }
  224. $push: { members: { $each: data } }
  225. }
  226. );
  227. }
  228. delMember(id, uid) {
  229. return this.model.update(
  230. {
  231. _id: id
  232. },
  233. {
  234. $pull: { members: { uid: uid } }
  235. }
  236. );
  237. }
  238. checkMemberRepeat(id, uid) {
  239. return this.model.countDocuments({
  240. _id: id,
  241. 'members.uid': uid
  242. });
  243. }
  244. changeMemberRole(id, uid, role) {
  245. return this.model.update(
  246. {
  247. _id: id,
  248. 'members.uid': uid
  249. },
  250. {
  251. $set: { 'members.$.role': role }
  252. }
  253. );
  254. }
  255. changeMemberEmailNotice(id, uid, notice) {
  256. return this.model.update(
  257. {
  258. _id: id,
  259. 'members.uid': uid
  260. },
  261. {
  262. $set: { 'members.$.email_notice': notice }
  263. }
  264. );
  265. }
  266. search(keyword) {
  267. return this.model
  268. .find({
  269. name: new RegExp(keyword, 'ig')
  270. })
  271. .limit(10);
  272. }
  273. }
  274. module.exports = projectModel;