Merge pull request !26 from sx1989827/sunxin
This commit is contained in:
sx1989827 2021-11-21 13:58:37 +00:00 committed by Gitee
commit ba301b3e19
13 changed files with 519 additions and 66 deletions

View File

@ -6,10 +6,13 @@ export interface ICommon_Model_Project_Member {
modified_time :Date,
project_id :string ,
member_id :string ,
type:number
type:ECommon_Model_Project_Member_Type
}
export const Table_Project_Member="project_member"
export enum ECommon_Model_Project_Member_Type {
USER,
TEAM
}
class ProjectMemberModel extends BaseModel {
table=Table_Project_Member

View File

@ -1,14 +1,15 @@
import { ECommon_Model_Project_Member_Type } from '../model/project_member';
import { Permission_Types } from '../permission/permission';
import { ICommon_Model_Project } from './../model/project';
import { ICommon_Model_Project_Module } from './../model/project_module';
import { ECommon_Services } from './../types';
import { ECommon_Route_Res_Project_Member_Type, ICommon_RouteRes_Project_ListTag, ICommon_Route_Res_Project_CreateModule_Data, ICommon_Route_Res_Project_Member } from './response';
import { ICommon_Route_Res_Project_CreateModule_Data, ICommon_Route_Res_Project_ListMemeber, ICommon_Route_Res_Project_ListTag } from './response';
import { ECommon_HttpApi_Method } from "./types";
const api={
baseUrl:"/project",
service:ECommon_Services.Cooperation,
routes:{
basic:{
basic:{//项目基本信息
method:ECommon_HttpApi_Method.GET,
path:"/basic",
req:<{
@ -17,7 +18,7 @@ const api={
res:<ICommon_Model_Project>{},
permission:[Permission_Types.Project.READ]
},
create:{
create:{//创建项目
method:ECommon_HttpApi_Method.POST,
path:"/create",
req:<{
@ -28,7 +29,7 @@ const api={
}>{},
res:<ICommon_Model_Project>{}
},
edit:{
edit:{//编辑项目
method:ECommon_HttpApi_Method.PUT,
path:"/edit",
req:<{
@ -40,7 +41,15 @@ const api={
}>{},
res:<ICommon_Model_Project>{}
},
listTag:{
remove:{//删除项目
method:ECommon_HttpApi_Method.DELETE,
path:"/remove",
req:<{
projectId:string
}>{},
res:{}
},
listTag:{//tag列表
method:ECommon_HttpApi_Method.GET,
path:"/tag/list",
req:<{
@ -49,9 +58,9 @@ const api={
size:number,
keyword:string
}>{},
res:<ICommon_RouteRes_Project_ListTag>{}
res:<ICommon_Route_Res_Project_ListTag>{}
},
createTag:{
createTag:{//创建tag
method:ECommon_HttpApi_Method.POST,
path:"/tag/item",
req:<{
@ -63,7 +72,7 @@ const api={
name:string
}>{}
},
editTag:{
editTag:{//编辑tag
method:ECommon_HttpApi_Method.PUT,
path:"/tag/item",
req:<{
@ -75,7 +84,7 @@ const api={
name:string
}>{}
},
removeTag:{
removeTag:{//删除tag
method:ECommon_HttpApi_Method.DELETE,
path:"/tag/item",
req:<{
@ -83,7 +92,7 @@ const api={
}>{},
res:{}
},
listModule:{
listModule:{//module列表
method:ECommon_HttpApi_Method.GET,
path:"/module/list",
req:<{
@ -91,7 +100,7 @@ const api={
}>{},
res:<ICommon_Route_Res_Project_CreateModule_Data[]>{}
},
createModule:{
createModule:{//创建module
method:ECommon_HttpApi_Method.POST,
path:"/module/item",
req:<{
@ -101,7 +110,7 @@ const api={
}>{},
res:<ICommon_Model_Project_Module>{}
},
editModule:{
editModule:{//编辑module
method:ECommon_HttpApi_Method.PUT,
path:"/module/item",
req:<{
@ -111,7 +120,7 @@ const api={
}>{},
res:<ICommon_Model_Project_Module>{}
},
removeModule:{
removeModule:{//删除module
method:ECommon_HttpApi_Method.DELETE,
path:"/module/item",
req:<{
@ -119,31 +128,28 @@ const api={
}>{},
res:{}
},
listMember:{
listMember:{//成员列表
method:ECommon_HttpApi_Method.GET,
path:"/member/list",
req:<{
projectId:string,
keyword:string
}>{},
res:<{
totalPage:number,
page:number,
data:ICommon_Route_Res_Project_Member[]
}>{}
size:number
}>{},
res:<ICommon_Route_Res_Project_ListMemeber>{}
},
addMember:{
addMember:{//添加成员(用户,团队)
method:ECommon_HttpApi_Method.POST,
path:"/member/item",
req:<{
projectId:string,
memberId:string,
type:ECommon_Route_Res_Project_Member_Type,
type:ECommon_Model_Project_Member_Type,
roleId:string
}>{},
res:{}
},
editMember:{
editMember:{//编辑成员
method:ECommon_HttpApi_Method.PUT,
path:"/member/item",
req:<{
@ -153,7 +159,7 @@ const api={
}>{},
res:{}
},
removeMember:{
removeMember:{//删除成员
method:ECommon_HttpApi_Method.DELETE,
path:"/member/item",
req:<{

View File

@ -1,3 +1,4 @@
import { ECommon_Model_Project_Member_Type } from './../model/project_member';
export interface ICommon_Route_Res_Project_CreateModule_Data {
id:string,
@ -5,27 +6,28 @@ export interface ICommon_Route_Res_Project_CreateModule_Data {
data:ICommon_Route_Res_Project_CreateModule_Data[]
}
export enum ECommon_Route_Res_Project_Member_Type {
User,
Team
}
export type ICommon_Route_Res_Project_Member = {
id:string,
photo:string,
name:string
type:ECommon_Route_Res_Project_Member_Type,
type:ECommon_Model_Project_Member_Type,
role:{
id:string,
name:string
}
}
export type ICommon_RouteRes_Project_ListTag = {
export type ICommon_Route_Res_Project_ListTag = {
totalPage:number,
page:number,
data:{
id:string,
name:string
}[]
}
export type ICommon_Route_Res_Project_ListMemeber ={
totalPage:number,
page:number,
data:ICommon_Route_Res_Project_Member[]
}

View File

@ -6,7 +6,7 @@ const api={
baseUrl:"/team",
service:ECommon_Services.User,
routes:{
create:{
create:{//创建团队
method:ECommon_HttpApi_Method.POST,
path:"/item",
req:<{
@ -14,7 +14,7 @@ const api={
}>{},
res:<ICommon_Model_Team>{}
},
info:{
info:{//团队信息
method:ECommon_HttpApi_Method.GET,
path:"/item",
req:<{
@ -22,7 +22,7 @@ const api={
}>{},
res:<ICommon_Model_Team>{}
},
update:{
update:{//更新团队信息
method:ECommon_HttpApi_Method.PUT,
path:"/item",
req:<{
@ -31,7 +31,7 @@ const api={
}>{},
res:<ICommon_Model_Team>{}
},
remove:{
remove:{//删除团队
method:ECommon_HttpApi_Method.DELETE,
path:"/item",
req:<{
@ -39,7 +39,7 @@ const api={
}>{},
res:{}
},
members:{
members:{//团队成员列表
method:ECommon_HttpApi_Method.GET,
path:"/members",
req:<{
@ -52,7 +52,7 @@ const api={
role:Omit<ICommon_Model_Team_Role,"team_id">
}[]>{}
},
addMember:{
addMember:{//添加团队成员
method:ECommon_HttpApi_Method.POST,
path:"/add_member",
req:<{
@ -62,7 +62,7 @@ const api={
}>{},
res:{}
},
removeMember:{
removeMember:{//删除团队成员
method:ECommon_HttpApi_Method.DELETE,
path:"/remove_member",
req:<{
@ -71,7 +71,7 @@ const api={
}>{},
res:{}
},
changeRole:{
changeRole:{//修改团队成员权限
method:ECommon_HttpApi_Method.PUT,
path:"/role",
req:<{
@ -81,7 +81,7 @@ const api={
}>{},
res:{}
},
roles:{
roles:{//团队权限列表
method:ECommon_HttpApi_Method.GET,
path:"/roles",
req:<{

View File

@ -5,7 +5,7 @@ const api={
baseUrl:"/user",
service:ECommon_Services.User,
routes:{
login:{
login:{//用户登录
method:ECommon_HttpApi_Method.POST,
path:"/login",
req:<{
@ -15,7 +15,7 @@ const api={
res:<Omit<ICommon_Model_User,"password">>{},
ignoreValidate:true
},
checkUser:{
checkUser:{//检查用户是否可用
method:ECommon_HttpApi_Method.GET,
path:"/check_user",
req:<{
@ -24,13 +24,13 @@ const api={
res:<boolean>{},
ignoreValidate:true
},
logout:{
logout:{//登出
method:ECommon_HttpApi_Method.POST,
path:"/logout",
req:{},
res:{},
},
loginAdmin:{
loginAdmin:{//管理员登录
method:ECommon_HttpApi_Method.POST,
path:"/admin_login",
req:<{
@ -40,25 +40,25 @@ const api={
res:<Omit<ICommon_Model_User,"password">>{},
ignoreValidate:true
},
logoutAdmin:{
logoutAdmin:{//管理员登出
method:ECommon_HttpApi_Method.POST,
path:"/admin_logout",
req:{},
res:{},
},
refresh:{
refresh:{//刷新用户信息
method:ECommon_HttpApi_Method.GET,
path:"/refresh",
req:{},
res:<Omit<ICommon_Model_User,"password">>{},
},
update:{
update:{//更新用户信息
method:ECommon_HttpApi_Method.PUT,
path:"/item",
req:<Partial<Omit<ICommon_Model_User,"id" | "password" | "created_time" | "modified_time">>>{},
res:<Omit<ICommon_Model_User,"password">>{},
},
create:{
create:{//创建用户
method:ECommon_HttpApi_Method.POST,
path:"/item",
req:<Partial<Omit<ICommon_Model_User,"id" | "created_time" | "modified_time">> & {
@ -67,13 +67,13 @@ const api={
}>{},
res:<Omit<ICommon_Model_User,"password">>{}
},
remove:{
remove:{//删除用户
method:ECommon_HttpApi_Method.DELETE,
path:"/item",
req:{},
res:{},
},
active:{
active:{//禁用、启用用户
method:ECommon_HttpApi_Method.PUT,
path:"/active",
req:<{

View File

@ -81,6 +81,16 @@ export namespace Err {
code:3200,
msg:"module not found"
}
},
Member:{
memberExists:{
code:3300,
msg:"member exists"
},
memberNotExists:{
code:3301,
msg:"member not exists"
}
}
}
export let Team = {

View File

@ -134,7 +134,10 @@ export function generateCreateSql<T extends BaseModel>(model:T,obj:{
export function generateQuerySql<T extends BaseModel,K1 extends keyof T["model"]>(model:T,columns:K1[],objExpr?:{
[param in keyof T["model"]]?:EXPRVALUE
},exprMode?:"and"|"or",limit?:number,size?:number):{
},exprMode?:"and"|"or",order?:{
filed:K1,
type:"asc"|"desc"
},limit?:number,size?:number):{
value:string,
type:{
[key in Extract<keyof T["model"],K1>]:T["model"][key]
@ -148,7 +151,7 @@ export function generateQuerySql<T extends BaseModel,K1 extends keyof T["model"]
}
let expr=generateExp(objExpr,exprMode);
return {
value:`select ${column} from ${model.table}${expr?(" where "+expr):""}${limit!==undefined?` limit ${limit},${size}`:""}`,
value:`select ${column} from ${model.table}${expr?(" where "+expr):""}${limit!==undefined?` limit ${limit},${size}`:""}${order?` order by ${order.filed} ${order.type}`:""}`,
type:model.model
}
}
@ -227,7 +230,11 @@ export function generateLeftJoinSql<T1 extends BaseModel,T2 extends BaseModel,K1
value:EXPRVALUE,
model:T1|T2
}
},exprMode?:"and"|"or"):{
},exprMode?:"and"|"or",order?:{
filed:keyof (T1["model"] & T2["model"]),
model:T1|T2
type:"asc"|"desc"
},limit?:number,size?:number):{
value:string,
type:(F1 extends null ? Rename<{
[key in K1]:T1["model"][key]
@ -276,7 +283,7 @@ export function generateLeftJoinSql<T1 extends BaseModel,T2 extends BaseModel,K1
aggregation[table]=mainModel.aggregation??""
aggregation[joinTable]=joinModel.aggregation??""
return {
value:`select ${column} from ${table} left join ${joinTable} on ${expression} ${expr?(" where "+expr):""}`,
value:`select ${column} from ${table} left join ${joinTable} on ${expression} ${expr?(" where "+expr):""}${order?` order by ${order.model.table}.${order.filed} ${order.type}`:""}${limit!==undefined?` limit ${limit},${size}`:""}`,
type:null,
aggregation:aggregation
}
@ -325,7 +332,11 @@ export function generateLeftJoin2Sql<T1 extends BaseModel,T2 extends BaseModel,T
value:EXPRVALUE,
model:T1|T2|T3
}
},exprMode?:"and"|"or"):{
},exprMode?:"and"|"or",order?:{
filed:keyof(T1["model"] & T2["model"] & T3["model"]),
model:T1 | T2 | T3,
type:"asc"|"desc"
},limit?:number,size?:number):{
value:string,
type:(F1 extends null ? Rename<{
[key in K1]:T1["model"][key]
@ -392,7 +403,157 @@ export function generateLeftJoin2Sql<T1 extends BaseModel,T2 extends BaseModel,T
aggregation[joinTable]=joinModel.aggregation??""
aggregation[joinTable2]=joinModel2.aggregation??""
return {
value:`select ${column} from ${table} left join ${joinTable} on ${expression} left join ${joinTable2} on ${expression2} ${expr?(" where "+expr):""}`,
value:`select ${column} from ${table} left join ${joinTable} on ${expression} left join ${joinTable2} on ${expression2} ${expr?(" where "+expr):""}${order?` order by ${order.model.table}.${order.filed} ${order.type}`:""}${limit!==undefined?` limit ${limit},${size}`:""}`,
type:null,
aggregation:aggregation
}
}
export function generateLeftJoin3Sql<T1 extends BaseModel,T2 extends BaseModel,T3 extends BaseModel,T4 extends BaseModel,K1 extends keyof T1["model"]=null,K2 extends keyof T2["model"]=null,K3 extends keyof T3["model"]=null,K4 extends keyof T4["model"]=null,F1 extends string=null,F2 extends string=null,F3 extends string=null,F4 extends string=null,R1 extends K1=null,RR1 extends string=null,R2 extends K2=null,RR2 extends string=null,R3 extends K3=null,RR3 extends string=null,R4 extends K4=null,RR4 extends string=null>(mainModel:{
model:T1,
columns?:K1[],
aggregation?:F1,
rename?:{
fields:R1[],
newFields:RR1[]
}
},joinModel:{
model:T2,
columns?:K2[],
rename?:{
fields:R2[],
newFields:RR2[]
}
aggregation?:F2,
expression:{
[key in keyof T2["model"]]?:{
model:T1|T3|T4,
filed:keyof (T1 & T3 & T4)["model"]
}
}
},joinModel2:{
model:T3,
columns?:K3[],
aggregation?:F3,
rename?:{
fields:R3[],
newFields:RR3[]
}
expression:{
[key in keyof T3["model"]]?:{
model:T1|T2|T4,
filed:keyof (T1 & T2 & T4)["model"]
}
}
},joinModel3:{
model:T4,
columns?:K4[],
aggregation?:F4,
rename?:{
fields:R4[],
newFields:RR4[]
}
expression:{
[key in keyof T4["model"]]?:{
model:T1|T2|T3,
filed:keyof (T1 & T2 & T3)["model"]
}
}
},objExpr?:{
[param in keyof (T1 & T2 & T3 & T4)["model"]]?:{
value:EXPRVALUE,
model:T1|T2|T3|T3
}
},exprMode?:"and"|"or",order?:{
filed:keyof(T1["model"] & T2["model"] & T3["model"] & T4["model"]),
model:T1 | T2 | T3 | T4,
type:"asc"|"desc"
},limit?:number,size?:number):{
value:string,
type:(F1 extends null ? Rename<{
[key in K1]:T1["model"][key]
},R1,RR1>:{
[key in F1]:Rename<{
[key in K1]:T1["model"][key]
},R1,RR1>
}) & (F2 extends null ? Rename<{
[key in K2]:T2["model"][key]
},R2,RR2>:{
[key in F2]:Rename<{
[key in K2]:T2["model"][key]
},R2,RR2>
}) & (F3 extends null ? Rename<{
[key in K3]:T3["model"][key]
},R3,RR3>:{
[key in F3]:Rename<{
[key in K3]:T3["model"][key]
},R3,RR3>
}) & (F4 extends null ? Rename<{
[key in K4]:T4["model"][key]
},R4,RR4>:{
[key in F4]:Rename<{
[key in K4]:T4["model"][key]
},R4,RR4>
}),
aggregation:{
[key:string]:string
}
} {
let expr=generateLeftJoinExp(objExpr,exprMode);
let table=mainModel.model.table
let joinTable=joinModel.model.table
let joinTable2=joinModel2.model.table
let joinTable3=joinModel3.model.table
let key=Object.keys(joinModel.expression)[0]
let value=joinModel.expression[key]
let key2=Object.keys(joinModel2.expression)[0]
let value2=joinModel2.expression[key]
let key3=Object.keys(joinModel3.expression)[0]
let value3=joinModel3.expression[key]
let expression=`${joinTable}.${key}=${value.model.table}.${value.filed}`
let expression2=`${joinTable2}.${key2}=${value2.model.table}.${value2.filed}`
let expression3=`${joinTable3}.${key3}=${value3.model.table}.${value3.filed}`
let rename=mainModel.rename
let renameJoin=joinModel.rename
let renameJoin2=joinModel2.rename
let renameJoin3=joinModel3.rename
let aggregation={}
let column=""
if(mainModel.columns && mainModel.columns.length>0) {
let str=mainModel.columns.map((item)=>{
return `${table}.${item} _${table}__${(rename && rename.fields.includes(item as any))?rename.newFields[rename.fields.indexOf(item as any)]:item}`
}).join(",")
column+=str;
}
if(joinModel.columns && joinModel.columns.length>0) {
let str=joinModel.columns.map((item)=>{
return `${joinTable}.${item} _${joinTable}__${(renameJoin && renameJoin.fields.includes(item as any))?renameJoin.newFields[renameJoin.fields.indexOf(item as any)]:item}`
}).join(",")
column+=","+str;
}
if(joinModel2.columns && joinModel2.columns.length>0) {
let str=joinModel2.columns.map((item)=>{
return `${joinTable2}.${item} _${joinTable2}__${(renameJoin2 && renameJoin2.fields.includes(item as any))?renameJoin2.newFields[renameJoin2.fields.indexOf(item as any)]:item}`
}).join(",")
column+=","+str;
}
if(joinModel3.columns && joinModel3.columns.length>0) {
let str=joinModel3.columns.map((item)=>{
return `${joinTable3}.${item} _${joinTable3}__${(renameJoin3 && renameJoin3.fields.includes(item as any))?renameJoin3.newFields[renameJoin3.fields.indexOf(item as any)]:item}`
}).join(",")
column+=","+str;
}
column=column.trim()
if(column[0]==",")
{
column=column.substr(1)
}
aggregation[table]=mainModel.aggregation??""
aggregation[joinTable]=joinModel.aggregation??""
aggregation[joinTable2]=joinModel2.aggregation??""
aggregation[joinTable3]=joinModel3.aggregation??""
return {
value:`select ${column} from ${table} left join ${joinTable} on ${expression} left join ${joinTable2} on ${expression2} left join ${joinTable3} on ${expression3} ${expr?(" where "+expr):""}${order?` order by ${order.model.table}.${order.filed} ${order.type}`:""}${limit!==undefined?` limit ${limit},${size}`:""}`,
type:null,
aggregation:aggregation
}

View File

@ -1,3 +1,4 @@
import { ECommon_Model_Project_Member_Type } from "../../../common/model/project_member";
import * as projectApi from "../../../common/routes/project";
import { Err } from "../../../common/status/error";
import { DHttpApi, DHttpReqParam, DHttpReqParamRequired, DHttpUser } from "../../common/http/http";
@ -41,5 +42,55 @@ class ProjectController {
return ret;
}
@DHttpApi(projectApi.routes.remove)
async removeProject(@DHttpReqParamRequired("projectId") projectId:string):Promise<typeof projectApi.routes.remove.res>{
let obj=await ProjectService.getItemById(projectId);
if(!obj) {
throw Err.Project.projectNotFound
}
await obj.delete()
return
}
@DHttpApi(projectApi.routes.listMember)
async listMember(@DHttpReqParamRequired("projectId") projectId:string,@DHttpReqParamRequired("page") page:number,@DHttpReqParamRequired("size") size:number):Promise<typeof projectApi.routes.listMember.res>{
let obj=await ProjectService.getItemById(projectId);
if(!obj) {
throw Err.Project.projectNotFound
}
let ret=await obj.listMember(page,size)
return ret;
}
@DHttpApi(projectApi.routes.addMember)
async addMember(@DHttpReqParamRequired("projectId") projectId:string,@DHttpReqParamRequired("memberId") memberId:string,@DHttpReqParamRequired("type") type:ECommon_Model_Project_Member_Type,@DHttpReqParamRequired("roleId") roleId:string):Promise<typeof projectApi.routes.addMember.res>{
let obj=await ProjectService.getItemById(projectId);
if(!obj) {
throw Err.Project.projectNotFound
}
await obj.addMember(memberId,type,roleId)
return
}
@DHttpApi(projectApi.routes.editMember)
async editMember(@DHttpReqParamRequired("projectId") projectId:string,@DHttpReqParamRequired("memberId") memberId:string,@DHttpReqParamRequired("roleId") roleId:string):Promise<typeof projectApi.routes.editMember.res>{
let obj=await ProjectService.getItemById(projectId);
if(!obj) {
throw Err.Project.projectNotFound
}
await obj.editMember(memberId,roleId);
return
}
@DHttpApi(projectApi.routes.removeMember)
async removeMember(@DHttpReqParamRequired("projectId") projectId:string,@DHttpReqParamRequired("memberId") memberId:string):Promise<typeof projectApi.routes.removeMember.res>{
let obj=await ProjectService.getItemById(projectId);
if(!obj) {
throw Err.Project.projectNotFound
}
await obj.removeMember(memberId)
return
}
}
export default new ProjectController

View File

@ -70,5 +70,14 @@ class ModuleMapper extends Mapper<typeof projectModuleModel> {
}
}
}
async deleteByProjectId(projectId:string) {
if(!projectId) {
throw Err.Project.Module.moduleNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(projectModuleModel,{
project_id:projectId
}))
}
}
export let moduleMapper=new ModuleMapper

View File

@ -1,9 +1,181 @@
import { projectModel } from '../../../common/model/project';
import { Err } from '../../../common/status/error';
import { getMysqlInstance } from '../../common/db/mysql';
import { Mapper } from "../../common/entity/mapper";
;
import { generateCreateSql, generateDeleteSql, generateLeftJoin3Sql, generateQuerySql, generateSnowId, generateUpdateSql } from '../../common/util/sql';
import { ECommon_Model_Project_Member_Type, projectMemberModel, Table_Project_Member } from './../../../common/model/project_member';
import { projectRoleModel } from './../../../common/model/project_role';
import { teamModel } from './../../../common/model/team';
import { userModel } from './../../../common/model/user';
import { ICommon_Route_Res_Project_ListMemeber } from './../../../common/routes/response';
class ProjectMapper extends Mapper<typeof projectModel>{
constructor(){
super(projectModel)
}
async listMember(projectId:string,page:number,size:number):Promise<ICommon_Route_Res_Project_ListMemeber> {
if(!projectId || page===undefined || page<0 || size===undefined || size<=0) {
throw Err.Common.paramError
}
let mysql=getMysqlInstance()
let data:ICommon_Route_Res_Project_ListMemeber["data"]=[];
let count=await mysql.executeOne<number>(`select count(1) from ${Table_Project_Member} where project_id='${projectId}'`)
if(count>0) {
let sql=generateLeftJoin3Sql({
model:projectMemberModel,
columns:["member_id","type"],
rename:{
fields:["member_id"],
newFields:["id"]
}
},{
model:projectRoleModel,
columns:["id","name"],
expression:{
id:{
model:projectMemberModel,
filed:"role_id"
}
},
aggregation:"role"
},{
model:userModel,
columns:["id","username","photo"],
expression:{
id:{
model:projectMemberModel,
filed:"member_id"
}
},
aggregation:"user",
rename:{
fields:["username"],
newFields:["name"]
}
},{
model:teamModel,
columns:["id","name","photo"],
expression:{
id:{
model:projectMemberModel,
filed:"member_id"
}
},
aggregation:"team"
},{
project_id:{
model:projectMemberModel,
value:projectId
}
},"and",{
filed:"created_time",
model:projectMemberModel,
type:"desc"
},page*size,size)
let ret=await mysql.execute(sql)
for(let obj of ret){
let o=<typeof data[0]>{};
o.id=obj.id;
o.type=obj.type;
o.role=obj.role;
if(obj.user.id){
o.name=obj.user.name;
o.photo=obj.user.photo;
} else {
o.name=obj.team.name;
o.photo=obj.team.photo;
}
data.push(o)
}
}
return {
totalPage:count,
page:page,
data:data
}
}
async addMember(projectId:string,memberId:string,type:ECommon_Model_Project_Member_Type,roleId:string) {
if(!projectId) {
throw Err.Project.projectNotFound
} else if(!memberId) {
throw Err.User.userIdNotExists
} else if(!roleId) {
throw Err.Role.roleNotFound
}
let mysql=getMysqlInstance()
let existsMemeber=await mysql.executeOne(generateQuerySql(projectMemberModel,[],{
member_id:memberId,
project_id:projectId
}))
if(existsMemeber) {
throw Err.Project.Member.memberExists
}
let existsRole=await mysql.executeOne(generateQuerySql(projectRoleModel,[],{
id:roleId
}))
if(!existsRole) {
throw Err.Role.roleNotExists
}
await mysql.execute(generateCreateSql(projectMemberModel,{
member_id:memberId,
role_id:roleId,
project_id:projectId,
type:type,
id:await generateSnowId()
}))
}
async removeMember(projectId:string,memberId:string) {
if(!projectId) {
throw Err.Project.projectNotFound
} else if(!memberId) {
throw Err.Project.Member.memberNotExists
}
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(projectMemberModel,{
project_id:projectId,
member_id:memberId
}))
}
async changeRole(projectId:string,memberId:string,roleId:string) {
if(!projectId) {
throw Err.Project.projectNotFound
} else if(!memberId) {
throw Err.Project.Member.memberNotExists
} else if(!roleId) {
throw Err.Role.roleNotFound
}
let mysql=getMysqlInstance()
let existsMemeber=await mysql.executeOne(generateQuerySql(projectMemberModel,[],{
member_id:memberId,
project_id:projectId
}))
if(!existsMemeber) {
throw Err.Project.Member.memberNotExists
}
let existsRole=await mysql.executeOne(generateQuerySql(projectRoleModel,[],{
id:roleId
}))
if(!existsRole) {
throw Err.Role.roleNotExists
}
await mysql.execute(generateUpdateSql(projectMemberModel,{
member_id:memberId,
project_id:projectId
},{
role_id:roleId
}))
}
async clearMember(projectId:string) {
if(!projectId) {
throw Err.Project.projectNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(projectMemberModel,{
project_id:projectId
}))
}
}
export let projectMapper=new ProjectMapper
export let projectMapper=new ProjectMapper

View File

@ -1,14 +1,14 @@
import { ICommon_RouteRes_Project_ListTag } from "../../../common/routes/response";
import { ICommon_Route_Res_Project_ListTag } from "../../../common/routes/response";
import { Err } from "../../../common/status/error";
import { getMysqlInstance } from "../../common/db/mysql";
import { Mapper } from "../../common/entity/mapper";
import { generateQuerySql } from '../../common/util/sql';
import { generateDeleteSql, generateQuerySql } from '../../common/util/sql';
import { projectLabelModel, Table_Project_Label } from './../../../common/model/project_label';
class TagMapper extends Mapper<typeof projectLabelModel> {
constructor() {
super(projectLabelModel)
}
async listTag(projectId:string,page:number,size:number,keyword:string):Promise<ICommon_RouteRes_Project_ListTag> {
async listTag(projectId:string,page:number,size:number,keyword?:string):Promise<ICommon_Route_Res_Project_ListTag> {
if(!projectId || page===undefined || page<0 || size===undefined || size<=0) {
throw Err.Common.paramError
}
@ -22,8 +22,11 @@ class TagMapper extends Mapper<typeof projectLabelModel> {
name:{
exp:"%like%",
value:keyword
}})
}))
}}),
},"and",{
filed:"name",
type:"asc"
},page*size,size))
}
return {
totalPage:count,
@ -31,5 +34,14 @@ class TagMapper extends Mapper<typeof projectLabelModel> {
data:ret
}
}
async deleteByProjectId(projectId:string) {
if(!projectId) {
throw Err.Project.Module.moduleNotFound
}
let mysql=getMysqlInstance()
await mysql.execute(generateDeleteSql(projectLabelModel,{
project_id:projectId
}))
}
}
export let tagMapper=new TagMapper

View File

@ -1,8 +1,35 @@
import { moduleMapper } from "../mapper/module";
import { Entity } from "../../common/entity/entity";
import { EServer_Common_Event_Types } from "../../common/event/types";
import { projectMapper } from '../mapper/project';
import { projectModel } from './../../../common/model/project';
import { ECommon_Model_Project_Member_Type } from './../../../common/model/project_member';
import { tagMapper } from './../mapper/tag';
export default class Project extends Entity<typeof projectModel,typeof projectMapper> {
constructor(){
super(projectMapper)
}
override async delete(type?:EServer_Common_Event_Types.Types) {
await super.delete(EServer_Common_Event_Types.Project.DELETE)
await moduleMapper.deleteByProjectId(this.item.id)
await tagMapper.deleteByProjectId(this.item.id)
await projectMapper.clearMember(this.item.id);
}
async listMember(page:number,size:number){
let ret=await projectMapper.listMember(this.item.id,page,size);
return ret;
}
async addMember(memberId:string,type:ECommon_Model_Project_Member_Type,roleId:string) {
await projectMapper.addMember(this.item.id,memberId,type,roleId)
}
async removeMember(memberId:string){
await projectMapper.removeMember(this.item.id,memberId)
}
async editMember(memberId:string,roleId:string){
await projectMapper.changeRole(this.item.id,memberId,roleId)
}
}

View File

@ -184,7 +184,7 @@ export default class GateWay extends Application {
ctx.set(key, ret.headers[key]);
}
}
if(typeof(ret.data)=="string" || typeof(ret.data)=="number" || typeof(ret.data)=="boolean" || typeof(ret.data)=="object")
if(ret.data===undefined || typeof(ret.data)=="string" || typeof(ret.data)=="number" || typeof(ret.data)=="boolean" || typeof(ret.data)=="object")
{
ctx.body = generateHttpOkResponse(ret.data);
} else {