diff --git a/docker-compose.yml b/docker-compose.yml index 65e33c4..6ab31a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,18 @@ services: command: --default-authentication-plugin=mysql_native_password restart: always ports: +<<<<<<< Updated upstream - '3306:3306' environment: MYSQL_ROOT_PASSWORD: badgeload MYSQL_DATABASE: badgeload MYSQL_USER: badgeload - MYSQL_PASSWORD: badgeload \ No newline at end of file + MYSQL_PASSWORD: badgeload +======= + - 3306:3306 + environment: + MYSQL_ROOT_PASSWORD: badgeroad + MYSQL_DATABASE: badgeroad + MYSQL_USER: badgeroad + MYSQL_PASSWORD: password +>>>>>>> Stashed changes diff --git a/pom.xml b/pom.xml index 64387ab..a7bc456 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,24 @@ spring-boot-starter-test test + + com.googlecode.json-simple + json-simple + 1.1.1 + + + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-validation + diff --git a/src/main/java/com/hotnerds/badgeroad/HomeController.java b/src/main/java/com/hotnerds/badgeroad/HomeController.java deleted file mode 100644 index 7a62c65..0000000 --- a/src/main/java/com/hotnerds/badgeroad/HomeController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.hotnerds.badgeroad; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class HomeController { - @GetMapping("/") - public String home() { - return "hello"; - } - - @GetMapping("dashboard") - public String dashboard() { - return "dashboard"; - } - - @GetMapping("admin") - public String admin() { - return "admin"; - } -} \ No newline at end of file diff --git a/src/main/java/com/hotnerds/badgeroad/home/HomeController.java b/src/main/java/com/hotnerds/badgeroad/home/HomeController.java new file mode 100644 index 0000000..6db51b9 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/home/HomeController.java @@ -0,0 +1,18 @@ +package com.hotnerds.badgeroad.home; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String homepage() { + return "index"; + } + + @GetMapping("/user") + public String user() { + return "login"; + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/NaverClient.java b/src/main/java/com/hotnerds/badgeroad/openapi/NaverClient.java new file mode 100644 index 0000000..d0f34b0 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/NaverClient.java @@ -0,0 +1,243 @@ +package com.hotnerds.badgeroad.openapi; + +import com.hotnerds.badgeroad.openapi.dto.SearchImageReq; +import com.hotnerds.badgeroad.openapi.dto.SearchImageRes; +import com.hotnerds.badgeroad.openapi.dto.SearchLocalReq; +import com.hotnerds.badgeroad.openapi.dto.SearchLocalRes; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +@Component +public class NaverClient { + + // yaml 파일 사용하는데 @Value 어노테이션을 사용하며 + // 내부에 "${}"형태로 yaml에 설정한 대로 기입 + @Value("${NAVER-CLIENT}") + String naverClientId; + + @Value("${NAVER-KEY}") + String naverSecret; + + @Value("${naver.url.search.local}") + String naverLocalSearchUrl; + + @Value("${naver.url.search.blog}") + String naverBlogSearchUrl; + + @Value("${naver.url.search.image}") + String naverImageSearchUrl; + + public String searchBlog(String query) { + try { + query = URLEncoder.encode(query, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("검색어 인코딩 실패", e); + } + + String apiURL = naverBlogSearchUrl + + "?query=" + query; + + Map requestHeaders = new HashMap<>(); + requestHeaders.put("X-Naver-Client-Id", naverClientId); + requestHeaders.put("X-Naver-Client-Secret", naverSecret); + String responseBody = get(apiURL, requestHeaders); + System.out.println(responseBody); + + return responseBody; + } + + public String searchImage(String query) { + try { + query = URLEncoder.encode(query, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("검색어 인코딩 실패", e); + } + + String apiURL = naverImageSearchUrl + + "?query=" + query; + + Map requestHeaders = new HashMap<>(); + requestHeaders.put("X-Naver-Client-Id", naverClientId); + requestHeaders.put("X-Naver-Client-Secret", naverSecret); + String responseBody = get(apiURL, requestHeaders); + System.out.println(responseBody); + + return responseBody; + } + + public String searchLocal(String query) { + try { + query = URLEncoder.encode(query, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("검색어 인코딩 실패", e); + } + + String apiURL = naverLocalSearchUrl + + "?query=" + query; + SearchLocalReq searchLocalReq = new SearchLocalReq(); +// URI apiURL = ServletUriComponentsBuilder +// .fromUriString(naverLocalSearchUrl) +// .queryParams(searchLocalReq.toMultiValueMap()) +// .build() +// .encode() +// .toUri(); + + Map requestHeaders = new HashMap<>(); + requestHeaders.put("X-Naver-Client-Id", naverClientId); + requestHeaders.put("X-Naver-Client-Secret", naverSecret); + String responseBody = get(apiURL.toString(), requestHeaders); +// +// +// var uri = UriComponentsBuilder +// .fromUriString(naverLocalSearchUrl) +// .query(query) +// .queryParams(searchLocalReq.toMultiValueMap()) +// .build() +// .encode() +// .toUri(); +// +// System.out.println(apiURL); +// System.out.println(uri); + +// var headers = new HttpHeaders(); +// headers.set("X-Naver-Client-Id", naverClientId); +// headers.set("X-Naver-Client-Secret", naverSecret); +// headers.setContentType(MediaType.APPLICATION_JSON); +// +// var httpEntity = new HttpEntity<>(headers); +// var responseType = new ParameterizedTypeReference(){}; +// +// +// var responseEntity = new RestTemplate() +// .exchange( +// uri, +// HttpMethod.GET, +// httpEntity, +// responseType +// ); + + + return responseBody; + } + + private String get(String apiUrl, Map requestHeaders) { + HttpURLConnection con = connect(apiUrl); + + try { + con.setRequestMethod("GET"); + for (Map.Entry header: requestHeaders.entrySet()) { + con.setRequestProperty(header.getKey(), header.getValue()); + } + + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + return readBody(con.getInputStream()); + } else { + return readBody(con.getErrorStream()); + } + } catch (IOException e) { + throw new RuntimeException("API 요청과 응답 실패", e); + } finally { + con.disconnect(); + } + } + + private HttpURLConnection connect(String apiUrl) { + try { + URL url = new URL(apiUrl); + return (HttpURLConnection)url.openConnection(); + } catch (MalformedURLException e) { + throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e); + } catch (IOException e) { + throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e); + } + } + + private String readBody(InputStream body) { + InputStreamReader streamReader = new InputStreamReader(body); + + try (BufferedReader lineReader = new BufferedReader(streamReader)) { + StringBuilder responseBody = new StringBuilder(); + + String line; + while ((line = lineReader.readLine()) != null) { + responseBody.append(line); + } + + return responseBody.toString(); + } catch (IOException e) { + throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e); + } + } + + public SearchLocalRes searchLocal(SearchLocalReq searchLocalReq) { + var uri = UriComponentsBuilder + .fromUriString(naverLocalSearchUrl) + .queryParams(searchLocalReq.toMultiValueMap()) + .build() + .encode() + .toUri(); + + var headers = new HttpHeaders(); + headers.set("X-Naver-Client-Id", naverClientId); + headers.set("X-Naver-Client-Secret", naverSecret); + headers.setContentType(MediaType.APPLICATION_JSON); + + var httpEntity = new HttpEntity<>(headers); + var responseType = new ParameterizedTypeReference(){}; + + + var responseEntity = new RestTemplate() + .exchange( + uri, + HttpMethod.GET, + httpEntity, + responseType + ); + + return responseEntity.getBody(); + } + + public SearchImageRes searchImage(SearchImageReq searchImageReq) { + var uri = UriComponentsBuilder + .fromUriString(naverImageSearchUrl) + .queryParams(searchImageReq.toMultiValueMap()) + .build() + .encode() + .toUri(); + + var headers = new HttpHeaders(); + headers.set("X-Naver-Client-Id", naverClientId); + headers.set("X-Naver-Client-Secret", naverSecret); + headers.setContentType(MediaType.APPLICATION_JSON); + + var httpEntity = new HttpEntity<>(headers); + var responseType = new ParameterizedTypeReference(){}; + + + var responseEntity = new RestTemplate() + .exchange( + uri, + HttpMethod.GET, + httpEntity, + responseType + ); + + return responseEntity.getBody(); + } +} \ No newline at end of file diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/OpenApiController.java b/src/main/java/com/hotnerds/badgeroad/openapi/OpenApiController.java new file mode 100644 index 0000000..f987658 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/OpenApiController.java @@ -0,0 +1,41 @@ +package com.hotnerds.badgeroad.openapi; + +import lombok.RequiredArgsConstructor; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/openapi") +public class OpenApiController { + @Autowired + NaverClient naver = new NaverClient(); + + @ResponseBody + @GetMapping("naver/blog") + public ResponseEntity getPlace(@RequestParam("query") String query) throws Exception { + JSONParser parser = new JSONParser(); + Object obj = parser.parse(naver.searchBlog(query)); + JSONObject jsonObj = (JSONObject) obj; + return ResponseEntity.ok(jsonObj); + } + + @ResponseBody + @GetMapping("/naver/image") + public ResponseEntity getImage(@RequestParam("query") String query) throws Exception { + JSONParser parser = new JSONParser(); + JSONObject jsonObj = (JSONObject)parser.parse(naver.searchImage(query)); + return ResponseEntity.ok(jsonObj); + } + + @ResponseBody + @GetMapping("/naver/local") + public ResponseEntity getLocal(@RequestParam("query") String query) throws Exception { + JSONParser parser = new JSONParser(); + JSONObject jsonObj = (JSONObject)parser.parse(naver.searchLocal(query)); + return ResponseEntity.ok(jsonObj); + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageReq.java b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageReq.java new file mode 100644 index 0000000..f457fb4 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageReq.java @@ -0,0 +1,35 @@ +package com.hotnerds.badgeroad.openapi.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SearchImageReq { + // 지역 검색 요청 변수에 대한 변수 생성 + private String query = ""; + private int display = 1; // 검색 결과 출력 건수 지정(10 ~ 100) + + private int start = 1; // 검색 시작 위치로 최대 1000까지 가능 + + private String sort = "sim"; // 정렬 옵션: sim (유사도순), date (날짜순) + + private String filter = "all "; // 사이즈 필터 옵션: all(전체), large(큰 사이즈), medium(중간 사이즈), small(작은 사이즈) + + public MultiValueMap toMultiValueMap() { + var map = new LinkedMultiValueMap(); + + map.add("query", query); + map.add("display", String.valueOf(display)); + map.add("start", String.valueOf(start)); + map.add("sort", sort); + map.add("filter", filter); + + return map; + + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageRes.java b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageRes.java new file mode 100644 index 0000000..278dd66 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchImageRes.java @@ -0,0 +1,28 @@ +package com.hotnerds.badgeroad.openapi.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +public class SearchImageRes { + // 지역 검색 출력 결과를 변수화 + + private String lastBuildDate; // 검색 결과를 생성한 시간이다. + private int total; // 검색 결과 문서의 총 개수를 의미한다. + private int start; // 검색 결과 문서 중, 문서의 시작점을 의미한다. + private int display; // 검색된 검색 결과의 개수이다. + private List items; // XML 포멧에서는 item 태그로, JSON 포멧에서는 items 속성으로 표현된다. 개별 검색 결과이며 title, link, description, address, mapx, mapy를 포함한다. + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class SearchImageItem{ + private String title; // 검색 결과 업체, 기관명을 나타낸다. + private String link; // 검색 결과 업체, 기관의 상세 정보가 제공되는 네이버 페이지의 하이퍼텍스트 link를 나타낸다. + private String thumbnail; // 검색 결과 이미지의 썸네일 link를 나타낸다. + private String sizeheight; // 검색 결과 이미지의 썸네일 높이를 나타낸다. + private String sizewidth; // 검색 결과 이미지의 너비를 나타낸다. 단위는 pixel이다. + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalReq.java b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalReq.java new file mode 100644 index 0000000..0d3190f --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalReq.java @@ -0,0 +1,32 @@ +package com.hotnerds.badgeroad.openapi.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SearchLocalReq { + // 지역 검색 요청 변수에 대한 변수 생성 + private String query = ""; + private int display = 1; // 검색 결과 출력 건수 지정(1 ~ 5) + + private int start = 1; // 검색 시작 위치로 1만 가능 + + private String sort = "random"; // 정렬 옵션: random(유사도순), comment(카페/블로그 리뷰 개수 순) + + public MultiValueMap toMultiValueMap() { + var map = new LinkedMultiValueMap(); + + map.add("query", query); + map.add("display", String.valueOf(display)); + map.add("start", String.valueOf(start)); + map.add("sort", sort); + + return map; + + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalRes.java b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalRes.java new file mode 100644 index 0000000..df7f7a3 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/openapi/dto/SearchLocalRes.java @@ -0,0 +1,36 @@ +package com.hotnerds.badgeroad.openapi.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SearchLocalRes { + + // 지역 검색 출력 결과를 변수화 + + private String lastBuildDate; // 검색 결과를 생성한 시간이다. + private int total; // 검색 결과 문서의 총 개수를 의미한다. + private int start; // 검색 결과 문서 중, 문서의 시작점을 의미한다. + private int display; // 검색된 검색 결과의 개수이다. + private List items; // XML 포멧에서는 item 태그로, JSON 포멧에서는 items 속성으로 표현된다. 개별 검색 결과이며 title, link, description, address, mapx, mapy를 포함한다. + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class SearchLocalItem{ + private String title; // 검색 결과 업체, 기관명을 나타낸다. + private String link; // 검색 결과 업체, 기관의 상세 정보가 제공되는 네이버 페이지의 하이퍼텍스트 link를 나타낸다. + private String category; // 검색 결과 업체, 기관의 분류 정보를 제공한다. + private String description; // 검색 결과 업체, 기관명에 대한 설명을 제공한다. + private String telephone; // 빈 문자열 반환. 과거에 제공되던 항목이라 하위 호환성을 위해 존재한다. + private String address; // 검색 결과 업체, 기관명의 주소를 제공한다. + private String roadAddress; // 검색 결과 업체, 기관명의 도로명 주소를 제공한다. + private int mapx; // 검색 결과 업체, 기관명 위치 정보의 x좌표를 제공한다. 제공값은 카텍좌표계 값으로 제공된다. 이 좌표값은 지도 API와 연동 가능하다. + private int mapy; // 검색 결과 업체, 기관명 위치 정보의 y좌표를 제공한다. 제공값은 카텍 좌표계 값으로 제공된다. 이 좌표값은 지도 API와 연동 가능하다. + } +} \ No newline at end of file diff --git a/src/main/java/com/hotnerds/badgeroad/store/controller/StoreController.java b/src/main/java/com/hotnerds/badgeroad/store/controller/StoreController.java new file mode 100644 index 0000000..2d92dc4 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/store/controller/StoreController.java @@ -0,0 +1,4 @@ +package com.hotnerds.badgeroad.store.controller; + +public class StoreController { +} diff --git a/src/main/java/com/hotnerds/badgeroad/store/entity/Store.java b/src/main/java/com/hotnerds/badgeroad/store/entity/Store.java new file mode 100644 index 0000000..98aaafa --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/store/entity/Store.java @@ -0,0 +1,64 @@ +package com.hotnerds.badgeroad.store.entity; + +import lombok.*; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "store") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicInsert +public class Store { + + @Id + private Long management_number; + + @Column + private String store_name; + + @Column + private String location_code; + + @Column + private Integer category_code; + + @Column + private String category_name; + + @Column + private Integer industry_code; + + @Column + private String industry_name; + + @Column + private Integer food_authentication_num; + + @Column + private String food_authentication_name; + + @Column + private Double map_y; + + @Column + private Double map_x; + + @Column + private String phone_number; + + @Column + private String address; + + @Column + @ColumnDefault("0") + private Integer liked; +} diff --git a/src/main/java/com/hotnerds/badgeroad/store/repository/StoreRepository.java b/src/main/java/com/hotnerds/badgeroad/store/repository/StoreRepository.java new file mode 100644 index 0000000..e26a9b6 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/store/repository/StoreRepository.java @@ -0,0 +1,16 @@ +package com.hotnerds.badgeroad.store.repository; + +import com.hotnerds.badgeroad.store.entity.Store; +import com.hotnerds.badgeroad.user.entity.Badge; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.PersistenceContext; +import java.util.List; + +public interface StoreRepository extends JpaRepository { + +} diff --git a/src/main/java/com/hotnerds/badgeroad/store/service/StoreService.java b/src/main/java/com/hotnerds/badgeroad/store/service/StoreService.java new file mode 100644 index 0000000..e6598f4 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/store/service/StoreService.java @@ -0,0 +1,16 @@ +package com.hotnerds.badgeroad.store.service; + +import com.hotnerds.badgeroad.store.entity.Store; +import com.hotnerds.badgeroad.store.repository.StoreRepository; +import com.hotnerds.badgeroad.user.entity.Role; +import lombok.AllArgsConstructor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@AllArgsConstructor +public class StoreService { + private final StoreRepository storeRepository; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/controller/UserController.java b/src/main/java/com/hotnerds/badgeroad/user/controller/UserController.java new file mode 100644 index 0000000..605ad60 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/controller/UserController.java @@ -0,0 +1,71 @@ +package com.hotnerds.badgeroad.user.controller; + +import com.hotnerds.badgeroad.user.dto.LoginDto; +import com.hotnerds.badgeroad.user.dto.UserDto; +import com.hotnerds.badgeroad.user.entity.User; +import com.hotnerds.badgeroad.user.service.UserService; +import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/user") +public class UserController { + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/login") + public String login() { + return "login"; + } + + @PostMapping("/login") + public String loginConfirm(@Valid @RequestBody LoginDto loginDto) { + if (userService.login(loginDto)) { + return "main"; + } else { + return "login"; + } + } + + @GetMapping("/hello") + public ResponseEntity hello() { + return ResponseEntity.ok("hello"); + } + + @GetMapping("/{email}") + public ResponseEntity getUserInfo(@PathVariable String email) { + return ResponseEntity.ok(userService.findByEmail(email)); + } + + @GetMapping("/signup") + public String showRegistrationForm(Model model){ + UserDto user = new UserDto(); + model.addAttribute("user", user); + return "signup"; + } + + + + // handler method to handle Member registration request + + + // handler method to handle register Member form submit request + @PostMapping("/signup") + public ResponseEntity signup(@Valid @RequestBody UserDto userDto){ + return ResponseEntity.ok(userService.signup(userDto)); + } + + @GetMapping("/users") + public String listRegisteredMembers(Model model){ + List users = userService.findAllUsers(); + model.addAttribute("Users", users); + return "users"; + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/dto/BadgeDto.java b/src/main/java/com/hotnerds/badgeroad/user/dto/BadgeDto.java new file mode 100644 index 0000000..aae45e5 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/dto/BadgeDto.java @@ -0,0 +1,15 @@ +package com.hotnerds.badgeroad.user.dto; + +import javax.validation.constraints.NotNull; + +public class BadgeDto { + + @NotNull + private String name; + + @NotNull + private String location; + + @NotNull + private String category; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/dto/LoginDto.java b/src/main/java/com/hotnerds/badgeroad/user/dto/LoginDto.java new file mode 100644 index 0000000..9760d77 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/dto/LoginDto.java @@ -0,0 +1,24 @@ +package com.hotnerds.badgeroad.user.dto; + +import lombok.*; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class LoginDto { + + @NotNull + @Size(min = 3, max = 50) + @Email + private String email; + + @NotNull + @Size(min = 3, max = 100) + private String password; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/dto/SignupDto.java b/src/main/java/com/hotnerds/badgeroad/user/dto/SignupDto.java new file mode 100644 index 0000000..7b3097a --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/dto/SignupDto.java @@ -0,0 +1,25 @@ +package com.hotnerds.badgeroad.user.dto; + + +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Getter +@Setter +public class SignupDto { + + @NotNull + @Size(min = 3, max = 50) + private String email; + + @NotNull + @Size(min = 3, max = 100) + private String password; + + @NotNull + @Size(min = 3, max = 50) + private String nickname; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/dto/UserDto.java b/src/main/java/com/hotnerds/badgeroad/user/dto/UserDto.java new file mode 100644 index 0000000..afbbddc --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/dto/UserDto.java @@ -0,0 +1,42 @@ +package com.hotnerds.badgeroad.user.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.hotnerds.badgeroad.user.entity.User; +import lombok.*; + +import javax.persistence.Id; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.stream.Collectors; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UserDto { + + @NotNull + @Size(min = 3, max = 50) + @Email + private String email; + + @NotNull + @Size(min = 3, max = 100) + private String password; + + @NotNull + @Size(min = 3, max = 50) + private String name; + + public static UserDto from(User user) { + if(user == null) return null; + + return UserDto.builder() + .email(user.getEmail()) + .password(user.getPassword()) + .name(user.getName()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/hotnerds/badgeroad/user/entity/Badge.java b/src/main/java/com/hotnerds/badgeroad/user/entity/Badge.java new file mode 100644 index 0000000..298712b --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/entity/Badge.java @@ -0,0 +1,29 @@ +package com.hotnerds.badgeroad.user.entity; + +import lombok.*; + +import javax.persistence.*; + +@Entity +@Table(name = "badge") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Badge { + + @Id + @Column(name = "badge_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long badgeId; + + @Column(name = "name", length = 50, unique = true) + private String name; + + @Column(name = "location", length = 10) + private String location; + + @Column(name = "category", length = 20) + private String category; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/entity/Role.java b/src/main/java/com/hotnerds/badgeroad/user/entity/Role.java new file mode 100644 index 0000000..8b18988 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/entity/Role.java @@ -0,0 +1,25 @@ +package com.hotnerds.badgeroad.user.entity; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; +import java.util.List; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name="role") +public class Role +{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable=false, unique=true) + private String name; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/entity/User.java b/src/main/java/com/hotnerds/badgeroad/user/entity/User.java new file mode 100644 index 0000000..3a34d9b --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/entity/User.java @@ -0,0 +1,47 @@ +package com.hotnerds.badgeroad.user.entity; + +import lombok.*; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; + +import javax.persistence.*; +import javax.validation.constraints.Email; +import java.util.Set; + +@Entity +@Table(name = "`user`") +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@DynamicInsert +public class User { + + @Id + @Column(name = "user_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long userId; + + @Column(name = "email", length = 50, unique = true) + @Email + private String email; + + @Column(name = "password", length = 100) + private String password; + + @Column(name = "name", length = 50) + private String name; + + @Column(name = "level") + @ColumnDefault("1") + private Integer level; + + @OneToMany + @JoinTable( + name = "user_badges", + joinColumns = {@JoinColumn(name = "email", referencedColumnName = "email")}, + inverseJoinColumns = {@JoinColumn(name = "badge_name", referencedColumnName = "name")} + ) + private Set badges; +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/exception/DuplicateUserException.java b/src/main/java/com/hotnerds/badgeroad/user/exception/DuplicateUserException.java new file mode 100644 index 0000000..ecc7c55 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/exception/DuplicateUserException.java @@ -0,0 +1,16 @@ +package com.hotnerds.badgeroad.user.exception; + +public class DuplicateUserException extends RuntimeException { + public DuplicateUserException() { + super(); + } + public DuplicateUserException(String message, Throwable cause) { + super(message, cause); + } + public DuplicateUserException(String message) { + super(message); + } + public DuplicateUserException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/exception/NotFoundUserException.java b/src/main/java/com/hotnerds/badgeroad/user/exception/NotFoundUserException.java new file mode 100644 index 0000000..7def7aa --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/exception/NotFoundUserException.java @@ -0,0 +1,16 @@ +package com.hotnerds.badgeroad.user.exception; + +public class NotFoundUserException extends RuntimeException { + public NotFoundUserException() { + super(); + } + public NotFoundUserException(String message, Throwable cause) { + super(message, cause); + } + public NotFoundUserException(String message) { + super(message); + } + public NotFoundUserException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/repository/BadgeRepository.java b/src/main/java/com/hotnerds/badgeroad/user/repository/BadgeRepository.java new file mode 100644 index 0000000..2319b1b --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/repository/BadgeRepository.java @@ -0,0 +1,11 @@ +package com.hotnerds.badgeroad.user.repository; + +import com.hotnerds.badgeroad.user.entity.Badge; +import org.springframework.data.jpa.repository.JpaRepository; + + +import java.util.Optional; + +public interface BadgeRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/repository/RoleRepository.java b/src/main/java/com/hotnerds/badgeroad/user/repository/RoleRepository.java new file mode 100644 index 0000000..6ae104b --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/repository/RoleRepository.java @@ -0,0 +1,8 @@ +package com.hotnerds.badgeroad.user.repository; + +import com.hotnerds.badgeroad.user.entity.Role; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RoleRepository extends JpaRepository { + Role findByName(String name); +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/repository/UserRepository.java b/src/main/java/com/hotnerds/badgeroad/user/repository/UserRepository.java new file mode 100644 index 0000000..1dae4ef --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/repository/UserRepository.java @@ -0,0 +1,16 @@ +package com.hotnerds.badgeroad.user.repository; + +import com.hotnerds.badgeroad.user.entity.Badge; +import com.hotnerds.badgeroad.user.entity.User; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); + + @EntityGraph(attributePaths = "badge") + List findAllBadgesByEmail(String email); +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/service/BadgeService.java b/src/main/java/com/hotnerds/badgeroad/user/service/BadgeService.java new file mode 100644 index 0000000..6175897 --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/service/BadgeService.java @@ -0,0 +1,30 @@ +package com.hotnerds.badgeroad.user.service; + +import com.hotnerds.badgeroad.store.repository.StoreRepository; +import com.hotnerds.badgeroad.user.entity.Badge; +import com.hotnerds.badgeroad.user.repository.BadgeRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@AllArgsConstructor +public class BadgeService { + + BadgeRepository badgeRepository; + + public Optional findByName(String name) { + return badgeRepository.findByName(name); + } + + public List findAllBadges() { + return badgeRepository.findAll(); + } + + public void putAllBadgesFromStore() { +// StoreRepository + } + +} diff --git a/src/main/java/com/hotnerds/badgeroad/user/service/UserService.java b/src/main/java/com/hotnerds/badgeroad/user/service/UserService.java new file mode 100644 index 0000000..673feba --- /dev/null +++ b/src/main/java/com/hotnerds/badgeroad/user/service/UserService.java @@ -0,0 +1,83 @@ +package com.hotnerds.badgeroad.user.service; + +import com.hotnerds.badgeroad.user.dto.LoginDto; +import com.hotnerds.badgeroad.user.dto.UserDto; +import com.hotnerds.badgeroad.user.entity.Badge; +import com.hotnerds.badgeroad.user.entity.User; +import com.hotnerds.badgeroad.user.exception.DuplicateUserException; +import com.hotnerds.badgeroad.user.exception.NotFoundUserException; +import com.hotnerds.badgeroad.user.repository.UserRepository; +import lombok.AllArgsConstructor; +import org.apache.catalina.mapper.Mapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + + +@Service +@AllArgsConstructor +public class UserService { + private final UserRepository userRepository; + + private final JdbcTemplate jdbcTemplate; + @Transactional + public UserDto findByEmail(String email) { + return UserDto.from(userRepository.findByEmail(email).orElse(null)); + } + + public User userDtoToUser(UserDto userDto) { + return User.builder() + .email(userDto.getEmail()) + .password(userDto.getPassword()) + .name(userDto.getName()) + .build(); + } + + public void saveUser(User user) { + userRepository.save(user); + } + + public List findAllUsers() { + return userRepository.findAll(); + } + + @Transactional + public UserDto signup(UserDto userDto) { + if (userRepository.findByEmail(userDto.getEmail()).orElse(null) != null) { + throw new DuplicateUserException("이미 가입되어 있는 유저입니다."); + } + + User user = User.builder() + .email(userDto.getEmail()) + .password(userDto.getPassword()) + .name(userDto.getName()) + .build(); + + return UserDto.from(userRepository.save(user)); + } + + public Boolean login(LoginDto loginDto) { + Optional user = userRepository.findByEmail(loginDto.getEmail()); + + return user.map(value -> value.getPassword().equals(loginDto.getPassword())).orElse(false); + + + } + +// public List findAllBadgesByEmail(String email) { +// Map params = new HashMap<>(); +// params.put("email", email); +// Optional user = userRepository.findByEmail(email); +// +// return jdbcTemplate.queryForList( +// "SELECT " + +// "badge_name" + +// "FROM " + +// "user_badges" + +// "WHERE " + +// "email = :email", params); +// ) +// } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 619e1ed..f271321 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,25 +12,38 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/badgeroad?useSSL=false&allowPublicKeyRetrieval=true username: root - password: jeong1998# - + password: jeong1998 profiles: include: API-KEY + sql: + init: + mode: always jpa: database: mysql database-platform: org.hibernate.dialect.MySQL5InnoDBDialect +# hibernate: +# ddl-auto: create properties: hibernate: show_sql: true format_sql: true use_sql_comments: true + defer-datasource-initialization: true logging: level: org: hibernate: info +# +#jwt: +# header: Authorization +# #HS512 알고리즘을 사용할 것이기 때문에 512bit, 즉 64byte 이상의 secret key를 사용해야 한다. +# #echo 'silvernine-tech-spring-boot-jwt-tutorial-secret-silvernine-tech-spring-boot-jwt-tutorial-secret'|base64 +# secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK +# token-validity-in-seconds: 86400 + naver: url: search: diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql new file mode 100644 index 0000000..f5cf19b --- /dev/null +++ b/src/main/resources/sql/data.sql @@ -0,0 +1,9 @@ +-- insert into user (email, password, name) values ('admin@admin.com', 'admin', 'admin'); +-- insert into user (email, password, name) values ('user@user.com', 'user', 'user'); + +-- insert into authority (authority_name) values ('ROLE_USER'); +-- insert into authority (authority_name) values ('ROLE_ADMIN'); +-- +-- insert into user_authority (user_id, authority_name) values (1, 'ROLE_USER'); +-- insert into user_authority (user_id, authority_name) values (1, 'ROLE_ADMIN'); +-- insert into user_authority (user_id, authority_name) values (2, 'ROLE_USER'); \ No newline at end of file diff --git a/src/main/resources/templates/common.html b/src/main/resources/templates/common.html new file mode 100644 index 0000000..f72ff04 --- /dev/null +++ b/src/main/resources/templates/common.html @@ -0,0 +1,35 @@ + + + + + + Spring boot Service + + + + + + + + 홈 (current) + + + 게시판 (current) + + + register + login + + + 사용자 + 권한 + logout + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..b7983cf --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,12 @@ + + + + + + +HOME +LOGIN +SIGNUP + + + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..ddc455e --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,102 @@ + + + + + + + LOGIN + + +HOME +LOGIN +SIGNUP + + + + Email * + + + + Password * + + + + Login + Not registered? + Register/SignUp Here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html new file mode 100644 index 0000000..706303f --- /dev/null +++ b/src/main/resources/templates/main.html @@ -0,0 +1,13 @@ + + + + + + + +HOME +LOGIN +SIGNUP + + + \ No newline at end of file diff --git a/src/main/resources/templates/members.html b/src/main/resources/templates/members.html new file mode 100644 index 0000000..fa4ccce --- /dev/null +++ b/src/main/resources/templates/members.html @@ -0,0 +1,54 @@ + + + + + Registration and Login System + + + + + + Registration and Login System + + + + + + + Register + + + Logout + + + + + + + + Registered Users + + + + + First Name + Last Name + Email + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/signup.html b/src/main/resources/templates/signup.html new file mode 100644 index 0000000..f071edd --- /dev/null +++ b/src/main/resources/templates/signup.html @@ -0,0 +1,74 @@ + + + + + + + + +HOME +LOGIN +SIGNUP + + + + + + You've successfully registered + to our app! + + + Registration + + + + + + Name + + + + Email + + + + + + Password + + + + + + + Register + Already registered? Login + here + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/user_access.html b/src/main/resources/templates/user_access.html new file mode 100644 index 0000000..d64f584 --- /dev/null +++ b/src/main/resources/templates/user_access.html @@ -0,0 +1,13 @@ + + + + + + + user access + + +환영합니다 + + + \ No newline at end of file diff --git a/src/test/java/com/hotnerds/badgeroad/JDBCTests.java b/src/test/java/com/hotnerds/badgeroad/JDBCTests.java new file mode 100644 index 0000000..3642cbc --- /dev/null +++ b/src/test/java/com/hotnerds/badgeroad/JDBCTests.java @@ -0,0 +1,49 @@ +package com.hotnerds.badgeroad; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; + +import java.sql.Connection; +import java.sql.DriverManager; + +import static org.junit.Assert.fail; + +@SpringBootTest +public class JDBCTests { + + @Value("${spring.datasource.url}") + String url_; + + @Value("${spring.datasource.username}") + String user_; + + @Value("${spring.datasource.password}") + String password_; + + static { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testConnection() { + + String url = "jdbc:mysql://localhost:3306/badgeroad?useSSL=false&allowPublicKeyRetrieval=true"; + String user = "root"; + String password = "jeong1998"; + try(Connection con = + DriverManager.getConnection( + url, + user, + password)){ + System.out.println(con); + } catch (Exception e) { + fail(e.getMessage()); + } + + } +}
+