Teamlinker/code/server/common/entity/mapper.ts
sx1989827 1cbacd5df8 fix
2022-05-16 22:26:02 +08:00

92 lines
2.9 KiB
TypeScript

import { BaseModel } from "../../../common/model/base";
import { Err } from "../../../common/status/error";
import { getMysqlInstance } from "../db/mysql";
import { generateCreateSql, generateDeleteSql, generateQuerySql, generateSnowId, generateUpdateSql } from "../util/sql";
export abstract class Mapper<T extends BaseModel> {
private model:T
constructor(model:T){
this.model=model
}
async createConfig(info:T["model"]){}
async create(info:T["model"]):Promise<void> {
if(!info || info.id){
throw Err.Common.paramError
}
await this.createConfig(info);
info.id=await generateSnowId();
var mysql=getMysqlInstance()
await mysql.execute(generateCreateSql(this.model,info))
}
async getById(id:string):Promise<T["model"]> {
if(!id) {
throw Err.Common.itemNotFound
}
var mysql=getMysqlInstance();
let ret=await mysql.executeOne(generateQuerySql(this.model,[],{id}))
return ret
}
async getByExp(exp:{
[param in keyof T["model"]]:T["model"][param]
}):Promise<T["model"]> {
if(!exp) {
throw Err.Common.itemNotFound
}
var mysql=getMysqlInstance();
let ret=await mysql.executeOne(generateQuerySql(this.model,[],exp))
return ret
}
async updateConfig(info:T["model"]){}
async update(data:T["model"]):Promise<void> {
let info:T["model"]={}
Object.assign(info,data)
if(!info.id) {
throw Err.Common.itemNotFound
}
var mysql=getMysqlInstance();
await this.updateConfig(info)
let id=info.id;
delete info.id
if(info.created_time) {
delete info.created_time
}
if(info.modified_time) {
delete info.modified_time
}
await mysql.execute(generateUpdateSql(this.model,info,{id}))
}
async delete(id):Promise<void> {
if(!id) {
throw Err.Common.itemNotFound
}
var mysql=getMysqlInstance();
await mysql.execute(generateDeleteSql(this.model,{id}))
}
async copy(id:string,deletedFields?:string[]):Promise<T["model"]> {
if(!id) {
throw Err.Common.itemNotFound
}
var mysql=getMysqlInstance();
let ret=await mysql.executeOne(generateQuerySql(this.model,[],{id}))
if(!ret) {
throw Err.Common.itemNotFound
}
delete ret.created_time;
delete ret.modified_time;
delete ret.id
delete ret.reserved
if(deletedFields && deletedFields.length>0) {
for(let obj of deletedFields) {
delete ret[obj]
}
}
if(ret.name) {
(ret as any).name+="(copy)"
}
await this.create(ret);
let obj=await this.getById(ret.id)
return obj;
}
}