<%~ includeFile('./header.eta') %>

import { Controller, Body } from "@nestjs/common";
import { Crud, CrudController, Override, ParsedRequest, CrudRequest, ParsedBody, CreateManyDto } from '@apso/crud';
import { ApiTags, ApiResponse, ApiOperation, ApiBody } from '@nestjs/swagger';
import {<%= it.entityName %>, <%= it.entityName %>Create, <%= it.entityName %>Update} from './dtos/<%= it.entityName%>.dto'
import {<%= it.svcName %>} from './<%= it.entityName %>.service';
  
@Crud({
    model: {
        type: <%= it.entityName %>
    },
    dto: {
        create: <%= it.entityName %>Create,
        update: <%= it.entityName %>Update,
        replace: <%= it.entityName %>Update,
    },
    validation: false,
    params: {
        id: {
            field: 'id',
            type: 'string',
            primary: true,
        },
    },
    query: {
        /**
        * commenting out limit and pagination because of an issue with Crud lib: https://github.com/nestjsx/crud/issues/777
        */
        // TODO: make limit env driven?
        limit: 5,
        alwaysPaginate: true,
        <% if (it.associations.length) { %>
            join: {
                <% it.associations.forEach((assoc) => { %>
                    <% /* Removed check: relying on distinct pluralizedRelationshipName */ %>
                    <% if (assoc.type === 'OneToMany') { %>
                    <%= assoc.pluralizedRelationshipName %>: { eager: false },
                    <% } else if (assoc.type === 'ManyToOne') { %>
                    <%= assoc.relationshipName %>: { eager: false },
                    <% } else if (assoc.type === 'ManyToMany') { %>
                    <%= assoc.pluralizedRelationshipName %>: { eager: false },
                    <% } else if (assoc.type === 'OneToOne') { %>
                    <%= assoc.relationshipName %>: { eager: false },
                    <% } %>
                <% }) %>
                <% if (it.nestedJoinsFile) {%>
                    <%~ includeFile(it.nestedJoinsFile) %>
                <% }%>
            },
        <% } %>
     }
})

@Controller('<%= it.pluralEntityName %>')
@ApiTags('<%= it.pluralEntityName %>')
export class <%= it.ctrlName %> implements CrudController<<%= it.entityName %>>{
    constructor(public service: <%= it.svcName %>) {}

    <% /* https://github.com/nestjsx/crud/wiki/Controllers#routes-override */ %>
    <% /* Override the core controller methods:

    getManyBase(
        @ParsedRequest() req: CrudRequest,
    ): Promise<GetManyDefaultResponse<T> | T[]>;

    getOneBase(
        @ParsedRequest() req: CrudRequest,
    ): Promise<T>;

    createOneBase(
        @ParsedRequest() req: CrudRequest,
        @ParsedBody() dto: T,
    ): Promise<T>;

    createManyBase(
        @ParsedRequest() req: CrudRequest,
        @ParsedBody() dto: CreateManyDto<T>,
    ): Promise<T>;

    updateOneBase(
        @ParsedRequest() req: CrudRequest,
        @ParsedBody() dto: T,
    ): Promise<T>;

    replaceOneBase(
        @ParsedRequest() req: CrudRequest,
        @ParsedBody() dto: T,
    ): Promise<T>;

    deleteOneBase(
        @ParsedRequest() req: CrudRequest,
    ): Promise<void | T>;
    */ %>

    get base(): CrudController<<%= it.entityName %>> {
        return this;
    }

    @Override('getManyBase')
    @ApiOperation({ summary: 'Retrieve multiple <%= it.pluralEntityName %>' })
    getMany(
        @ParsedRequest() req: CrudRequest,
    ) {
        return this.base.getManyBase(req);
    }

    @Override('getOneBase')
    @ApiOperation({ summary: 'Retrieve a single <%= it.entityName %>' })
    get(
        @ParsedRequest() req: CrudRequest,
    ) {
        return this.base.getOneBase(req);
    }

    @Override('createOneBase')
    @ApiOperation({ summary: 'Create a single <%= it.entityName %>' })
    <% /* @ApiResponse({ status: 200, description: 'description goes here', schema: <%= it.entityName %>Create }) */ %>
    @ApiBody({
        type: <%= it.entityName %>Create ,
        description: "The Description for the Post Body. Please look into the DTO. You will see the @ApiOptionalProperty used to define the Schema.",
        <% /* examples: {
            a: {
                summary: "Empty Body",
                description: "Description for when an empty body is used",
                value: {} as <%= it.entityName %>Create
            },
            b: {
                summary: "Hello Body",
                description: "Hello is used as the greeting",
                value: {greeting: "Hello"} as <%= it.entityName %>Create
            }
        } */ %>

    })
    create(
        @ParsedRequest() req: CrudRequest,
        @Body() dto: <%= it.entityName %>Create,
    ) {
        return this.base.createOneBase(req, dto as unknown as <%= it.entityName %>);
    }

    @Override('createManyBase')
    @ApiOperation({ summary: 'Create multiple<%= it.pluralEntityName %>' })
    createMany(
        @ParsedRequest() req: CrudRequest,
        @Body() dto: CreateManyDto<<%= it.entityName %>Create>
    ) {
        return this.base.createManyBase(req, dto as unknown as CreateManyDto<<%= it.entityName %>>);
    }

    @Override('updateOneBase')
    @ApiOperation({ summary: 'Update a single <%= it.entityName %>' })
    update(
        @ParsedRequest() req: CrudRequest,
        @Body() dto: <%= it.entityName %>Update,
    ) {
        return this.base.updateOneBase(req, dto as unknown as <%= it.entityName %>);
    }

    @Override('replaceOneBase')
    @ApiOperation({ summary: 'Replace a single <%= it.entityName %>' })
    replace(
        @ParsedRequest() req: CrudRequest,
        @Body() dto: <%= it.entityName %>Update,
    ) {
        return this.base.replaceOneBase(req, dto as unknown as <%= it.entityName %>);
    }

    @Override('deleteOneBase')
    @ApiOperation({ summary: 'Delete a single <%= it.entityName %>' })
    delete(
        @ParsedRequest() req: CrudRequest,
    ) {
        return this.base.deleteOneBase(req);
    }
}
  