Skip to content

Commit eb9db45

Browse files
authored
Merge pull request #135 from Mango-Butter/dev
release: dev -> main
2 parents e7aac66 + 489db0d commit eb9db45

25 files changed

Lines changed: 256 additions & 120 deletions

File tree

.github/workflows/cd-dev.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ jobs:
143143
echo "TOSS_PAYMENT_SECRET_KEY=${{ secrets.TOSS_PAYMENT_SECRET_KEY }}" >> .env
144144
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env
145145
echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> .env
146+
echo "REDIS_URL=${{ secrets.REDIS_URL }}" >> .env
146147
147148
148149
echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin

app/src/main/java/com/mangoboss/app/api/facade/store/BossStoreFacade.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public class BossStoreFacade {
4848
@Transactional
4949
public StoreCreateResponse createStore(final Long userId, final StoreCreateRequest request) {
5050
final UserEntity boss = userService.getUserById(userId);
51-
storeService.validateBusinessNumber(request.businessNumber());
5251
final StoreEntity saved = storeService.createStore(request, boss);
5352
payrollSettingService.initPayrollSettingForStore(saved);
5453
requiredDocumentService.initRequiredDocuments(saved);

app/src/main/java/com/mangoboss/app/api/facade/store/StaffStoreFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class StaffStoreFacade {
2626
public StaffJoinResponse joinStaff(final Long userId, final StaffJoinRequest request) {
2727
final UserEntity user = userService.getUserById(userId);
2828
final StoreEntity store = storeService.getStoreByInviteCode(request.inviteCode());
29-
staffService.createStaff(user, store);
29+
staffService.createStaff(user, store, store.getBoss());
3030
return StaffJoinResponse.fromEntity(store);
3131
}
3232

app/src/main/java/com/mangoboss/app/api/facade/subscription/SubscriptionFacade.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.mangoboss.app.domain.service.billing.BillingService;
44
import com.mangoboss.app.domain.service.subscription.SubscriptionService;
5+
import com.mangoboss.app.domain.service.user.UserService;
56
import com.mangoboss.app.dto.subscription.request.SubscriptionCreateRequest;
67
import com.mangoboss.app.dto.subscription.response.SubscriptionOrderResponse;
78
import com.mangoboss.app.dto.subscription.response.SubscriptionResponse;
9+
import com.mangoboss.storage.user.UserEntity;
810
import lombok.RequiredArgsConstructor;
911
import org.springframework.stereotype.Service;
1012

@@ -16,10 +18,12 @@ public class SubscriptionFacade {
1618

1719
private final SubscriptionService subscriptionService;
1820
private final BillingService billingService;
21+
private final UserService userService;
1922

2023
public void createOrReplaceSubscription(Long bossId, SubscriptionCreateRequest request) {
2124
billingService.validateBillingExists(bossId);
22-
subscriptionService.createOrReplaceSubscription(bossId, request.planType());
25+
UserEntity boss = userService.getUserById(bossId);
26+
subscriptionService.createOrReplaceSubscription(boss, request.planType());
2327
}
2428

2529
public SubscriptionResponse getSubscription(Long bossId) {

app/src/main/java/com/mangoboss/app/api/facade/workreport/StaffWorkReportFacade.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mangoboss.app.api.facade.workreport;
22

33
import com.mangoboss.app.common.util.S3PreSignedUrlManager;
4+
import com.mangoboss.app.domain.service.notification.NotificationService;
45
import com.mangoboss.app.domain.service.staff.StaffService;
56
import com.mangoboss.app.domain.service.workreport.WorkReportService;
67
import com.mangoboss.app.dto.s3.response.UploadPreSignedUrlResponse;
@@ -9,6 +10,7 @@
910
import com.mangoboss.storage.metadata.S3FileType;
1011
import com.mangoboss.storage.staff.StaffEntity;
1112
import com.mangoboss.storage.workreport.WorkReportEntity;
13+
import com.mangoboss.storage.workreport.WorkReportTargetType;
1214
import lombok.RequiredArgsConstructor;
1315
import org.springframework.stereotype.Service;
1416

@@ -21,11 +23,18 @@ public class StaffWorkReportFacade {
2123

2224
private final WorkReportService workReportService;
2325
private final StaffService staffService;
26+
private final NotificationService notificationService;
2427
private final S3PreSignedUrlManager s3PreSignedUrlManager;
2528

2629
public WorkReportResponse createWorkReport(final Long storeId, final Long userId, final WorkReportCreateRequest request) {
2730
StaffEntity staff = staffService.getVerifiedStaff(userId, storeId);
2831
final WorkReportEntity entity = workReportService.createWorkReport(storeId, staff.getId(), request.content(), request.reportImageUrl(), request.targetType());
32+
33+
if (request.targetType() == WorkReportTargetType.TO_BOSS) {
34+
final Long bossUserId = staff.getStore().getBoss().getId();
35+
notificationService.saveWorkReportNotificationToBoss(bossUserId, storeId, staff.getUser().getName());
36+
}
37+
2938
return WorkReportResponse.fromEntity(entity, staff);
3039
}
3140

app/src/main/java/com/mangoboss/app/common/exception/CustomErrorInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public enum CustomErrorInfo {
6868
DOCUMENT_NOT_BELONG_TO_STAFF(403, "이 서류는 해당 알바생의 서류가 아닙니다.", 403006),
6969
FORBIDDEN_TASK_LOG_DELETE(403, "해당 업무 완료 기록을 삭제할 권한이 없습니다.", 403007),
7070
WORK_REPORT_ACCESS_DENIED(403, "보고사항 접근 권한이 없습니다.", 403008),
71+
PLAN_LIMIT_EXCEEDED(403, "무료 요금제는 매장 2개, 알바생 5명 까지만 가능합니다.",403009),
7172

7273
// 422 Unprocessable Entity
7374
CONTRACT_PDF_TAMPERED(422, "계약서 PDF의 무결성이 손상되었습니다.", 422001),

app/src/main/java/com/mangoboss/app/domain/repository/SubscriptionRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import java.util.Optional;
66

77
public interface SubscriptionRepository {
8-
void save(SubscriptionEntity subscriptionEntity);
8+
SubscriptionEntity save(SubscriptionEntity subscriptionEntity);
99
Optional<SubscriptionEntity> findByBossId(Long bossId);
1010
void delete(SubscriptionEntity subscriptionEntity);
1111
boolean existsByBossId(Long bossId);

app/src/main/java/com/mangoboss/app/domain/service/notification/NotificationService.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,15 @@ private void saveNotification(final Long userId, final Long storeId, final Strin
2828
final String content, final NotificationType type, final String path) {
2929
final String clickUrl = frontendUrl + path;
3030
final List<String> tokens = deviceTokenRepository.findActiveTokensByUserId(userId);
31-
for (String token : tokens) {
32-
final NotificationEntity notification = NotificationEntity.create(
33-
userId, storeId, title, content, null, clickUrl, type, token
34-
);
31+
32+
if (tokens.isEmpty()) {
33+
final NotificationEntity notification = NotificationEntity.create(userId, storeId, title, content, null, clickUrl, type, null);
3534
notificationRepository.save(notification);
35+
} else {
36+
for (String token : tokens) {
37+
final NotificationEntity notification = NotificationEntity.create(userId, storeId, title, content, null, clickUrl, type, token);
38+
notificationRepository.save(notification);
39+
}
3640
}
3741
}
3842

@@ -159,4 +163,17 @@ public void saveAttendanceEditRejectNotification(final AttendanceEditEntity atte
159163
public List<NotificationEntity> getNotificationsByUserAndStore(final Long userId, final Long storeId) {
160164
return notificationRepository.findByUserIdAndStoreIdOrderByCreatedAtDesc(userId, storeId);
161165
}
166+
167+
@Transactional
168+
public void saveWorkReportNotificationToBoss(final Long bossUserId, final Long storeId, final String staffName) {
169+
String content = String.format("%s님이 보고사항을 작성했어요.", staffName);
170+
saveNotification(
171+
bossUserId,
172+
storeId,
173+
"보고사항 작성",
174+
content,
175+
NotificationType.WORK_REPORT,
176+
"/boss/task?type=report"
177+
);
178+
}
162179
}

app/src/main/java/com/mangoboss/app/domain/service/staff/StaffService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,23 @@
1919
@RequiredArgsConstructor
2020
@Transactional(readOnly = true)
2121
public class StaffService {
22+
private static final int PLAN_LIMIT_STAFF_NUM = 5;
2223
private final StaffRepository staffRepository;
2324

2425
@Transactional
25-
public StaffEntity createStaff(final UserEntity user, final StoreEntity store) {
26+
public StaffEntity createStaff(final UserEntity user, final StoreEntity store, final UserEntity boss) {
2627
isAlreadyJoin(user, store);
28+
if (boss.getSubscription() == null && getStaffsNum(store.getId()) >= PLAN_LIMIT_STAFF_NUM) {
29+
throw new CustomException(CustomErrorInfo.PLAN_LIMIT_EXCEEDED);
30+
}
2731
final StaffEntity staff = StaffEntity.create(user, store);
2832
return staffRepository.save(staff);
2933
}
3034

35+
private Integer getStaffsNum(final Long storeId) {
36+
return getStaffsForStore(storeId).size();
37+
}
38+
3139
public StaffEntity validateStaffBelongsToStore(final Long storeId, final Long staffId) {
3240
return staffRepository.getByIdAndStoreId(staffId, storeId);
3341
}

app/src/main/java/com/mangoboss/app/domain/service/store/StoreService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
@Transactional
2424
public class StoreService {
2525
private static final String CHAR_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
26+
private static final int PLAN_LIMIT_STORE_NUM = 2;
2627
private static final int INVITE_CODE_LENGTH = 6;
2728
private static final int QR_CODE_LENGTH = 12;
2829

@@ -58,13 +59,20 @@ public StoreEntity getStoreById(final Long storeId) {
5859

5960
@Transactional
6061
public StoreEntity createStore(final StoreCreateRequest request, final UserEntity boss) {
62+
if (boss.getSubscription() == null && getStoresNum(boss.getId()) >= PLAN_LIMIT_STORE_NUM){
63+
throw new CustomException(CustomErrorInfo.PLAN_LIMIT_EXCEEDED);
64+
}
6165
validateBusinessNumber(request.businessNumber());
6266
final String inviteCode = generateInviteCode();
6367
final String attendanceQrCode = generateQrCode();
6468
final StoreEntity store = request.toEntity(boss, inviteCode, attendanceQrCode);
6569
return storeRepository.save(store);
6670
}
6771

72+
private Integer getStoresNum(final Long bossId) {
73+
return storeRepository.findAllByBossId(bossId).size();
74+
}
75+
6876
private String generateInviteCode() {
6977
String code;
7078
do {

0 commit comments

Comments
 (0)