• 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

79.35
/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 {
1✔
15
  IMessenger,
1✔
16
  MessengerToken,
1✔
17
} from '@khlug/app/domain/adapter/IMessenger';
1✔
18
import { GroupBookmarkFactory } from '@khlug/app/domain/group/GroupBookmarkFactory';
1✔
19
import {
1✔
20
  GroupBookmarkRepository,
1✔
21
  IGroupBookmarkRepository,
1✔
22
} from '@khlug/app/domain/group/IGroupBookmarkRepository';
1✔
23
import {
24
  GroupRepository,
20!
UNCOV
25
  IGroupRepository,
×
26
} from '@khlug/app/domain/group/IGroupRepository';
27

28
import { Message } from '@khlug/constant/error';
29
import { Template } from '@khlug/constant/template';
30

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

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

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

57
    if (group.isCustomerServiceGroup() || group.isPracticeGroup()) {
4✔
58
      throw new UnprocessableEntityException(Message.DEFAULT_BOOKMARKED_GROUP);
2✔
59
    }
60

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

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

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

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