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

khu-khlug / sight-backend / 14190117854

01 Apr 2025 07:47AM UTC coverage: 51.423%. Remained the same
14190117854

push

github

web-flow
refactor: 메시지 전송 클래스 구현을 위해 기존 클래스 및 파일 이름 변경 (#115)

796 of 2513 branches covered (31.68%)

Branch coverage included in aggregate %.

29 of 34 new or added lines in 18 files covered. (85.29%)

36 existing lines in 6 files now uncovered.

2222 of 3356 relevant lines covered (66.21%)

13.1 hits per line

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

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

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

11
import { AddBookmarkCommand } from '@khlug/app/application/group/command/addBookmark/AddBookmarkCommand';
1✔
12
import { AddBookmarkCommandResult } from '@khlug/app/application/group/command/addBookmark/AddBookmarkCommandResult';
1✔
13

1✔
14
import { INotifier, NotifierToken } from '@khlug/app/domain/adapter/INotifier';
1✔
15
import { GroupBookmarkFactory } from '@khlug/app/domain/group/GroupBookmarkFactory';
1✔
16
import {
1✔
17
  GroupBookmarkRepository,
1✔
18
  IGroupBookmarkRepository,
1✔
19
} from '@khlug/app/domain/group/IGroupBookmarkRepository';
1✔
20
import {
1✔
21
  GroupRepository,
1✔
22
  IGroupRepository,
1✔
23
} from '@khlug/app/domain/group/IGroupRepository';
1✔
24
import { NotificationCategory } from '@khlug/constant/notification';
25

20!
NEW
26
import { Message } from '@khlug/constant/error';
×
27
import { Template } from '@khlug/constant/template';
28

29
@CommandHandler(AddBookmarkCommand)
30
export class AddBookmarkCommandHandler
31
  implements ICommandHandler<AddBookmarkCommand>
32
{
33
  constructor(
20✔
34
    @Inject(GroupRepository)
35
    private readonly groupRepository: IGroupRepository,
20✔
36
    @Inject(GroupBookmarkFactory)
37
    private readonly groupBookmarkFactory: GroupBookmarkFactory,
38
    @Inject(GroupBookmarkRepository)
2!
39
    private readonly groupBookmarkRepository: IGroupBookmarkRepository,
2!
NEW
40
    @Inject(NotifierToken)
×
41
    private readonly slackSender: INotifier,
2✔
42
  ) {}
43

44
  @Transactional()
5!
45
  async execute(
46
    command: AddBookmarkCommand,
47
  ): Promise<AddBookmarkCommandResult> {
4✔
48
    const { groupId, userId } = command;
4✔
49

50
    const group = await this.groupRepository.findById(groupId);
51
    if (!group) {
52
      throw new NotFoundException(Message.GROUP_NOT_FOUND);
53
    }
5✔
54

5✔
55
    if (group.isCustomerServiceGroup() || group.isPracticeGroup()) {
5✔
56
      throw new UnprocessableEntityException(Message.DEFAULT_BOOKMARKED_GROUP);
1✔
57
    }
58

4✔
59
    const prevBookmark =
2✔
60
      await this.groupBookmarkRepository.findByGroupIdAndUserId(
61
        groupId,
2✔
62
        userId,
2✔
63
      );
1✔
64
    if (prevBookmark) {
65
      return new AddBookmarkCommandResult(prevBookmark);
1✔
66
    }
67

68
    const newBookmark = this.groupBookmarkFactory.create({
69
      id: this.groupBookmarkRepository.nextId(),
70
      groupId,
1✔
71
      userId,
1✔
72
    });
73
    await this.groupBookmarkRepository.save(newBookmark);
74

75
    this.slackSender.send({
76
      category: NotificationCategory.GROUP_ACTIVITY_FOR_ME,
77
      targetUserId: userId,
78
      message: MessageBuilder.build(Template.ADD_GROUP_BOOKMARK.notification, {
79
        groupId,
1✔
80
        groupTitle: group.title,
81
      }),
82
    });
5✔
83

5✔
84
    return new AddBookmarkCommandResult(newBookmark);
5✔
85
  }
5✔
86
}
5✔
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