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

khu-khlug / sight-backend / 14247600948

03 Apr 2025 04:05PM UTC coverage: 50.988% (-1.0%) from 51.939%
14247600948

push

github

web-flow
feat: 디스코드 메신저 구현 (#118)

823 of 2618 branches covered (31.44%)

Branch coverage included in aggregate %.

29 of 64 new or added lines in 13 files covered. (45.31%)

45 existing lines in 10 files now uncovered.

2272 of 3452 relevant lines covered (65.82%)

12.83 hits per line

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

78.43
/src/app/application/group/command/createGroup/CreateGroupCommandHandler.ts
1
import { Inject, NotFoundException } from '@nestjs/common';
2
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
1✔
3

4
import { Transactional } from '@khlug/core/persistence/transaction/Transactional';
5

1✔
6
import { CreateGroupCommand } from '@khlug/app/application/group/command/createGroup/CreateGroupCommand';
7
import { CreateGroupCommandResult } from '@khlug/app/application/group/command/createGroup/CreateGroupCommandResult';
8

8✔
9
import {
10
  IMessenger,
11
  MessengerToken,
1✔
12
} from '@khlug/app/domain/adapter/IMessenger';
1✔
13
import { GroupFactory } from '@khlug/app/domain/group/GroupFactory';
1✔
14
import { GroupMemberFactory } from '@khlug/app/domain/group/GroupMemberFactory';
1✔
15
import {
1✔
16
  GroupMemberRepository,
1✔
17
  IGroupMemberRepository,
1✔
18
} from '@khlug/app/domain/group/IGroupMemberRepository';
1✔
19
import {
1✔
20
  GroupRepository,
1✔
21
  IGroupRepository,
1✔
22
} from '@khlug/app/domain/group/IGroupRepository';
1✔
23
import { GroupState } from '@khlug/app/domain/group/model/constant';
1✔
24
import {
1✔
25
  IInterestRepository,
1✔
26
  InterestRepository,
27
} from '@khlug/app/domain/interest/IInterestRepository';
28!
UNCOV
28
import { PointGrantService } from '@khlug/app/domain/user/service/PointGrantService';
×
29

30
import { Message } from '@khlug/constant/error';
31
import { Point } from '@khlug/constant/point';
32

33
@CommandHandler(CreateGroupCommand)
34
export class CreateGroupCommandHandler
35
  implements ICommandHandler<CreateGroupCommand, CreateGroupCommandResult>
28✔
36
{
37
  constructor(
28✔
38
    private readonly groupFactory: GroupFactory,
39
    private readonly groupMemberFactory: GroupMemberFactory,
40
    private readonly pointGrantService: PointGrantService,
2!
41
    @Inject(GroupRepository)
2!
UNCOV
42
    private readonly groupRepository: IGroupRepository,
×
43
    @Inject(GroupMemberRepository)
2✔
44
    private readonly groupMemberRepository: IGroupMemberRepository,
45
    @Inject(InterestRepository)
46
    private readonly interestRepository: IInterestRepository,
5!
47
    @Inject(MessengerToken)
48
    private readonly slackSender: IMessenger,
49
  ) {}
4✔
50

4✔
51
  @Transactional()
52
  async execute(
53
    command: CreateGroupCommand,
54
  ): Promise<CreateGroupCommandResult> {
55
    const {
4✔
56
      requesterUserId,
4✔
57
      title,
4✔
58
      category,
3✔
59
      grade,
60
      interestIds,
61
      purpose,
62
      technology,
63
      allowJoin,
64
      repository,
65
    } = command;
66

67
    const uniqueInterestIds = Array.from(new Set(interestIds));
68
    await this.checkInterestExists(uniqueInterestIds);
69

70
    const newGroup = this.groupFactory.create({
71
      id: this.groupRepository.nextId(),
72
      category,
73
      state: GroupState.PROGRESS,
3✔
74
      title,
3✔
75
      authorUserId: requesterUserId,
76
      adminUserId: requesterUserId,
77
      purpose,
78
      interestIds,
79
      technology,
3✔
80
      grade,
3✔
81
      lastUpdaterUserId: requesterUserId,
3✔
82
      repository,
83
      allowJoin,
84
    });
85
    await this.groupRepository.save(newGroup);
86

87
    const groupMember = this.groupMemberFactory.create({
88
      id: this.groupMemberRepository.nextId(),
3✔
89
      userId: requesterUserId,
90
      groupId: newGroup.id,
91
    });
92
    await this.groupMemberRepository.save(groupMember);
3✔
93

94
    const message = `${newGroup.title} 그룹을 만들었습니다.`;
95
    await this.pointGrantService.grant({
4✔
96
      targetUserIds: [newGroup.adminUserId],
4✔
97
      amount: Point.GROUP_CREATED,
1✔
98
      reason: message,
99
    });
100

101
    this.slackSender.send({
4✔
102
      targetUserId: newGroup.adminUserId,
4✔
103
      message,
4✔
104
    });
4✔
105

4✔
106
    return new CreateGroupCommandResult(newGroup);
4✔
107
  }
4✔
108

4✔
109
  private async checkInterestExists(
4✔
110
    uniqueInterestIds: string[],
4✔
111
  ): Promise<void> {
4✔
112
    const interests =
4✔
113
      await this.interestRepository.findByIds(uniqueInterestIds);
4✔
114

4✔
115
    if (interests.length !== uniqueInterestIds.length) {
116
      throw new NotFoundException(Message.SOME_INTERESTS_NOT_FOUND);
117
    }
1✔
118
  }
119
}
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