├── upload └── .keep ├── settings.gradle ├── README.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── src ├── main │ ├── java │ │ └── dabang │ │ │ └── star │ │ │ └── cafe │ │ │ ├── domain │ │ │ ├── manager │ │ │ │ ├── Role.java │ │ │ │ ├── Manager.java │ │ │ │ └── ManagerRepository.java │ │ │ ├── authentication │ │ │ │ ├── EncryptService.java │ │ │ │ ├── ManagerLoginService.java │ │ │ │ └── MemberLoginService.java │ │ │ ├── order │ │ │ │ ├── OrderRepository.java │ │ │ │ ├── OrderProductRepository.java │ │ │ │ ├── OrderProduct.java │ │ │ │ └── Order.java │ │ │ ├── service │ │ │ │ ├── UploadService.java │ │ │ │ └── PushService.java │ │ │ ├── category │ │ │ │ ├── Category.java │ │ │ │ ├── CategoryRepository.java │ │ │ │ └── CategoryType.java │ │ │ ├── office │ │ │ │ ├── Office.java │ │ │ │ ├── OfficeRepository.java │ │ │ │ └── Location.java │ │ │ ├── option │ │ │ │ ├── Option.java │ │ │ │ └── OptionRepository.java │ │ │ ├── mymenu │ │ │ │ ├── MyMenu.java │ │ │ │ └── MyMenuRepository.java │ │ │ ├── product │ │ │ │ ├── ProductOption.java │ │ │ │ ├── Product.java │ │ │ │ └── ProductRepository.java │ │ │ └── member │ │ │ │ ├── Member.java │ │ │ │ └── MemberRepository.java │ │ │ ├── utils │ │ │ ├── CacheKey.java │ │ │ ├── CacheName.java │ │ │ ├── SessionKey.java │ │ │ └── page │ │ │ │ ├── Pagination.java │ │ │ │ └── Page.java │ │ │ ├── application │ │ │ ├── exception │ │ │ │ ├── PaymentException.java │ │ │ │ ├── FileUploadException.java │ │ │ │ ├── ParseException.java │ │ │ │ ├── NoAuthenticationException.java │ │ │ │ ├── NoAuthorizationException.java │ │ │ │ ├── ResourceNotFoundException.java │ │ │ │ └── DuplicatedException.java │ │ │ ├── data │ │ │ │ ├── MyMenuInfoData.java │ │ │ │ ├── OfficeSearchData.java │ │ │ │ ├── MyMenuData.java │ │ │ │ ├── TypeCategoryData.java │ │ │ │ ├── MemberData.java │ │ │ │ ├── OfficeData.java │ │ │ │ ├── ManagerData.java │ │ │ │ ├── CategoryData.java │ │ │ │ ├── ProductOptionData.java │ │ │ │ └── ProductData.java │ │ │ ├── command │ │ │ │ ├── OfficeSearchCommand.java │ │ │ │ ├── ProductOptionCommand.java │ │ │ │ ├── CategoryCreateCommand.java │ │ │ │ ├── ManagerUpdateCommand.java │ │ │ │ ├── CategoryUpdateCommand.java │ │ │ │ ├── OfficeUpdateCommand.java │ │ │ │ ├── OptionCreateCommand.java │ │ │ │ ├── ManagerCreateCommand.java │ │ │ │ ├── OfficeCreateCommand.java │ │ │ │ ├── MyMenuCreateCommand.java │ │ │ │ ├── OptionUpdateCommand.java │ │ │ │ ├── MemberUpdateCommand.java │ │ │ │ ├── SignUpCommand.java │ │ │ │ ├── ProductCreateCommand.java │ │ │ │ └── ProductUpdateCommand.java │ │ │ ├── OfficeQueryService.java │ │ │ ├── OfficeAdminService.java │ │ │ ├── PaymentService.java │ │ │ ├── MemberService.java │ │ │ ├── OptionAdminService.java │ │ │ ├── CategoryAdminService.java │ │ │ ├── ManagerAdminService.java │ │ │ └── MenuService.java │ │ │ ├── api │ │ │ ├── aop │ │ │ │ ├── SessionId.java │ │ │ │ ├── CurrentMemberCheck.java │ │ │ │ ├── LoginCheck.java │ │ │ │ └── AuthCheckAspect.java │ │ │ ├── request │ │ │ │ ├── DealValidationRequest.java │ │ │ │ ├── TokenRequest.java │ │ │ │ ├── CurrentMemberRequest.java │ │ │ │ ├── ManagerLoginRequest.java │ │ │ │ └── MemberLoginRequest.java │ │ │ ├── PaymentApi.java │ │ │ ├── OfficeSearchApi.java │ │ │ ├── ManagerApi.java │ │ │ ├── OfficeAdminApi.java │ │ │ ├── MemberApi.java │ │ │ ├── CurrentMemberApi.java │ │ │ ├── MenuApi.java │ │ │ ├── OptionAdminApi.java │ │ │ ├── ManagerAdminApi.java │ │ │ ├── CategoryAdminApi.java │ │ │ └── ProductAdminApi.java │ │ │ ├── infrastructure │ │ │ ├── mapper │ │ │ │ ├── OrderMapper.java │ │ │ │ ├── ProductOptionMapper.java │ │ │ │ ├── OrderProductMapper.java │ │ │ │ ├── MyMenuMapper.java │ │ │ │ ├── CategoryMapper.java │ │ │ │ ├── OptionMapper.java │ │ │ │ ├── MemberMapper.java │ │ │ │ ├── ManagerMapper.java │ │ │ │ ├── OfficeMapper.java │ │ │ │ └── ProductMapper.java │ │ │ ├── repository │ │ │ │ ├── MyBatisOrderRepository.java │ │ │ │ ├── MyBatisOrderProductRepository.java │ │ │ │ ├── MybatisMyMenuRepository.java │ │ │ │ ├── MybatisMemberRepository.java │ │ │ │ ├── MybatisOptionRepository.java │ │ │ │ ├── MybatisCategoryRepository.java │ │ │ │ ├── MybatisOfficeRepository.java │ │ │ │ ├── MybatisManagerRepository.java │ │ │ │ └── MybatisProductRepository.java │ │ │ ├── service │ │ │ │ ├── SHA256EncryptService.java │ │ │ │ ├── SessionManagerLoginService.java │ │ │ │ ├── SessionMemberLoginService.java │ │ │ │ ├── CloudStorageService.java │ │ │ │ └── FCMPushService.java │ │ │ ├── mybatis │ │ │ │ ├── LocationHandler.java │ │ │ │ └── MapJsonTypeHandler.java │ │ │ ├── redis │ │ │ │ └── RedisCacheConfig.java │ │ │ └── firebase │ │ │ │ └── FCMConfig.java │ │ │ ├── CafeApplication.java │ │ │ └── IamportConfig.java │ └── resources │ │ ├── data-test.sql │ │ ├── log4j2.yaml │ │ ├── bootstrap.yaml │ │ ├── mybatis-mapper │ │ ├── OrderMapper.xml │ │ ├── ProductOptionMapper.xml │ │ ├── OrderProductMapper.xml │ │ ├── CategoryMapper.xml │ │ ├── MemberMapper.xml │ │ ├── OptionMapper.xml │ │ ├── MyMenuMapper.xml │ │ ├── ManagerMapper.xml │ │ └── OfficeMapper.xml │ │ ├── data-dev.sql │ │ ├── application.yaml │ │ └── schema-h2.sql └── test │ ├── resources │ └── clean.sql │ └── java │ └── dabang │ └── star │ └── cafe │ ├── CafeApplicationTests.java │ ├── EmbeddedRedisConfig.java │ ├── infrastructure │ └── repository │ │ ├── MybatisMemberRepositoryTest.java │ │ └── MybatisOptionRepositoryTest.java │ ├── domain │ ├── authentication │ │ └── SessionManagerLoginServiceTest.java │ └── admin │ │ └── OptionAdminServiceTest.java │ └── acceptance │ └── MemberAcceptanceTest.java ├── README.md ├── .gitignore └── gradlew.bat /upload/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'cafe' 2 | -------------------------------------------------------------------------------- /README.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/f-lab-edu/star-dabang/HEAD/README.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/f-lab-edu/star-dabang/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/manager/Role.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.manager; 2 | 3 | public enum Role { 4 | 5 | ADMIN, MANAGER 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/utils/CacheKey.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.utils; 2 | 3 | public interface CacheKey { 4 | 5 | String DEFAULT = "'ALL'"; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/authentication/EncryptService.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.authentication; 2 | 3 | public interface EncryptService { 4 | 5 | String encrypt(String original); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/utils/CacheName.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.utils; 2 | 3 | public interface CacheName { 4 | 5 | String CATEGORY = "CATEGORIES"; 6 | 7 | String PRODUCT = "PRODUCTS"; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/PaymentException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class PaymentException extends RuntimeException { 4 | 5 | public PaymentException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/FileUploadException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class FileUploadException extends RuntimeException { 4 | 5 | public FileUploadException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/ParseException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class ParseException extends RuntimeException { 4 | 5 | public ParseException(Throwable cause) { 6 | super(cause); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/data-test.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO office(office_name, address, location) 2 | VALUES ('본사', '제주도 제주시 돌하르방 12-34', 'POINT(127.232323323 37.3737372323)'); 3 | 4 | INSERT INTO manager(office_id, name, passwd, role) 5 | VALUES (1, 'root', HASH('SHA256', STRINGTOUTF8('root'), 256), 'ADMIN'); 6 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/NoAuthenticationException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class NoAuthenticationException extends RuntimeException { 4 | 5 | public NoAuthenticationException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/NoAuthorizationException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class NoAuthorizationException extends RuntimeException { 4 | 5 | public NoAuthorizationException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/exception/ResourceNotFoundException.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.exception; 2 | 3 | public class ResourceNotFoundException extends RuntimeException { 4 | 5 | public ResourceNotFoundException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/order/OrderRepository.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.order; 2 | 3 | import java.util.Optional; 4 | 5 | public interface OrderRepository { 6 | 7 | void save(Order order); 8 | 9 | Optional findById(long id); 10 | 11 | void deleteById(long orderId); 12 | } 13 | -------------------------------------------------------------------------------- /src/test/resources/clean.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM order_product; 2 | DELETE FROM orders; 3 | DELETE FROM my_menu; 4 | DELETE FROM office_stock; 5 | DELETE FROM product_option; 6 | DELETE FROM product; 7 | DELETE FROM additional_option; 8 | DELETE FROM product_category; 9 | DELETE FROM manager; 10 | DELETE FROM office; 11 | DELETE FROM member; -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/authentication/ManagerLoginService.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.authentication; 2 | 3 | import dabang.star.cafe.application.data.ManagerData; 4 | 5 | public interface ManagerLoginService { 6 | 7 | ManagerData login(String name, String password); 8 | 9 | void logout(); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/service/UploadService.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.service; 2 | 3 | import org.springframework.web.multipart.MultipartFile; 4 | 5 | import java.io.IOException; 6 | 7 | public interface UploadService { 8 | 9 | String upload(MultipartFile multipartFile, String dirPrefix) throws IOException; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/order/OrderProductRepository.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.order; 2 | 3 | import java.util.Optional; 4 | 5 | public interface OrderProductRepository { 6 | 7 | void save(OrderProduct orderProduct); 8 | 9 | Optional findById(long id); 10 | 11 | long sumTotalPriceByOrderId(long orderId); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/aop/SessionId.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.aop; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.PARAMETER) 10 | public @interface SessionId { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/data/MyMenuInfoData.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.data; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class MyMenuInfoData { 9 | 10 | private Long myMenuId; 11 | 12 | private String myMenuName; 13 | 14 | private ProductData product; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/authentication/MemberLoginService.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.authentication; 2 | 3 | 4 | import dabang.star.cafe.application.data.MemberData; 5 | 6 | public interface MemberLoginService { 7 | 8 | MemberData login(String email, String password); 9 | 10 | void logout(); 11 | 12 | MemberData accessMyPage(long id, String password); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/aop/CurrentMemberCheck.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.aop; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.METHOD) 10 | public @interface CurrentMemberCheck { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/category/Category.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.category; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class Category { 11 | 12 | private Integer id; 13 | 14 | private String name; 15 | 16 | private CategoryType categoryType; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/data/OfficeSearchData.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.data; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class OfficeSearchData { 9 | 10 | private Integer id; 11 | 12 | private String name; 13 | 14 | private String address; 15 | 16 | private String distance; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/service/PushService.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.service; 2 | 3 | public interface PushService { 4 | 5 | void sendToMember(long id, String title, String message); 6 | 7 | void sendToManager(long id, String title, String message); 8 | 9 | void registerMemberToken(long memberId, String token); 10 | 11 | void registerManagerToken(Long id, String token); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/utils/SessionKey.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.utils; 2 | 3 | public interface SessionKey { 4 | 5 | /** 6 | * 로그인 회원의 ID를 가져오는 세션 키 7 | */ 8 | String LOGIN_ID = "LOGIN"; 9 | 10 | /** 11 | * 마이 페이지 접속 ID를 가져오는 세션 키 12 | */ 13 | String CURRENT_MEMBER_ID = "CURRENT"; 14 | 15 | 16 | /** 17 | * 관리자의 권한을 관리하는 세션 키 18 | */ 19 | String MANAGER_ROLE = "ROLE"; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/request/DealValidationRequest.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.request; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 10 | @AllArgsConstructor 11 | public class DealValidationRequest { 12 | 13 | private String impUid; 14 | 15 | private String merchantUid; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/office/Office.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.office; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | import java.math.BigDecimal; 8 | 9 | @Getter 10 | @Builder 11 | @AllArgsConstructor 12 | public class Office { 13 | 14 | private Integer id; 15 | 16 | private String name; 17 | 18 | private String address; 19 | 20 | private Location location; 21 | } 22 | -------------------------------------------------------------------------------- /src/test/java/dabang/star/cafe/CafeApplicationTests.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | import org.springframework.test.context.ActiveProfiles; 6 | 7 | @ActiveProfiles("test") 8 | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 9 | class CafeApplicationTests { 10 | 11 | @Test 12 | void contextLoads() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/aop/LoginCheck.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.aop; 2 | 3 | import dabang.star.cafe.domain.manager.Role; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @Target(ElementType.METHOD) 12 | public @interface LoginCheck { 13 | 14 | Role[] role() default {}; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/option/Option.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.option; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | @Builder 11 | @Getter 12 | public class Option { 13 | 14 | private Long id; 15 | 16 | private String name; 17 | 18 | private Integer price; 19 | 20 | private Integer maxQuantity; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/infrastructure/mapper/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.infrastructure.mapper; 2 | 3 | import dabang.star.cafe.domain.order.Order; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.Optional; 7 | 8 | @Mapper 9 | public interface OrderMapper { 10 | 11 | void insert(Order order); 12 | 13 | void update(Order order); 14 | 15 | Optional getById(long id); 16 | 17 | void removeById(long orderId); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/mymenu/MyMenu.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.mymenu; 2 | 3 | import lombok.*; 4 | 5 | import java.util.Map; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 11 | public class MyMenu { 12 | 13 | private Long id; 14 | 15 | private String name; 16 | 17 | private Long productId; 18 | 19 | private Long memberId; 20 | 21 | private Map optionInfo; 22 | 23 | } 24 | 25 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/request/TokenRequest.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.request; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | @Getter 11 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 12 | @AllArgsConstructor 13 | public class TokenRequest { 14 | 15 | @NotBlank(message = "blank token") 16 | private String token; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/data/MyMenuData.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.data; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.Map; 8 | 9 | @Getter 10 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 11 | public class MyMenuData { 12 | 13 | private Long id; 14 | 15 | private String name; 16 | 17 | private Long productId; 18 | 19 | private Map optionInfo; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/manager/Manager.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.manager; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class Manager { 11 | 12 | private Long id; 13 | 14 | private Integer officeId; 15 | 16 | private String name; 17 | 18 | private String password; 19 | 20 | private Role role; 21 | 22 | private String token; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/mymenu/MyMenuRepository.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.mymenu; 2 | 3 | import dabang.star.cafe.application.data.MyMenuData; 4 | 5 | import java.util.List; 6 | import java.util.Optional; 7 | 8 | public interface MyMenuRepository { 9 | 10 | void save(MyMenu myMenu); 11 | 12 | List findAllByMemberId(long memberId); 13 | 14 | Optional findById(long myMenuId); 15 | 16 | int deleteByIdAndMemberId(long myMenuId, long memberId); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/request/CurrentMemberRequest.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.request; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | @Getter 11 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 12 | @AllArgsConstructor 13 | public class CurrentMemberRequest { 14 | 15 | @NotBlank(message = "blank password") 16 | private String password; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/product/ProductOption.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.product; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Builder 8 | @Getter 9 | @AllArgsConstructor 10 | public class ProductOption { 11 | 12 | private Long productId; 13 | 14 | private Long optionId; 15 | 16 | private Integer quantity; 17 | 18 | public void setProductId(Long productId) { 19 | this.productId = productId; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/member/Member.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.member; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class Member { 11 | 12 | private Long id; 13 | 14 | private String email; 15 | 16 | private String password; 17 | 18 | private String nickname; 19 | 20 | private String telephone; 21 | 22 | private String birth; 23 | 24 | private String token; 25 | 26 | } -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/infrastructure/mapper/ProductOptionMapper.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.infrastructure.mapper; 2 | 3 | import dabang.star.cafe.domain.product.ProductOption; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.List; 7 | 8 | @Mapper 9 | public interface ProductOptionMapper { 10 | 11 | void insertList(List productOptions); 12 | 13 | void updateList(List productOptions); 14 | 15 | long removeById(long productId, List deleteOptions); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/infrastructure/mapper/OrderProductMapper.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.infrastructure.mapper; 2 | 3 | import dabang.star.cafe.domain.order.OrderProduct; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.Optional; 7 | 8 | @Mapper 9 | public interface OrderProductMapper { 10 | 11 | void insert(OrderProduct orderProduct); 12 | 13 | void update(OrderProduct orderProduct); 14 | 15 | long addAllPriceByOrderId(long orderId); 16 | 17 | Optional getById(long id); 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # star-dabang 2 | 3 | ![구성도](https://github.com/f-lab-edu/star-dabang/blob/develop/README.png?raw=true) 4 | 5 | ## ⚽ Project Goals 6 | * 스타벅스 어플리케이션을 모티브로 하여 만든 서버 API입니다. 7 | * 단순 기능 구현뿐만 아니라 대용량 트래픽을 가정하여 개발해서 이용자가 급증하더라도 견고한 어플리케이션을 만드는 것이 목표입니다. 8 | 9 | 10 | 11 | ## 🚀 Project Tech Stacks 12 | * OpenJDK 11 13 | * Spring Boot 2.4 + Gradle 14 | * MySQL 5.7 + MyBatis 15 | * ProxySQL + Orchestrator 16 | * Redis 5.0 17 | * Log4j2 18 | * Jenkins 19 | * Pinpoint, nGrinder 20 | * Google Cloud Platform (Compute Engine, Cloud Storge, Secret Manager) 21 | -------------------------------------------------------------------------------- /src/main/resources/log4j2.yaml: -------------------------------------------------------------------------------- 1 | Configutation: 2 | name: Default 3 | status: warn 4 | 5 | Appenders: 6 | Console: 7 | name: Console_Appender 8 | target: SYSTEM_OUT 9 | PatternLayout: 10 | pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" 11 | Loggers: 12 | Root: 13 | level: info 14 | AppenderRef: 15 | - ref: Console_Appender 16 | Logger: 17 | - name: dabang.star 18 | additivity: false 19 | level: debug 20 | AppenderRef: 21 | - ref: Console_Appender -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/application/data/TypeCategoryData.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.application.data; 2 | 3 | import dabang.star.cafe.domain.category.CategoryType; 4 | import lombok.AccessLevel; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 14 | public class TypeCategoryData { 15 | 16 | private CategoryType type; 17 | 18 | private List category; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/resources/bootstrap.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev 4 | --- 5 | spring: 6 | config: 7 | activate: 8 | on-profile: dev 9 | 10 | cloud: 11 | gcp: 12 | secretmanager: 13 | enabled: false 14 | 15 | --- 16 | spring: 17 | config: 18 | activate: 19 | on-profile: test 20 | 21 | cloud: 22 | gcp: 23 | secretmanager: 24 | enabled: false 25 | 26 | --- 27 | spring: 28 | config: 29 | activate: 30 | on-profile: prod 31 | 32 | cloud: 33 | gcp: 34 | secretmanager: 35 | enabled: true 36 | 37 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/CafeApplication.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cache.annotation.EnableCaching; 6 | import org.springframework.context.annotation.EnableAspectJAutoProxy; 7 | 8 | @EnableCaching 9 | @EnableAspectJAutoProxy 10 | @SpringBootApplication 11 | public class CafeApplication { 12 | 13 | public static void main(String[] args) { 14 | SpringApplication.run(CafeApplication.class, args); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/api/request/ManagerLoginRequest.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.api.request; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | @Getter 11 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 12 | @AllArgsConstructor 13 | public class ManagerLoginRequest { 14 | 15 | @NotBlank(message = "blank name") 16 | private String name; 17 | 18 | @NotBlank(message = "blank password") 19 | private String password; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/dabang/star/cafe/domain/option/OptionRepository.java: -------------------------------------------------------------------------------- 1 | package dabang.star.cafe.domain.option; 2 | 3 | import dabang.star.cafe.utils.page.Page; 4 | import dabang.star.cafe.utils.page.Pagination; 5 | 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | public interface OptionRepository { 10 | 11 | void save(Option option); 12 | 13 | Page