penisularhr / .hygen / new / module / create-command.ejs.t
create-command.ejs.t
Raw
---
to: "src/modules/<%= h.fileName(name) %>/commands/<%= h.createCommandFileName(name) %>.ts"
unless_exists: true
skip_if: <%= !blocks.includes('CreateCommand') %>
---
<%

 ClassName = h.ClassName(name);
 fieldName = h.changeCase.camel(ClassName);

 CreateCommandName = h.CreateCommandName(name);
 CreateHandlerName = h.CreateHandlerName(name);

 CreateDtoName = h.CreateDtoName(name);
 createDtoName = h.changeCase.camel(CreateDtoName);
 createDtoFileName = h.createDtoFileName(name);

 EntityName = h.EntityName(name);
 entityName = h.changeCase.camel(EntityName);

 EntityName = h.EntityName(name);
 entityName = h.changeCase.camel(EntityName);
 entityFileName = h.entityFileName(name);

 RepositoryName = h.RepositoryName(name);
 TranslationRepositoryName = h.TranslationRepositoryName(name);
 repositoryName = h.changeCase.camel(RepositoryName);
 translationRepositoryName = h.changeCase.camel(TranslationRepositoryName);
 repositoryFileName = h.repositoryFileName(name);

 TranslationEntityName = h.TranslationEntityName(name);
 TranslationDtoName = h.TranslationDtoName(name);
 translationEntityFileName = h.translationEntityFileName(name);
 translationRepositoryFileName = h.translationRepositoryFileName(name);
 translationEntityName = h.changeCase.camel(TranslationEntityName);

%>import type { ICommand, ICommandHandler } from '@nestjs/cqrs';
import { CommandHandler } from '@nestjs/cqrs';
import { find } from 'lodash';

import type { <%= CreateDtoName %> } from '../dtos/<%= createDtoFileName %>';
import type { <%= EntityName %> } from '../<%= entityFileName %>';
import { <%= RepositoryName %> } from '../<%= repositoryFileName %>';
import type { <%= TranslationEntityName %> } from '../<%= translationEntityFileName %>';
import { <%= TranslationRepositoryName %> } from '../<%= translationRepositoryFileName %>';

export class <%= CreateCommandName %> implements ICommand {
  constructor(
    public readonly <%=createDtoName %>: <%= CreateDtoName %>,
  ) {}
}

@CommandHandler(<%= CreateCommandName %>)
export class <%= CreateHandlerName %>
  implements ICommandHandler<<%= CreateCommandName %>, <%= EntityName %>>
{
  constructor(
    private <%= repositoryName %>: <%= RepositoryName %>,
    private <%= translationRepositoryName %>: <%= TranslationRepositoryName %>,
  ) {}

  async execute(command: <%= CreateCommandName %>) {
    const { <%=createDtoName %> } = command;
    const <%= entityName %> = this.<%= repositoryName %>.create();
    const translations: <%= TranslationEntityName %>[] = [];

    await this.<%= repositoryName %>.save(<%= entityName %>);

    // FIXME: Create generic function for translation creation
    for (const createTranslationDto of <%=createDtoName %>.title) {
      const languageCode = createTranslationDto.languageCode;
      const translationEntity = this.<%= translationRepositoryName %>.create({
        <%= fieldName %>Id: <%= entityName %>.id,
        languageCode,
        title: createTranslationDto.text,
        description: find(<%=createDtoName %>.description, {
          languageCode,
        })!.text,
      });

      translations.push(translationEntity);
    }

    await this.<%= translationRepositoryName %>.save(translations);

    <%= entityName %>.translations = translations;

    return <%= entityName %>;
  }
}