diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..e2bd63d
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
index c2065bc..75cb773 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,8 @@ bin/
out/
!**/src/main/**/out/
!**/src/test/**/out/
+application.properties
+
### NetBeans ###
/nbproject/private/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ff6abd4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,57 @@
+
+
+
+
+### MEMBER
+
+
+
+
+
+
+### Green Point
+- Green Point는 친환경 포인트 적립 어플리케이션입니다.
+- Green Point는 **기후 변화 대응**이라는 주제를 해결하기 위해 가맹점과 소비자이라는 두 타겟 고객을 설정하여 각 타겟에 맞는 서비스를 구현했습니다.
+ - 가맹점에게 키오스크 웹페이지를 제공하여 고객이 **"친환경"** 소비를 실천할때 포인트를 적립해주는 기능을 제공
+ - 소비자에게 자신의 적립 현황 조회 및 Green Point 가맹점 조회 기능을 제공
+
+
+
+
+
+
+
+
+
+
+
+### 주요 기능
+
+## 소비자
+- 소비자는 React Native로 구현한 어플리케이션 서비스를 기반으로 자신이 친환경 소비를 할 때 적립되는 Green Point를 조회할 수 있으며 현재 자신의 Green Level을 확인할 수 있습니다. 또한, Green Point 가맹점들을 조회하여 자신이 원하는 소비에 맞는 가맹정음 조회할 수 있고 **그린 캘린더** 기능을 이용하여 자신이 적립한 Green Point를 일별로 확인할 수 있습니다.
+
+
+
+
+
+
+
+
+## 가맹점
+- React로 구현한 키오스크 페이지에서는 관리자는 신메뉴를 직접 추가할 수 있고
+- 소비자는 메뉴를 장바구니에 답고 **실시간**으로 선택한 메뉴의 가격을 확인할 수 있으며 최종적으로 결제를 할 수 있습니다.
+- 결제 시스템은 카카오페이를 구현했으며 소비자는 자신의 휴대폰번호를 입력하면 현재 적립되어있는 포인트를 조회할 수 있고 현재 보유중인 포인트를 원하는 만큼 사용할 수 있도록 구현하였습니다.
+- 결제 시 가맹점에서는 사용자가 선택한 **친환경 옵션**에 따라 사용자에게 Green Point를 적립해줄 수 있습니다.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
index f5bd72d..345a735 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,6 +2,7 @@ plugins {
id 'java'
id 'org.springframework.boot' version '2.7.8'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
+ id 'war'
}
group = 'com.greenpoint'
@@ -14,6 +15,10 @@ configurations {
}
}
+bootWar {
+ enabled = true
+}
+
repositories {
mavenCentral()
}
@@ -21,6 +26,9 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
+ implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3'
+ implementation 'org.springframework.boot:spring-boot-starter'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
diff --git a/src/main/java/com/greenpoint/server/ServerApplication.java b/src/main/java/com/greenpoint/server/ServerApplication.java
index a095c1b..bae60a0 100644
--- a/src/main/java/com/greenpoint/server/ServerApplication.java
+++ b/src/main/java/com/greenpoint/server/ServerApplication.java
@@ -2,12 +2,23 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@SpringBootApplication
-public class ServerApplication {
+@EnableJpaAuditing
+public class ServerApplication extends SpringBootServletInitializer {
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(ServerApplication.class);
+ }
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
+
+
+
diff --git a/src/main/java/com/greenpoint/server/admin/controller/AdminController.java b/src/main/java/com/greenpoint/server/admin/controller/AdminController.java
new file mode 100644
index 0000000..a01ae09
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/admin/controller/AdminController.java
@@ -0,0 +1,14 @@
+package com.greenpoint.server.admin.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequiredArgsConstructor
+@CrossOrigin
+@RequestMapping("/api")
+public class AdminController {
+
+}
diff --git a/src/main/java/com/greenpoint/server/admin/model/Admin.java b/src/main/java/com/greenpoint/server/admin/model/Admin.java
new file mode 100644
index 0000000..bd29be1
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/admin/model/Admin.java
@@ -0,0 +1,34 @@
+package com.greenpoint.server.admin.model;
+
+
+import com.greenpoint.server.common.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE admin SET deleted = true Where id = ?")
+public class Admin extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String name;
+ private String adminID;
+ private String password;
+
+
+}
diff --git a/src/main/java/com/greenpoint/server/admin/repository/AdminRepository.java b/src/main/java/com/greenpoint/server/admin/repository/AdminRepository.java
new file mode 100644
index 0000000..f3dbb87
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/admin/repository/AdminRepository.java
@@ -0,0 +1,8 @@
+package com.greenpoint.server.admin.repository;
+
+
+import com.greenpoint.server.admin.model.Admin;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface AdminRepository extends JpaRepository {
+}
diff --git a/src/main/java/com/greenpoint/server/admin/service/AdminService.java b/src/main/java/com/greenpoint/server/admin/service/AdminService.java
new file mode 100644
index 0000000..4711ccb
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/admin/service/AdminService.java
@@ -0,0 +1,7 @@
+package com.greenpoint.server.admin.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class AdminService {
+}
diff --git a/src/main/java/com/greenpoint/server/auth/controller/UserController.java b/src/main/java/com/greenpoint/server/auth/controller/UserController.java
new file mode 100644
index 0000000..4eb2830
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/controller/UserController.java
@@ -0,0 +1,82 @@
+package com.greenpoint.server.auth.controller;
+
+import com.greenpoint.server.auth.response.AccountResponse;
+import com.greenpoint.server.auth.response.LoginResponse;
+import com.greenpoint.server.auth.service.UserService;
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.repository.CustomerRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@RestController
+@RequiredArgsConstructor
+@CrossOrigin
+@RequestMapping("/api")
+public class UserController {
+ @Autowired
+ private UserService userService;
+
+ @GetMapping("/login")
+ public ResponseEntity getLogin(@RequestParam("code") String code) {
+
+ boolean isRegistered;
+ Object[] obArr = new Object[2];
+ Customer userInfo = new Customer();
+ obArr = userService.saveUser(code);
+ System.out.println("obArr = " + obArr);
+ userInfo = (Customer) obArr[0];
+ isRegistered = (boolean) obArr[1];
+ LoginResponse loginResponse = new LoginResponse(userInfo.getKakaoId(), userInfo.getKakaoToken(), userInfo.getNickname(), userInfo.getImage(), isRegistered);
+ return ResponseEntity.ok(loginResponse);
+ }
+
+ @PostMapping("/makeAccount")
+ public ResponseEntity makeAccount(@RequestBody HashMap param) {
+ Boolean result;
+ System.out.println("param = " + param);
+ result = userService.getUserInfoByForm(param);
+ if(result == false) {
+ AccountResponse accountResponse = new AccountResponse(false);
+ return ResponseEntity.ok(accountResponse);
+ }
+ AccountResponse accountResponse = new AccountResponse(true);
+ return ResponseEntity.ok(accountResponse);
+ }
+
+ @Transactional
+ @DeleteMapping("/deleteMember")
+ public String deleteAccount(@RequestParam("id") Long id){
+ String resultCode = "";
+ int result = userService.memberDelete(id);
+ if(result == 0){
+ resultCode = "회원 탈퇴 실패";
+
+ } else {
+// session.removeAttribute("sessionId");
+ resultCode = "회원 탈퇴 성공";
+ }
+ return resultCode;
+ }
+
+}
+
diff --git a/src/main/java/com/greenpoint/server/auth/model/KakaoProfile.java b/src/main/java/com/greenpoint/server/auth/model/KakaoProfile.java
new file mode 100644
index 0000000..1f87c88
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/model/KakaoProfile.java
@@ -0,0 +1,19 @@
+package com.greenpoint.server.auth.model;
+
+import lombok.Data;
+
+@Data
+public class KakaoProfile {
+ private Long id;
+ private Properties properties;
+
+
+
+ @Data
+ public class Properties {
+ public String nickname;
+ public String profile_image; // 이미지 경로 필드1
+ }
+
+
+}
diff --git a/src/main/java/com/greenpoint/server/auth/model/OauthToken.java b/src/main/java/com/greenpoint/server/auth/model/OauthToken.java
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/model/OauthToken.java
@@ -0,0 +1 @@
+
diff --git a/src/main/java/com/greenpoint/server/auth/repository/UserRepository.java b/src/main/java/com/greenpoint/server/auth/repository/UserRepository.java
new file mode 100644
index 0000000..27d5d18
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/repository/UserRepository.java
@@ -0,0 +1,11 @@
+//
+//package com.greenpoint.server.auth.repository;
+//
+//import com.greenpoint.server.customer.model.Customer;
+//import org.springframework.data.jpa.repository.JpaRepository;
+//
+//public interface UserRepository extends JpaRepository {
+//
+//
+//}
+
diff --git a/src/main/java/com/greenpoint/server/auth/response/AccountResponse.java b/src/main/java/com/greenpoint/server/auth/response/AccountResponse.java
new file mode 100644
index 0000000..5df35d2
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/response/AccountResponse.java
@@ -0,0 +1,16 @@
+package com.greenpoint.server.auth.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class AccountResponse {
+// private String nickname;
+// private String contact;
+ private boolean isRegistered;
+}
diff --git a/src/main/java/com/greenpoint/server/auth/response/LoginResponse.java b/src/main/java/com/greenpoint/server/auth/response/LoginResponse.java
new file mode 100644
index 0000000..484bdd8
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/response/LoginResponse.java
@@ -0,0 +1,18 @@
+package com.greenpoint.server.auth.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class LoginResponse {
+ private Long kakaoId;
+ private String token;
+ private String nickname;
+ private String image;
+ private boolean isRegistered;
+}
diff --git a/src/main/java/com/greenpoint/server/auth/service/UserService.java b/src/main/java/com/greenpoint/server/auth/service/UserService.java
new file mode 100644
index 0000000..122a100
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/auth/service/UserService.java
@@ -0,0 +1,119 @@
+package com.greenpoint.server.auth.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.greenpoint.server.auth.model.KakaoProfile;
+import com.greenpoint.server.auth.model.KakaoProfile;
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.repository.CustomerRepository;
+import com.greenpoint.server.level.service.LevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.sql.SQLOutput;
+
+import javax.servlet.http.HttpSession;
+import java.sql.SQLOutput;
+import java.util.HashMap;
+
+@Service
+public class UserService {
+ @Autowired
+ private CustomerRepository customerRepository;
+ @Autowired
+ private LevelService levelService;
+
+ public Object[] saveUser(String token) {
+
+ Object[] obArr = new Object[2];
+ String name = null;
+ String imageUrl = null;
+ Long id = null;
+
+ String userInfo = getUserInfoByAccessToken(token);
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ JsonNode jsonNode = objectMapper.readTree(userInfo);
+ System.out.println(jsonNode);
+ id = Long.valueOf(String.valueOf(jsonNode.get("id")));
+ System.out.println("id = " + id);
+ name = String.valueOf(jsonNode.get("kakao_account").get("profile").get("nickname"));
+ imageUrl = String.valueOf(jsonNode.get("kakao_account").get("profile").get("profile_image_url"));
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+
+ System.out.println("userInfo" + userInfo);
+
+ Customer user;
+
+ user = customerRepository.findByKakaoId(id);
+ System.out.println("user = " + user);
+ if(user == null) {
+ Customer newUser = Customer.from(id, token, name.substring(1, name.length() - 1), imageUrl.substring(1, imageUrl.length() - 1));
+ obArr[0] = newUser;
+ obArr[1] = false;
+ customerRepository.save(newUser);
+ return obArr;
+ }
+
+ obArr[0] = user;
+ obArr[1] = true;
+ return obArr;
+ }
+
+
+ public String getUserInfoByAccessToken(String accessToken) {
+ RestTemplate restTemplate = new RestTemplate();
+ HttpHeaders headers = new HttpHeaders();
+ headers.set("Authorization", "Bearer " + accessToken);
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+ LinkedMultiValueMap params = new LinkedMultiValueMap<>();
+
+ HttpEntity> request = new HttpEntity<>(params, headers);
+
+ String url = "https://kapi.kakao.com/v2/user/me";
+
+ return restTemplate.postForObject(url, request, String.class);
+ }
+ public Boolean getUserInfoByForm(HashMap param) {
+ Customer user;
+
+ Long id = Long.valueOf(param.get("id"));
+ System.out.println("id = " + id);
+ try{
+ user = customerRepository.findByKakaoId(id);
+ user.setContact(param.get("contact"));
+ user.setNickname(param.get("nickname"));
+ user.setLatitude(Double.valueOf(param.get("latitude")));
+ user.setLongitude(Double.valueOf(param.get("longitude")));
+ user.setPoint(0);
+ user.setTotalPoint(0);
+ user.setLevel(levelService.findByGrade(1));
+// user = Customer.from(param.get("nickname"), param.get("contact"));
+ user = customerRepository.save(user);
+ if(user == null){
+ return false;
+ }
+ }
+ catch(Exception e){
+ System.out.println("토큰이 다름!");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public int memberDelete(Long id) {
+ int result = customerRepository.deleteByKakaoId(id);
+ return result;
+ }
+
+}
diff --git a/src/main/java/com/greenpoint/server/common/BaseEntity.java b/src/main/java/com/greenpoint/server/common/BaseEntity.java
new file mode 100644
index 0000000..800c768
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/common/BaseEntity.java
@@ -0,0 +1,37 @@
+package com.greenpoint.server.common;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import javax.persistence.MappedSuperclass;
+import java.time.LocalDateTime;
+
+
+@EntityListeners(AuditingEntityListener.class)
+@MappedSuperclass
+@NoArgsConstructor
+@Getter
+public abstract class BaseEntity {
+
+ @CreatedDate
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
+ @Column(updatable = false)
+ private LocalDateTime created_at;
+
+ @LastModifiedDate
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
+ private LocalDateTime updated_at;
+
+ private boolean deleted = Boolean.FALSE;
+
+ public void deleteContent(){deleted = true;}
+
+
+}
diff --git a/src/main/java/com/greenpoint/server/customer/controller/CustomerController.java b/src/main/java/com/greenpoint/server/customer/controller/CustomerController.java
new file mode 100644
index 0000000..07c5239
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/customer/controller/CustomerController.java
@@ -0,0 +1,37 @@
+package com.greenpoint.server.customer.controller;
+
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.service.CustomerService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+@CrossOrigin
+@RequestMapping("/api")
+public class CustomerController {
+
+ @Autowired
+ private CustomerService customerService;
+ @GetMapping("/readCustomer")
+ public ResponseEntity readCustomer(@RequestParam("id") Long id) {
+
+ Customer customer;
+ customer = customerService.findByKakaoId(id);
+ return ResponseEntity.ok(customer);
+
+ }
+ @GetMapping("/readCustomerByNum")
+ public ResponseEntity readCustomerByNum(@RequestParam("contact") String contact) {
+ Customer customer;
+ customer = customerService.findByContact(contact);
+ return ResponseEntity.ok(customer);
+ }
+}
diff --git a/src/main/java/com/greenpoint/server/customer/model/Customer.java b/src/main/java/com/greenpoint/server/customer/model/Customer.java
new file mode 100644
index 0000000..80cfed2
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/customer/model/Customer.java
@@ -0,0 +1,98 @@
+package com.greenpoint.server.customer.model;
+
+
+import com.greenpoint.server.common.BaseEntity;
+import com.greenpoint.server.level.model.Level;
+import lombok.*;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+
+@Entity
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+//@SQLDelete(sql = "UPDATE customer SET deleted = true Where id = ?")
+public class Customer extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(unique = true)
+ private Long kakaoId;
+
+ @Column(unique = true)
+ private String kakaoToken;
+
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
+ private Level level;
+
+ private String contact;
+ private String image;
+ private String nickname;
+ private double latitude;
+ private double longitude;
+ private int point;
+ private int totalPoint;
+
+ public void insertUserToken(String token){
+ this.kakaoToken = token;
+ }
+
+
+ public int addpoint(int savedPoint) {
+ this.point = this.point + savedPoint;
+ this.totalPoint = this.totalPoint + savedPoint;
+ int grade;
+ if(this.totalPoint >= 1000000) grade = 3;
+ else if(this.totalPoint >= 100000) grade = 2;
+ else grade = 1;
+ return grade;
+ }
+
+ public void usepoint(int usedPoint) {
+ this.point = this.point - usedPoint;
+ }
+
+ public void insertUser(String token, String nickname, String image) {
+ this.kakaoToken = token;
+ this.nickname = nickname;
+ this.image = image;
+ }
+ public void insertUser(String token) {
+ this.kakaoToken = token;
+ }
+
+ public static Customer from (String token, String nickname, String image) {
+ return Customer.builder()
+ .kakaoToken(token)
+ .nickname(nickname)
+ .image(image)
+ .build();
+ }
+ public static Customer from (Long id, String token, String nickname, String image) {
+ return Customer.builder()
+ .kakaoId(id)
+ .kakaoToken(token)
+ .nickname(nickname)
+ .image(image)
+ .build();
+ }
+ public static Customer from (String nickname , String contact) {
+ return Customer.builder()
+ .nickname(nickname)
+ .contact(contact)
+ .build();
+ }
+
+
+ public void upgrade(Level level) {
+ this.level = level;
+ }
+}
diff --git a/src/main/java/com/greenpoint/server/customer/repository/CustomerRepository.java b/src/main/java/com/greenpoint/server/customer/repository/CustomerRepository.java
new file mode 100644
index 0000000..34fee24
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/customer/repository/CustomerRepository.java
@@ -0,0 +1,21 @@
+package com.greenpoint.server.customer.repository;
+
+
+import com.greenpoint.server.customer.model.Customer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+public interface CustomerRepository extends JpaRepository {
+ public Customer findByKakaoToken(String kakaoToken);
+
+// @Query("delete from Customer as c where c.kakaoId= :kakao_id")
+ public int deleteByKakaoId(Long kakaoId);
+
+// @Query("select m from Customer as m where m.kakaoToken = :kakaoToken")
+// public Customer findByToken(String kakaoToken);
+
+// @Query("select m from Customer as m where m.contact = :contact")
+ public Customer findByContact(String contact);
+
+ public Customer findByKakaoId(Long id);
+}
diff --git a/src/main/java/com/greenpoint/server/customer/service/CustomerService.java b/src/main/java/com/greenpoint/server/customer/service/CustomerService.java
new file mode 100644
index 0000000..6f9071c
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/customer/service/CustomerService.java
@@ -0,0 +1,36 @@
+package com.greenpoint.server.customer.service;
+
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.repository.CustomerRepository;
+import com.greenpoint.server.exception.CustomerNotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class CustomerService {
+
+
+ @Autowired
+ private CustomerRepository customerRepository;
+
+ @Transactional
+ public Customer findById(Long id) {
+// Customer ret = customerRepository.findById(id).orElseThrow(CustomerNotFoundException::new);
+ Customer ret = customerRepository.findById(id).get();
+ return ret;
+ }
+
+ @Transactional
+ public Customer findByKakaoId(Long kakaoId) {
+ Customer customer = customerRepository.findByKakaoId(kakaoId);
+ return customer;
+ }
+
+ @Transactional
+ public Customer findByContact(String contact) {
+ Customer customer = customerRepository.findByContact(contact);
+ return customer;
+ }
+
+}
diff --git a/src/main/java/com/greenpoint/server/exception/CustomerNotFoundException.java b/src/main/java/com/greenpoint/server/exception/CustomerNotFoundException.java
new file mode 100644
index 0000000..ff81bb2
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/exception/CustomerNotFoundException.java
@@ -0,0 +1,10 @@
+package com.greenpoint.server.exception;
+
+import org.springframework.http.HttpStatus;
+
+public class CustomerNotFoundException extends GlobalException {
+ public CustomerNotFoundException() {
+ super("존재하지 않는 유저입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
+
diff --git a/src/main/java/com/greenpoint/server/exception/GlobalException.java b/src/main/java/com/greenpoint/server/exception/GlobalException.java
new file mode 100644
index 0000000..592995d
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/exception/GlobalException.java
@@ -0,0 +1,19 @@
+package com.greenpoint.server.exception;
+
+
+import lombok.NoArgsConstructor;
+import org.springframework.http.HttpStatus;
+
+public class GlobalException extends RuntimeException {
+
+ private final HttpStatus httpStatus;
+
+
+ public GlobalException(String message, HttpStatus httpStatus) {
+ super(message);
+ this.httpStatus = httpStatus;
+ }
+ public HttpStatus getHttpStatus() {
+ return httpStatus;
+ }
+}
diff --git a/src/main/java/com/greenpoint/server/history/controller/HistoryController.java b/src/main/java/com/greenpoint/server/history/controller/HistoryController.java
new file mode 100644
index 0000000..1f98f8b
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/controller/HistoryController.java
@@ -0,0 +1,65 @@
+package com.greenpoint.server.history.controller;
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.service.CustomerService;
+import com.greenpoint.server.history.model.History;
+import com.greenpoint.server.history.model.HistoryRequest;
+import com.greenpoint.server.history.model.HistoryResponse;
+import com.greenpoint.server.history.service.HistoryService;
+import com.greenpoint.server.store.model.Store;
+import com.greenpoint.server.store.service.StoreService;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@CrossOrigin
+@RequestMapping("/api")
+public class HistoryController {
+
+ @Autowired
+ private HistoryService historyService;
+ @Autowired
+ private StoreService storeService;
+ @Autowired
+ private CustomerService customerService;
+
+ @GetMapping(value = "/history/{cid}")
+ public ResponseEntity> findAllById(@PathVariable Long cid){
+ List res = historyService.findAllById(cid);
+ return ResponseEntity.ok(res);
+ }
+
+ @PostMapping(value="/history")
+ public ResponseEntity addHistory(@RequestBody HistoryRequest request){
+ Customer customer = customerService.findById(request.getCustomerId());
+ Store store = storeService.findById(request.getStoreId());
+ Long res = historyService.create(History.from(store, request), customer);
+ return ResponseEntity.ok(res);
+ }
+ @GetMapping(value="/dailyHistory")
+ public int[] readDailyHistory(@RequestParam("customerId") Long customerId) throws ParseException {
+ int[] arr = historyService.findDailyHistory(customerId);
+ return arr;
+ }
+
+ @GetMapping(value="/history/three/{cid}")
+ public ResponseEntity> findThreeByCID(@PathVariable Long cid){
+ List res = historyService.findThreeByCID(cid);
+ return ResponseEntity.ok(res);
+ }
+
+
+// @GetMapping(value="/dailyHistory")
+// public List readDailyHistory(@RequestParam("customerId") Long customerId){
+// List histories = historyService.findDailyHistory(customerId);
+// return histories;
+// }
+
+
+}
diff --git a/src/main/java/com/greenpoint/server/history/model/History.java b/src/main/java/com/greenpoint/server/history/model/History.java
new file mode 100644
index 0000000..e8d1559
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/model/History.java
@@ -0,0 +1,53 @@
+package com.greenpoint.server.history.model;
+
+
+import com.greenpoint.server.common.BaseEntity;
+import com.greenpoint.server.customer.model.Customer;
+import com.greenpoint.server.customer.service.CustomerService;
+import com.greenpoint.server.store.model.Store;
+import lombok.*;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE history SET deleted = true Where id = ?")
+public class History extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private Long customerId;
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
+ private Store store;
+
+ private int cost;
+ private int currentPoint;
+ private int savedPoint;
+ private int usedPoint;
+
+
+ public static History from(Store store, HistoryRequest request){
+ return History.builder()
+ .customerId(request.getCustomerId())
+ .store(store)
+ .cost(request.getCost())
+ .savedPoint(request.getSavedPoint())
+ .usedPoint(request.getUsedPoint())
+ .build();
+ }
+
+ public void pointCheck(Customer customer){
+ this.currentPoint = customer.getPoint();
+ }
+
+
+}
diff --git a/src/main/java/com/greenpoint/server/history/model/HistoryCntResponse.java b/src/main/java/com/greenpoint/server/history/model/HistoryCntResponse.java
new file mode 100644
index 0000000..5522d86
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/model/HistoryCntResponse.java
@@ -0,0 +1,23 @@
+package com.greenpoint.server.history.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HistoryCntResponse {
+ Integer dayCnt;
+
+ public static HistoryCntResponse from(Integer cnt){
+ return HistoryCntResponse.builder()
+ .dayCnt(cnt)
+ .build();
+
+ }
+}
+
+
diff --git a/src/main/java/com/greenpoint/server/history/model/HistoryRequest.java b/src/main/java/com/greenpoint/server/history/model/HistoryRequest.java
new file mode 100644
index 0000000..6487b6e
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/model/HistoryRequest.java
@@ -0,0 +1,18 @@
+package com.greenpoint.server.history.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class HistoryRequest {
+ private Long customerId;
+ private Long storeId;
+ private int cost;
+ private int savedPoint;
+ private int usedPoint;
+}
diff --git a/src/main/java/com/greenpoint/server/history/model/HistoryResponse.java b/src/main/java/com/greenpoint/server/history/model/HistoryResponse.java
new file mode 100644
index 0000000..a46b91b
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/model/HistoryResponse.java
@@ -0,0 +1,41 @@
+package com.greenpoint.server.history.model;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HistoryResponse {
+
+ private String storeName;
+ private int savedPoint;
+ private int usedPoint;
+ private int currentPoint;
+ private String image;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
+ private LocalDateTime created_at;
+
+
+
+ public static HistoryResponse from(History history){
+ return HistoryResponse.builder()
+ .storeName(history.getStore().getName())
+ .savedPoint(history.getSavedPoint())
+ .usedPoint(history.getUsedPoint())
+ .currentPoint(history.getCurrentPoint())
+ .image(history.getStore().getImage())
+ .created_at(history.getCreated_at())
+ .build();
+ }
+
+}
diff --git a/src/main/java/com/greenpoint/server/history/repository/HistoryRepository.java b/src/main/java/com/greenpoint/server/history/repository/HistoryRepository.java
new file mode 100644
index 0000000..6a59e6e
--- /dev/null
+++ b/src/main/java/com/greenpoint/server/history/repository/HistoryRepository.java
@@ -0,0 +1,30 @@
+package com.greenpoint.server.history.repository;
+
+
+import com.greenpoint.server.history.model.History;
+import com.greenpoint.server.history.model.HistoryResponse;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public interface HistoryRepository extends JpaRepository {
+
+ @Query("select h from History h where h.customerId = :cid")
+ List findAllById(Long cid);
+
+
+ @Query(nativeQuery = true, value="SELECT DATE(created_at) FROM history where customer_id = :customerId GROUP BY DATE(created_at) order by DATE(created_at) desc limit 1")
+ String findMaxDate(Long customerId);
+
+ @Query(nativeQuery= true, value ="SELECT DATE(created_at) FROM history where not created_at is Null and customer_id = :customerId GROUP BY DATE(created_at) order by DATE(created_at) limit 1")
+ String findMinDate(Long customerId);
+
+ @Query(nativeQuery = true, value="SELECT DATE(created_at) ,COUNT(Id) FROM history where Date(created_at) is not null and customer_id = :customerId GROUP BY DATE(created_at) order by DATE(created_at)")
+// List