• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

khu-khlug / sight-backend / 13616929463

02 Mar 2025 03:40PM UTC coverage: 57.19% (-1.0%) from 58.222%
13616929463

push

github

web-flow
chore: yarn에서 npm으로 롤백 (#105)

637 of 1702 branches covered (37.43%)

Branch coverage included in aggregate %.

1797 of 2554 relevant lines covered (70.36%)

15.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

77.78
/src/app/application/group/command/enablePortfolio/EnablePortfolioCommandHandler.ts
1
import {
2
  ForbiddenException,
1✔
3
  Inject,
4
  NotFoundException,
5
  UnprocessableEntityException,
1✔
6
} from '@nestjs/common';
7
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
8

12✔
9
import { MessageBuilder } from '@khlug/core/message/MessageBuilder';
10
import { Transactional } from '@khlug/core/persistence/transaction/Transactional';
11

1✔
12
import { EnablePortfolioCommand } from '@khlug/app/application/group/command/enablePortfolio/EnablePortfolioCommand';
1✔
13

1✔
14
import {
1✔
15
  ISlackSender,
1✔
16
  SlackSender,
1✔
17
} from '@khlug/app/domain/adapter/ISlackSender';
1✔
18
import {
1✔
19
  GroupLogger,
1✔
20
  IGroupLogger,
1✔
21
} from '@khlug/app/domain/group/IGroupLogger';
1✔
22
import {
1✔
23
  GroupMemberRepository,
1✔
24
  IGroupMemberRepository,
1✔
25
} from '@khlug/app/domain/group/IGroupMemberRepository';
26
import {
30!
27
  GroupRepository,
×
28
  IGroupRepository,
29
} from '@khlug/app/domain/group/IGroupRepository';
30
import { Group } from '@khlug/app/domain/group/model/Group';
31
import { SlackMessageCategory } from '@khlug/app/domain/message/model/constant';
32
import { PointGrantService } from '@khlug/app/domain/user/service/PointGrantService';
33

34
import { Message } from '@khlug/constant/message';
30✔
35
import { Point } from '@khlug/constant/point';
36
import { Template } from '@khlug/constant/template';
30✔
37

38
@CommandHandler(EnablePortfolioCommand)
39
export class EnablePortfolioCommandHandler
2!
40
  implements ICommandHandler<EnablePortfolioCommand>
2!
41
{
×
42
  constructor(
2✔
43
    private readonly pointGrantService: PointGrantService,
44
    @Inject(GroupRepository)
45
    private readonly groupRepository: IGroupRepository,
5!
46
    @Inject(GroupMemberRepository)
47
    private readonly groupMemberRepository: IGroupMemberRepository,
48
    @Inject(GroupLogger)
4✔
49
    private readonly groupLogger: IGroupLogger,
4✔
50
    @Inject(SlackSender)
51
    private readonly slackSender: ISlackSender,
52
  ) {}
53

54
  @Transactional()
6✔
55
  async execute(command: EnablePortfolioCommand): Promise<void> {
6✔
56
    const { groupId, requesterUserId } = command;
6✔
57

1✔
58
    const group = await this.groupRepository.findById(groupId);
59
    if (!group) {
5✔
60
      throw new NotFoundException(Message.GROUP_NOT_FOUND);
4✔
61
    }
4✔
62

4✔
63
    this.checkGroupAdmin(group, requesterUserId);
4✔
64
    this.checkNotCustomerServiceGroup(group);
4✔
65

4✔
66
    group.enablePortfolio();
67
    await this.groupRepository.save(group);
68

5✔
69
    await this.groupLogger.log(groupId, '포트폴리오가 발행 중입니다.');
1✔
70
    await this.grantPointToMembers(group);
71
    this.sendMessageToAdminUser(group);
72
  }
73

4!
74
  private checkGroupAdmin(group: Group, requesterUserId: number): void {
×
75
    if (group.adminUserId !== requesterUserId) {
76
      throw new ForbiddenException(Message.ONLY_GROUP_ADMIN_CAN_EDIT_GROUP);
77
    }
78
  }
4!
79

×
80
  private checkNotCustomerServiceGroup(group: Group): void {
81
    if (group.isCustomerServiceGroup()) {
4✔
82
      throw new UnprocessableEntityException(
83
        Message.CANNOT_MODIFY_CUSTOMER_SERVICE_GROUP,
84
      );
4✔
85
    }
4✔
86
  }
4✔
87

88
  private async grantPointToMembers(group: Group): Promise<void> {
89
    if (group.isPracticeGroup()) {
90
      return;
91
    }
92

93
    const reason = MessageBuilder.build(Template.ENABLE_GROUP_PORTFOLIO.point, {
4✔
94
      groupTitle: group.title,
95
    });
96

97
    const groupMembers = await this.groupMemberRepository.findByGroupId(
4✔
98
      group.id,
99
    );
100
    const userIds = groupMembers.map((groupMember) => groupMember.userId);
101

102
    await this.pointGrantService.grant({
103
      targetUserIds: userIds,
104
      amount: Point.GROUP_ENABLED_PORTFOLIO,
6✔
105
      reason,
6✔
106
    });
6✔
107
  }
6✔
108

6✔
109
  private sendMessageToAdminUser(group: Group): void {
6✔
110
    const message = MessageBuilder.build(
6✔
111
      Template.ENABLE_GROUP_PORTFOLIO.notification,
6✔
112
      { groupId: group.id, groupTitle: group.title },
6✔
113
    );
6✔
114

115
    this.slackSender.send({
116
      category: SlackMessageCategory.GROUP_ACTIVITY,
1✔
117
      targetUserId: group.adminUserId,
118
      message,
119
    });
120
  }
1!
121
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc