• 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

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 {
1✔
15
  ISlackSender,
1✔
16
  SlackSender,
1✔
17
} from '@khlug/app/domain/adapter/ISlackSender';
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 {
1✔
24
  GroupRepository,
25
  IGroupRepository,
20!
26
} from '@khlug/app/domain/group/IGroupRepository';
×
27
import { SlackMessageCategory } from '@khlug/app/domain/message/model/constant';
28

29
import { Message } from '@khlug/constant/message';
30
import { Template } from '@khlug/constant/template';
31

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

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

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

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

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

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

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

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