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
implements CreateProcess
{
private dataInsert;
private dataResult;
setData(data) {
this.dataInsert = data;
}
public data;
public result;
async process(): Promise<any> {
this.dataResult = await this.getDelegate().create(this.dataInsert);
this.result = await this.getDelegate().create({
data: this.data,
});
}
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';
export class PrismaDeleteProcess
extends PrismaProcess
implements CreateProcess
implements DeleteProcess
{
private dataResult: any;
private id: any;
public id: any;
private result: any;
async process(): Promise<any> {
this.dataResult = await this.getDelegate().delete({
this.result = await this.getDelegate().delete({
where: { id: this.id },
});
}
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';
export class PrismaListProcess extends PrismaProcess implements ListProcess {
private data: any;
private result;
async process(): Promise<any> {
this.data = await this.getDelegate().findMany();
this.result = await this.getDelegate().findMany();
}
output() {
return this.data;
return this.result;
}
}

View File

@ -1,3 +1,25 @@
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';
export class PrismaReadProcess extends PrismaProcess implements CreateProcess {
private data: any;
private id: any;
export class PrismaReadProcess extends PrismaProcess implements ReadProcess {
public id;
private result;
async process(): Promise<any> {
this.data = await this.getDelegate().findUnique({
this.result = await this.getDelegate().findUnique({
where: { id: this.id },
});
}
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';
export class PrismaUpdateProcess
extends PrismaProcess
implements CreateProcess
implements UpdateProcess
{
private dataResult: any;
private dataUpdate: any;
private id: any;
public id: any;
public data: any;
private result: any;
async process(): Promise<any> {
this.dataResult = await this.getDelegate().update({
data: this.dataUpdate,
this.result = await this.getDelegate().update({
data: this.data,
where: { id: this.id },
});
}
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 {
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 './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';
export class CreateProcess extends DefaultProcess {}
export class CreateProcess extends DefaultProcess {
public data;
}

View File

@ -1,3 +1,6 @@
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';
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';
export class ReadProcess extends DefaultProcess {}
export class ReadProcess extends DefaultProcess {
public id;
}

View File

@ -1,3 +1,8 @@
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,
UPDATE_PROCESS,
} from './constants';
import { CreateExcutor } from './executors/create.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 { PaginationExecutor } from './executors';
export class SkeletonCRUDController implements ISkeletonCRUDController {
constructor(
@ -37,33 +43,33 @@ export class SkeletonCRUDController implements ISkeletonCRUDController {
@Post()
async create(@Body() body): Promise<any> {
return await DefaultExecutor.bootstrap(this.createProcess);
return await CreateExcutor.bootstrap(this.createProcess, body);
}
@Delete(':id')
async delete(@Param('id') id) {
return await DefaultExecutor.bootstrap(this.deleteProcess);
return await DeleteExecutor.bootstrap(this.deleteProcess, id);
}
@Get('list')
async list() {
return await DefaultExecutor.bootstrap(this.listProcess);
return await ListExecutor.bootstrap(this.listProcess);
}
@Get()
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')
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) {
return await DefaultExecutor.bootstrap(this.updateProcess);
return await UpdateExecutor.bootstrap(this.updateProcess, id, body);
}
}