All files / libs/assignments/plans/core/src/legacy plan-assignments.controller.ts

92.59% Statements 100/108
34.61% Branches 9/26
83.33% Functions 5/6
92.59% Lines 100/108

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 1091x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 1x 1x                 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 1x  
import { Body, Controller, Delete, Get, Inject, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
 
import { Company, type PlanAssignment } from '@amalia/core/models';
import { Relations, UuidPipe } from '@amalia/kernel/api';
import {
  AmaliaAuthGuard,
  CheckPolicies,
  CurrentAuthenticatedContext,
  CurrentUserCompany,
  PoliciesGuard,
} from '@amalia/kernel/auth/core';
import { canModifyPlanAssignments, canViewPlanAssignments } from '@amalia/kernel/auth/shared';
import { type AuthenticatedContext } from '@amalia/kernel/auth/types';
import { UpsertPlanAssignmentsDryRunResponse } from '@amalia/payout-definition/plans/types';
 
import {
  DeletePlanAssignmentsUseCase,
  UpdatePlanAssignmentsUseCase,
  UpsertPlanAssignmentsUseCase,
} from '../lib/plan-assignment.core-module';
import { ValidatePlanAssignmentsCsvUseCase } from '../lib/use-cases/validate-plan-assignments-csv.use-case';
 
import { DeletePlanAssignmentsDto } from './dto/delete-plan-assignments.dto';
import { UpdatePlanAssignmentsDto } from './dto/update-plan-assignments.dto';
import { UpsertPlanAssignmentsDto } from './dto/upsert-plan-assignments.dto';
import { ValidatePlanAssignmentsCsvDto } from './dto/validate-plan-assignments-csv.dto';
import { PlansAssignmentsService } from './plan-assignments.service';
 
@UseGuards(AmaliaAuthGuard, PoliciesGuard)
@ApiBearerAuth()
@ApiTags('assignments')
@Controller('plan-assignments')
export class PlansAssignmentsController {
  public constructor(
    @Inject(PlansAssignmentsService)
    private readonly planAssignmentService: PlansAssignmentsService,
    private readonly validatePlanAssignmentsCsvUseCase: ValidatePlanAssignmentsCsvUseCase,
    private readonly upsertPlanAssignmentsUseCase: UpsertPlanAssignmentsUseCase,
    private readonly updatePlanAssignmentsUseCase: UpdatePlanAssignmentsUseCase,
    private readonly deletePlanAssignmentsUseCase: DeletePlanAssignmentsUseCase,
  ) {}
 
  @Get()
  @CheckPolicies((ability) => canViewPlanAssignments(ability))
  public async findAll(
    @CurrentUserCompany() company: Company,
    @Query('planId', new UuidPipe({ multiple: true, optional: true })) planIds?: string[],
    @Query('userId', new UuidPipe({ optional: true })) userId?: string,
    @Relations('company,plan,user,mainTeam') relations?: string[],
  ): Promise<PlanAssignment[]> {
    return this.planAssignmentService.findAll(
      company.id,
      planIds || null,
      userId ? [userId] : null,
      undefined,
      relations,
    );
  }
 
  @Post()
  @CheckPolicies((ability) => canModifyPlanAssignments(ability))
  public async upsert(
    @CurrentAuthenticatedContext() authenticatedContext: AuthenticatedContext,
    @Body() upsertPlanAssignmentsDto: UpsertPlanAssignmentsDto,
  ): Promise<PlanAssignment[]> {
    return this.upsertPlanAssignmentsUseCase.execute({
      authenticatedContext,
      upsertPlanAssignmentsRequest: upsertPlanAssignmentsDto,
    });
  }
 
  @Post('validate')
  @CheckPolicies((ability) => canModifyPlanAssignments(ability))
  public async validateCsv(
    @CurrentAuthenticatedContext() authenticatedContext: AuthenticatedContext,
    @Body() dto: ValidatePlanAssignmentsCsvDto,
  ): Promise<UpsertPlanAssignmentsDryRunResponse> {
    return this.validatePlanAssignmentsCsvUseCase.execute({
      authenticatedContext,
      request: dto,
    });
  }
 
  @Patch()
  @CheckPolicies((ability) => canModifyPlanAssignments(ability))
  public async update(
    @CurrentAuthenticatedContext() authenticatedContext: AuthenticatedContext,
    @Body() updatePlanAssignmentsDto: UpdatePlanAssignmentsDto,
  ): Promise<PlanAssignment[]> {
    return this.updatePlanAssignmentsUseCase.execute({
      authenticatedContext,
      updatePlanAssignmentsRequest: updatePlanAssignmentsDto,
    });
  }
 
  @Delete()
  @CheckPolicies((ability) => canModifyPlanAssignments(ability))
  public async delete(
    @CurrentAuthenticatedContext() authenticatedContext: AuthenticatedContext,
    @Body() deletePlanAssignmentsDto: DeletePlanAssignmentsDto,
  ): Promise<void> {
    await this.deletePlanAssignmentsUseCase.execute({
      authenticatedContext,
      deletePlanAssignmentsRequest: deletePlanAssignmentsDto,
    });
  }
}