mirror of
https://github.com/aditama-labs/nest-autocrud.git
synced 2024-11-21 19:06:21 +00:00
feat: full working simple crud with id as unique identifier
This commit is contained in:
parent
87f951fe08
commit
d4ce99975d
@ -5,18 +5,16 @@ export class PrismaCreateProcess
|
|||||||
extends PrismaProcess
|
extends PrismaProcess
|
||||||
implements CreateProcess
|
implements CreateProcess
|
||||||
{
|
{
|
||||||
private dataInsert;
|
public data;
|
||||||
private dataResult;
|
public result;
|
||||||
|
|
||||||
setData(data) {
|
|
||||||
this.dataInsert = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
async process(): Promise<any> {
|
async process(): Promise<any> {
|
||||||
this.dataResult = await this.getDelegate().create(this.dataInsert);
|
this.result = await this.getDelegate().create({
|
||||||
|
data: this.data,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
output() {
|
output() {
|
||||||
this.dataResult;
|
this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
import { CreateProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
import { DeleteProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
||||||
import { PrismaProcess } from './prisma.process';
|
import { PrismaProcess } from './prisma.process';
|
||||||
|
|
||||||
export class PrismaDeleteProcess
|
export class PrismaDeleteProcess
|
||||||
extends PrismaProcess
|
extends PrismaProcess
|
||||||
implements CreateProcess
|
implements DeleteProcess
|
||||||
{
|
{
|
||||||
private dataResult: any;
|
public id: any;
|
||||||
private id: any;
|
private result: any;
|
||||||
|
|
||||||
async process(): Promise<any> {
|
async process(): Promise<any> {
|
||||||
this.dataResult = await this.getDelegate().delete({
|
this.result = await this.getDelegate().delete({
|
||||||
where: { id: this.id },
|
where: { id: this.id },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
output() {
|
output() {
|
||||||
return this.dataResult;
|
return this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,13 +2,13 @@ import { ListProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
|||||||
import { PrismaProcess } from './prisma.process';
|
import { PrismaProcess } from './prisma.process';
|
||||||
|
|
||||||
export class PrismaListProcess extends PrismaProcess implements ListProcess {
|
export class PrismaListProcess extends PrismaProcess implements ListProcess {
|
||||||
private data: any;
|
private result;
|
||||||
|
|
||||||
async process(): Promise<any> {
|
async process(): Promise<any> {
|
||||||
this.data = await this.getDelegate().findMany();
|
this.result = await this.getDelegate().findMany();
|
||||||
}
|
}
|
||||||
|
|
||||||
output() {
|
output() {
|
||||||
return this.data;
|
return this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,25 @@
|
|||||||
import { PaginationProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
import { PaginationProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
||||||
|
import { PrismaProcess } from './prisma.process';
|
||||||
|
|
||||||
export class PrismaPaginationProcess extends PaginationProcess {}
|
export class PrismaPaginationProcess
|
||||||
|
extends PrismaProcess
|
||||||
|
implements PaginationProcess
|
||||||
|
{
|
||||||
|
public params: { page: number; limit: number };
|
||||||
|
private result;
|
||||||
|
|
||||||
|
async process(): Promise<any> {
|
||||||
|
const { page, limit } = this.params;
|
||||||
|
const skip = (page - 1) * limit;
|
||||||
|
|
||||||
|
this.result = await this.getDelegate().findMany({
|
||||||
|
skip,
|
||||||
|
// @TODO: I don't know why this actually string even the type is number, without parseInt it will throw error
|
||||||
|
take: parseInt(limit.toString(), 10),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
output() {
|
||||||
|
return this.result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
import { CreateProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
import { ReadProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
||||||
import { PrismaProcess } from './prisma.process';
|
import { PrismaProcess } from './prisma.process';
|
||||||
|
|
||||||
export class PrismaReadProcess extends PrismaProcess implements CreateProcess {
|
export class PrismaReadProcess extends PrismaProcess implements ReadProcess {
|
||||||
private data: any;
|
public id;
|
||||||
private id: any;
|
private result;
|
||||||
|
|
||||||
async process(): Promise<any> {
|
async process(): Promise<any> {
|
||||||
this.data = await this.getDelegate().findUnique({
|
this.result = await this.getDelegate().findUnique({
|
||||||
where: { id: this.id },
|
where: { id: this.id },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
output() {
|
output() {
|
||||||
return this.data;
|
return this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
import { CreateProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
import { UpdateProcess } from '@aditama-labs/nest-autocrud/skeleton';
|
||||||
import { PrismaProcess } from './prisma.process';
|
import { PrismaProcess } from './prisma.process';
|
||||||
|
|
||||||
export class PrismaUpdateProcess
|
export class PrismaUpdateProcess
|
||||||
extends PrismaProcess
|
extends PrismaProcess
|
||||||
implements CreateProcess
|
implements UpdateProcess
|
||||||
{
|
{
|
||||||
private dataResult: any;
|
public id: any;
|
||||||
private dataUpdate: any;
|
public data: any;
|
||||||
private id: any;
|
private result: any;
|
||||||
|
|
||||||
async process(): Promise<any> {
|
async process(): Promise<any> {
|
||||||
this.dataResult = await this.getDelegate().update({
|
this.result = await this.getDelegate().update({
|
||||||
data: this.dataUpdate,
|
data: this.data,
|
||||||
where: { id: this.id },
|
where: { id: this.id },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
output() {
|
output() {
|
||||||
return this.dataResult;
|
return this.result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
libs/skeleton/src/executors/create.executor.ts
Normal file
16
libs/skeleton/src/executors/create.executor.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { CreateProcess } from '../processes';
|
||||||
|
import { DefaultExecutor } from './default.executor';
|
||||||
|
|
||||||
|
export class CreateExcutor extends DefaultExecutor {
|
||||||
|
constructor(process: CreateProcess, data) {
|
||||||
|
super(process);
|
||||||
|
// Set data to process
|
||||||
|
process.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(process: CreateProcess, data): Promise<any> {
|
||||||
|
const executor = new CreateExcutor(process, data);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
@ -15,10 +15,4 @@ export class DefaultExecutor {
|
|||||||
getOutput(): any {
|
getOutput(): any {
|
||||||
return this.process.output();
|
return this.process.output();
|
||||||
}
|
}
|
||||||
|
|
||||||
static async bootstrap(process: ISkeletonProcess): Promise<any> {
|
|
||||||
const executor = new DefaultExecutor(process);
|
|
||||||
await executor.execute();
|
|
||||||
return executor.getOutput();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
17
libs/skeleton/src/executors/delete.executor.ts
Normal file
17
libs/skeleton/src/executors/delete.executor.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { DeleteProcess } from '../processes';
|
||||||
|
import { DefaultExecutor } from './default.executor';
|
||||||
|
|
||||||
|
// @TODO: ReadExecutor and DeleteExecutor can be merged into one executor
|
||||||
|
export class DeleteExecutor extends DefaultExecutor {
|
||||||
|
constructor(process: DeleteProcess, id) {
|
||||||
|
super(process);
|
||||||
|
// Set the id of the data
|
||||||
|
process.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(process: DeleteProcess, id): Promise<any> {
|
||||||
|
const executor = new DeleteExecutor(process, id);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,7 @@
|
|||||||
|
export * from './create.executor';
|
||||||
export * from './default.executor';
|
export * from './default.executor';
|
||||||
|
export * from './delete.executor';
|
||||||
|
export * from './list.executor';
|
||||||
|
export * from './pagination.executor';
|
||||||
|
export * from './read.executor';
|
||||||
|
export * from './update.executor';
|
||||||
|
14
libs/skeleton/src/executors/list.executor.ts
Normal file
14
libs/skeleton/src/executors/list.executor.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { DefaultExecutor } from '.';
|
||||||
|
import { ListProcess } from '../processes';
|
||||||
|
|
||||||
|
export class ListExecutor extends DefaultExecutor {
|
||||||
|
constructor(process: ListProcess) {
|
||||||
|
super(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(process: ListProcess): Promise<any> {
|
||||||
|
const executor = new ListExecutor(process);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
22
libs/skeleton/src/executors/pagination.executor.ts
Normal file
22
libs/skeleton/src/executors/pagination.executor.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { DefaultExecutor } from '.';
|
||||||
|
import { PaginationProcess } from '../processes';
|
||||||
|
|
||||||
|
export class PaginationExecutor extends DefaultExecutor {
|
||||||
|
constructor(
|
||||||
|
process: PaginationProcess,
|
||||||
|
params: { page: number; limit: number },
|
||||||
|
) {
|
||||||
|
super(process);
|
||||||
|
// Set params to process
|
||||||
|
process.params = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(
|
||||||
|
process: PaginationProcess,
|
||||||
|
params: { page: number; limit: number },
|
||||||
|
): Promise<any> {
|
||||||
|
const executor = new PaginationExecutor(process, params);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
16
libs/skeleton/src/executors/read.executor.ts
Normal file
16
libs/skeleton/src/executors/read.executor.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { ReadProcess } from '../processes';
|
||||||
|
import { DefaultExecutor } from './default.executor';
|
||||||
|
|
||||||
|
export class ReadExecutor extends DefaultExecutor {
|
||||||
|
constructor(process: ReadProcess, id) {
|
||||||
|
super(process);
|
||||||
|
// Set the id of the data
|
||||||
|
process.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(process: ReadProcess, id): Promise<any> {
|
||||||
|
const executor = new ReadExecutor(process, id);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
18
libs/skeleton/src/executors/update.executor.ts
Normal file
18
libs/skeleton/src/executors/update.executor.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { UpdateProcess } from '../processes';
|
||||||
|
import { DefaultExecutor } from './default.executor';
|
||||||
|
|
||||||
|
// @TODO: This executor should be able to extend from ReadExecutor and CreateExecutor
|
||||||
|
export class UpdateExecutor extends DefaultExecutor {
|
||||||
|
constructor(process: UpdateProcess, id, data) {
|
||||||
|
super(process);
|
||||||
|
// Set the id and data to process
|
||||||
|
process.id = id;
|
||||||
|
process.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async bootstrap(process: UpdateProcess, id, data): Promise<any> {
|
||||||
|
const executor = new UpdateExecutor(process, id, data);
|
||||||
|
await executor.execute();
|
||||||
|
return executor.getOutput();
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
import { DefaultProcess } from './default.process';
|
import { DefaultProcess } from './default.process';
|
||||||
|
|
||||||
export class CreateProcess extends DefaultProcess {}
|
export class CreateProcess extends DefaultProcess {
|
||||||
|
public data;
|
||||||
|
}
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
import { DefaultProcess } from './default.process';
|
import { DefaultProcess } from './default.process';
|
||||||
|
|
||||||
export class DeleteProcess extends DefaultProcess {}
|
// @TODO: DeleteProcess and ReadProcess are the same, should be refactored next
|
||||||
|
export class DeleteProcess extends DefaultProcess {
|
||||||
|
public id;
|
||||||
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
import { DefaultProcess } from './default.process';
|
import { DefaultProcess } from './default.process';
|
||||||
|
|
||||||
export class PaginationProcess extends DefaultProcess {}
|
export class PaginationProcess extends DefaultProcess {
|
||||||
|
params: { page: number; limit: number };
|
||||||
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
import { DefaultProcess } from './default.process';
|
import { DefaultProcess } from './default.process';
|
||||||
|
|
||||||
export class ReadProcess extends DefaultProcess {}
|
export class ReadProcess extends DefaultProcess {
|
||||||
|
public id;
|
||||||
|
}
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
import { DefaultProcess } from './default.process';
|
import { DefaultProcess } from './default.process';
|
||||||
|
|
||||||
export class UpdateProcess extends DefaultProcess {}
|
export class UpdateProcess extends DefaultProcess {
|
||||||
|
// @TODO: The property of id can be take from ReadProcess which is extended
|
||||||
|
public id;
|
||||||
|
// @TODO: The property of data can be take from CreateProcess which is extended
|
||||||
|
public data;
|
||||||
|
}
|
||||||
|
@ -16,8 +16,14 @@ import {
|
|||||||
READ_PROCESS,
|
READ_PROCESS,
|
||||||
UPDATE_PROCESS,
|
UPDATE_PROCESS,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
import { CreateExcutor } from './executors/create.executor';
|
||||||
import { DefaultExecutor } from './executors/default.executor';
|
import { DefaultExecutor } from './executors/default.executor';
|
||||||
|
import { DeleteExecutor } from './executors/delete.executor';
|
||||||
|
import { ListExecutor } from './executors/list.executor';
|
||||||
|
import { ReadExecutor } from './executors/read.executor';
|
||||||
|
import { UpdateExecutor } from './executors/update.executor';
|
||||||
import { ISkeletonCRUDController } from './interfaces/controller/skeleton-crud.controller.interface';
|
import { ISkeletonCRUDController } from './interfaces/controller/skeleton-crud.controller.interface';
|
||||||
|
import { PaginationExecutor } from './executors';
|
||||||
|
|
||||||
export class SkeletonCRUDController implements ISkeletonCRUDController {
|
export class SkeletonCRUDController implements ISkeletonCRUDController {
|
||||||
constructor(
|
constructor(
|
||||||
@ -37,33 +43,33 @@ export class SkeletonCRUDController implements ISkeletonCRUDController {
|
|||||||
|
|
||||||
@Post()
|
@Post()
|
||||||
async create(@Body() body): Promise<any> {
|
async create(@Body() body): Promise<any> {
|
||||||
return await DefaultExecutor.bootstrap(this.createProcess);
|
return await CreateExcutor.bootstrap(this.createProcess, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Delete(':id')
|
@Delete(':id')
|
||||||
async delete(@Param('id') id) {
|
async delete(@Param('id') id) {
|
||||||
return await DefaultExecutor.bootstrap(this.deleteProcess);
|
return await DeleteExecutor.bootstrap(this.deleteProcess, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get('list')
|
@Get('list')
|
||||||
async list() {
|
async list() {
|
||||||
return await DefaultExecutor.bootstrap(this.listProcess);
|
return await ListExecutor.bootstrap(this.listProcess);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get()
|
@Get()
|
||||||
async pagination(
|
async pagination(
|
||||||
@Query() params: { page?: number; limit?: number } = { page: 1, limit: 10 },
|
@Query() params: { page: number; limit: number } = { page: 1, limit: 10 },
|
||||||
) {
|
) {
|
||||||
return await DefaultExecutor.bootstrap(this.paginationProcess);
|
return await PaginationExecutor.bootstrap(this.paginationProcess, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get(':id')
|
@Get(':id')
|
||||||
async read(@Param('id') id) {
|
async read(@Param('id') id) {
|
||||||
return await DefaultExecutor.bootstrap(this.readProcess);
|
return await ReadExecutor.bootstrap(this.readProcess, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Patch()
|
@Patch(':id')
|
||||||
async update(@Param('id') id, @Body() body) {
|
async update(@Param('id') id, @Body() body) {
|
||||||
return await DefaultExecutor.bootstrap(this.updateProcess);
|
return await UpdateExecutor.bootstrap(this.updateProcess, id, body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user