feat: full working simple crud with id as unique identifier

This commit is contained in:
Supan Adit Pratama 2024-10-30 22:55:25 +07:00
parent 87f951fe08
commit d4ce99975d
20 changed files with 194 additions and 51 deletions

View File

@ -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;
} }
} }

View File

@ -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;
} }
} }

View File

@ -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;
} }
} }

View File

@ -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;
}
}

View File

@ -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;
} }
} }

View File

@ -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;
} }
} }

View 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();
}
}

View File

@ -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();
}
} }

View 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();
}
}

View File

@ -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';

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 };
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
} }
} }