mirror of
https://github.com/Teamlinker/Teamlinker.git
synced 2025-06-03 03:00:17 +00:00
commit
ba301b3e19
@ -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
|
||||
|
@ -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:<{
|
||||
|
@ -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[]
|
||||
}
|
@ -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:<{
|
||||
|
@ -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:<{
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
@ -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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user