From cee835630816260ac207cd9083f40d9a6a51b83c Mon Sep 17 00:00:00 2001 From: Ok JaeOok Date: Sun, 24 Mar 2024 23:00:32 +0900 Subject: [PATCH] =?UTF-8?q?init:=20=EC=A7=84=ED=96=89=EC=A4=91=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/report_bug.md | 50 + .github/pull_request_template.md | 19 + .github/workflows/FUNDING.yml | 2 + .github/workflows/auto-release.yml | 29 + .github/workflows/ci-test.yml | 50 + .gitignore | 38 + Dockerfile | 27 + app/build.gradle | 9 + .../java/blisgo/app/BlisgoApplication.java | 23 + app/src/main/resources/application-dev.yml | 48 + app/src/main/resources/application-prod.yml | 36 + app/src/main/resources/application.yml | 5 + app/src/main/resources/banner.txt | 8 + app/src/main/resources/data.sql | 948 ++++++++++++++++++ .../db/migration/V2__insert_guide.sql | 22 + .../db/migration/V3__insert_waste.sql | 378 +++++++ .../migration/V4__insert_waste_categories.sql | 356 +++++++ .../db/migration/V5__insert_account.sql | 0 .../db/migration/V6__insert_board_values.sql | 0 .../db/migration/V7__insert_reply_values.sql | 0 autoexecute.bat | 15 + build.gradle | 60 ++ buildSrc/build.gradle | 9 + docker-compose.yml | 18 + domain/build.gradle | 5 + .../main/java/blisgo/domain/DomainRoot.java | 7 + .../java/blisgo/domain/common/Author.java | 15 + .../java/blisgo/domain/common/Content.java | 19 + .../java/blisgo/domain/common/Hashtag.java | 13 + .../java/blisgo/domain/common/Picture.java | 13 + .../java/blisgo/domain/community/Post.java | 51 + .../java/blisgo/domain/community/Reply.java | 25 + .../blisgo/domain/community/vo/PostId.java | 13 + .../blisgo/domain/community/vo/ReplyId.java | 13 + .../java/blisgo/domain/dictionary/Dogam.java | 31 + .../java/blisgo/domain/dictionary/Waste.java | 30 + .../blisgo/domain/dictionary/vo/Category.java | 29 + .../blisgo/domain/dictionary/vo/DogamId.java | 13 + .../blisgo/domain/dictionary/vo/Guide.java | 16 + .../blisgo/domain/dictionary/vo/WasteId.java | 13 + .../java/blisgo/domain/member/Member.java | 34 + .../blisgo/domain/member/vo/MemberId.java | 18 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 +++++ gradlew.bat | 92 ++ infrastructure/external/build.gradle | 13 + .../infrastructure/external/ExternalRoot.java | 7 + .../handler/PostViewedEventHandler.java | 23 + .../external/redis/RedisConfigDev.java | 67 ++ .../external/redis/RedisConfigProd.java | 80 ++ .../external/redis/SchedulerConfig.java | 26 + .../external/redis/ViewCountCache.java | 32 + .../scheduler/ViewCountScheduler.java | 30 + infrastructure/internal/build.gradle | 90 ++ .../infrastructure/internal/InternalRoot.java | 7 + .../persistence/base/ContentConverter.java | 80 ++ .../internal/persistence/base/JpaConfig.java | 36 + .../persistence/base/MapperConfig.java | 24 + .../persistence/base/NoOffsetSliceHelper.java | 17 + .../persistence/base/OidcAuditorAware.java | 39 + .../persistence/base/PersistenceMapper.java | 24 + .../persistence/common/BaseEntity.java | 25 + .../persistence/common/BaseTimeEntity.java | 34 + .../persistence/common/JpaAuthor.java | 30 + .../persistence/common/JpaContent.java | 15 + .../persistence/common/JpaPicture.java | 19 + .../community/PostMySQLAdapter.java | 86 ++ .../community/ReplyMySQLAdapter.java | 50 + .../community/mapper/PostMapper.java | 34 + .../community/mapper/ReplyMapper.java | 30 + .../persistence/community/model/JpaPost.java | 54 + .../persistence/community/model/JpaReply.java | 36 + .../repository/PostCustomRepository.java | 75 ++ .../repository/PostJpaRepository.java | 8 + .../repository/ReplyCustomRepository.java | 34 + .../repository/ReplyJpaRepository.java | 8 + .../dictionary/DogamMySQLAdapter.java | 41 + .../dictionary/WasteMySQLAdapter.java | 60 ++ .../dictionary/mapper/DogamMapper.java | 30 + .../dictionary/mapper/GuideMapper.java | 30 + .../dictionary/mapper/WasteMapper.java | 30 + .../dictionary/model/JpaDogam.java | 25 + .../dictionary/model/JpaDogamId.java | 21 + .../dictionary/model/JpaGuide.java | 30 + .../dictionary/model/JpaWaste.java | 61 ++ .../repository/DogamCustomRepository.java | 13 + .../repository/DogamJpaRepository.java | 18 + .../repository/GuideJpaRepository.java | 8 + .../repository/WasteCustomRepository.java | 79 ++ .../repository/WasteJpaRepository.java | 10 + .../member/MemberMySQLAdapter.java | 58 ++ .../member/mapper/MemberMapper.java | 30 + .../persistence/member/model/JpaMember.java | 45 + .../repository/MemberCustomRepository.java | 13 + .../repository/MemberJpaRepository.java | 13 + .../internal/rest/JacksonConfig.java | 20 + .../internal/rest/Uploadable.java | 11 + .../security/CustomOidcUserService.java | 40 + .../internal/security/SecurityConfig.java | 96 ++ .../internal/ui/base/CustomServletConfig.java | 16 + .../internal/ui/base/Router.java | 32 + .../internal/ui/base/TimeDiffUtil.java | 42 + .../internal/ui/component/UnsplashClient.java | 71 ++ .../ui/component/WallpaperChanger.java | 21 + .../internal/ui/render/DogamRender.java | 70 ++ .../internal/ui/render/MemberRender.java | 39 + .../internal/ui/render/PostRender.java | 102 ++ .../internal/ui/render/ReplyRender.java | 78 ++ .../internal/ui/render/WasteRender.java | 66 ++ .../internal/ui/response/DogamDTO.java | 18 + .../internal/ui/response/GuideDTO.java | 15 + .../internal/ui/response/MemberDTO.java | 21 + .../internal/ui/response/PostDTO.java | 23 + .../internal/ui/response/ReplyDTO.java | 27 + .../internal/ui/response/WasteDTO.java | 25 + .../internal/ui/view/CommunityView.java | 68 ++ .../internal/ui/view/DictionaryView.java | 29 + .../internal/ui/view/HomeView.java | 34 + .../internal/ui/view/MemberView.java | 17 + .../src/main/resources/application-common.yml | 0 .../src/main/resources/application-oauth.yml | 13 + .../src/main/resources/application-redis.yml | 14 + .../main/resources/application-thymeleaf.yml | 34 + .../static/assets/css/cmmn/editor-js.css | 24 + .../static/assets/css/cmmn/style.css | 46 + .../static/assets/img/favicon/16x16.png | Bin 0 -> 847 bytes .../static/assets/img/favicon/180x180.png | Bin 0 -> 11098 bytes .../static/assets/img/favicon/192x192.png | Bin 0 -> 11903 bytes .../static/assets/img/favicon/32x32.png | Bin 0 -> 1781 bytes .../static/assets/img/favicon/512x512.png | Bin 0 -> 32701 bytes .../assets/img/screenshots/mobile_1.webp | Bin 0 -> 25814 bytes .../assets/img/screenshots/mobile_2.webp | Bin 0 -> 29512 bytes .../assets/img/screenshots/mobile_3.webp | Bin 0 -> 15008 bytes .../static/assets/img/screenshots/pc_1.webp | Bin 0 -> 26138 bytes .../static/assets/img/screenshots/pc_2.webp | Bin 0 -> 31434 bytes .../static/assets/img/screenshots/pc_3.webp | Bin 0 -> 12492 bytes .../resources/static/assets/js/bs-init.js | 46 + .../static/assets/js/cmmn/algolia.mjs | 83 ++ .../resources/static/assets/js/cmmn/aos.mjs | 3 + .../main/resources/templates/base/header.html | 146 +++ .../main/resources/templates/base/layout.html | 154 +++ .../resources/templates/community/board.html | 121 +++ .../templates/community/content.html | 212 ++++ .../resources/templates/community/write.html | 265 +++++ .../templates/dictionary/catalogue.html | 135 +++ .../resources/templates/dictionary/info.html | 186 ++++ .../src/main/resources/templates/index.html | 133 +++ .../resources/templates/member/profile.html | 123 +++ lombok.config | 17 + settings.gradle | 13 + usecase/build.gradle | 6 + .../main/java/blisgo/usecase/UseCaseRoot.java | 7 + .../main/java/blisgo/usecase/base/Events.java | 20 + .../usecase/base/EventsConfiguration.java | 18 + .../blisgo/usecase/event/PostViewedEvent.java | 4 + .../blisgo/usecase/port/DogamInputPort.java | 43 + .../blisgo/usecase/port/DogamOutputPort.java | 12 + .../blisgo/usecase/port/MemberInputPort.java | 52 + .../blisgo/usecase/port/MemberOutputPort.java | 17 + .../blisgo/usecase/port/PostInputPort.java | 66 ++ .../blisgo/usecase/port/PostOutputPort.java | 26 + .../blisgo/usecase/port/ReplyInputPort.java | 36 + .../blisgo/usecase/port/ReplyOutputPort.java | 17 + .../blisgo/usecase/port/WasteInputPort.java | 47 + .../blisgo/usecase/port/WasteOutputPort.java | 25 + .../usecase/request/dogam/AddDogam.java | 12 + .../usecase/request/dogam/DogamCommand.java | 10 + .../usecase/request/dogam/DogamQuery.java | 7 + .../usecase/request/dogam/GetDogam.java | 14 + .../usecase/request/dogam/RemoveDogam.java | 12 + .../usecase/request/member/AddMember.java | 8 + .../usecase/request/member/GetMember.java | 9 + .../usecase/request/member/MemberCommand.java | 12 + .../usecase/request/member/MemberQuery.java | 9 + .../usecase/request/member/RemoveMember.java | 9 + .../usecase/request/member/UpdateMember.java | 11 + .../blisgo/usecase/request/post/AddPost.java | 10 + .../blisgo/usecase/request/post/GetPost.java | 11 + .../usecase/request/post/PostCommand.java | 14 + .../blisgo/usecase/request/post/PostLike.java | 10 + .../usecase/request/post/PostQuery.java | 12 + .../usecase/request/post/RemovePost.java | 9 + .../usecase/request/post/UpdatePost.java | 11 + .../usecase/request/reply/AddReply.java | 10 + .../usecase/request/reply/GetReply.java | 12 + .../usecase/request/reply/RemoveReply.java | 9 + .../usecase/request/reply/ReplyCommand.java | 10 + .../usecase/request/reply/ReplyQuery.java | 10 + .../usecase/request/waste/GetWaste.java | 12 + .../usecase/request/waste/WasteQuery.java | 25 + ...46\254\343\205\205\343\204\261V4.bsdesign" | Bin 0 -> 220663 bytes 192 files changed, 8027 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/report_bug.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/FUNDING.yml create mode 100644 .github/workflows/auto-release.yml create mode 100644 .github/workflows/ci-test.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 app/build.gradle create mode 100644 app/src/main/java/blisgo/app/BlisgoApplication.java create mode 100644 app/src/main/resources/application-dev.yml create mode 100644 app/src/main/resources/application-prod.yml create mode 100644 app/src/main/resources/application.yml create mode 100644 app/src/main/resources/banner.txt create mode 100644 app/src/main/resources/data.sql create mode 100644 app/src/main/resources/db/migration/V2__insert_guide.sql create mode 100644 app/src/main/resources/db/migration/V3__insert_waste.sql create mode 100644 app/src/main/resources/db/migration/V4__insert_waste_categories.sql create mode 100644 app/src/main/resources/db/migration/V5__insert_account.sql create mode 100644 app/src/main/resources/db/migration/V6__insert_board_values.sql create mode 100644 app/src/main/resources/db/migration/V7__insert_reply_values.sql create mode 100644 autoexecute.bat create mode 100644 build.gradle create mode 100644 buildSrc/build.gradle create mode 100644 docker-compose.yml create mode 100644 domain/build.gradle create mode 100644 domain/src/main/java/blisgo/domain/DomainRoot.java create mode 100644 domain/src/main/java/blisgo/domain/common/Author.java create mode 100644 domain/src/main/java/blisgo/domain/common/Content.java create mode 100644 domain/src/main/java/blisgo/domain/common/Hashtag.java create mode 100644 domain/src/main/java/blisgo/domain/common/Picture.java create mode 100644 domain/src/main/java/blisgo/domain/community/Post.java create mode 100644 domain/src/main/java/blisgo/domain/community/Reply.java create mode 100644 domain/src/main/java/blisgo/domain/community/vo/PostId.java create mode 100644 domain/src/main/java/blisgo/domain/community/vo/ReplyId.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/Dogam.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/Waste.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/vo/Category.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/vo/DogamId.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/vo/Guide.java create mode 100644 domain/src/main/java/blisgo/domain/dictionary/vo/WasteId.java create mode 100644 domain/src/main/java/blisgo/domain/member/Member.java create mode 100644 domain/src/main/java/blisgo/domain/member/vo/MemberId.java create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 infrastructure/external/build.gradle create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/ExternalRoot.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/handler/PostViewedEventHandler.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigDev.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigProd.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/SchedulerConfig.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/ViewCountCache.java create mode 100644 infrastructure/external/src/main/java/blisgo/infrastructure/external/scheduler/ViewCountScheduler.java create mode 100644 infrastructure/internal/build.gradle create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/InternalRoot.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/ContentConverter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/JpaConfig.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/MapperConfig.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/NoOffsetSliceHelper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/OidcAuditorAware.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/PersistenceMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseEntity.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseTimeEntity.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaAuthor.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaContent.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaPicture.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/PostMySQLAdapter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/ReplyMySQLAdapter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/PostMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/ReplyMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaPost.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaReply.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostCustomRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyCustomRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/DogamMySQLAdapter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/WasteMySQLAdapter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/DogamMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/GuideMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/WasteMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogam.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogamId.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaGuide.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaWaste.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamCustomRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/GuideJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteCustomRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/MemberMySQLAdapter.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/mapper/MemberMapper.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/model/JpaMember.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberCustomRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberJpaRepository.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/JacksonConfig.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/Uploadable.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/CustomOidcUserService.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/SecurityConfig.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/CustomServletConfig.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/Router.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/TimeDiffUtil.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/UnsplashClient.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/WallpaperChanger.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/DogamRender.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/MemberRender.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/PostRender.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/ReplyRender.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/WasteRender.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/DogamDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/GuideDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/MemberDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/PostDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/ReplyDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/WasteDTO.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/CommunityView.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/DictionaryView.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/HomeView.java create mode 100644 infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/MemberView.java create mode 100644 infrastructure/internal/src/main/resources/application-common.yml create mode 100644 infrastructure/internal/src/main/resources/application-oauth.yml create mode 100644 infrastructure/internal/src/main/resources/application-redis.yml create mode 100644 infrastructure/internal/src/main/resources/application-thymeleaf.yml create mode 100644 infrastructure/internal/src/main/resources/static/assets/css/cmmn/editor-js.css create mode 100644 infrastructure/internal/src/main/resources/static/assets/css/cmmn/style.css create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/favicon/16x16.png create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/favicon/180x180.png create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/favicon/192x192.png create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/favicon/32x32.png create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/favicon/512x512.png create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/mobile_1.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/mobile_2.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/mobile_3.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/pc_1.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/pc_2.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/img/screenshots/pc_3.webp create mode 100644 infrastructure/internal/src/main/resources/static/assets/js/bs-init.js create mode 100644 infrastructure/internal/src/main/resources/static/assets/js/cmmn/algolia.mjs create mode 100644 infrastructure/internal/src/main/resources/static/assets/js/cmmn/aos.mjs create mode 100644 infrastructure/internal/src/main/resources/templates/base/header.html create mode 100644 infrastructure/internal/src/main/resources/templates/base/layout.html create mode 100644 infrastructure/internal/src/main/resources/templates/community/board.html create mode 100644 infrastructure/internal/src/main/resources/templates/community/content.html create mode 100644 infrastructure/internal/src/main/resources/templates/community/write.html create mode 100644 infrastructure/internal/src/main/resources/templates/dictionary/catalogue.html create mode 100644 infrastructure/internal/src/main/resources/templates/dictionary/info.html create mode 100644 infrastructure/internal/src/main/resources/templates/index.html create mode 100644 infrastructure/internal/src/main/resources/templates/member/profile.html create mode 100644 lombok.config create mode 100644 settings.gradle create mode 100644 usecase/build.gradle create mode 100644 usecase/src/main/java/blisgo/usecase/UseCaseRoot.java create mode 100644 usecase/src/main/java/blisgo/usecase/base/Events.java create mode 100644 usecase/src/main/java/blisgo/usecase/base/EventsConfiguration.java create mode 100644 usecase/src/main/java/blisgo/usecase/event/PostViewedEvent.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/DogamInputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/DogamOutputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/MemberInputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/MemberOutputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/PostInputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/PostOutputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/ReplyInputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/ReplyOutputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/WasteInputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/port/WasteOutputPort.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/dogam/AddDogam.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/dogam/DogamCommand.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/dogam/DogamQuery.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/dogam/GetDogam.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/dogam/RemoveDogam.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/AddMember.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/GetMember.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/MemberCommand.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/MemberQuery.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/RemoveMember.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/member/UpdateMember.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/AddPost.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/GetPost.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/PostCommand.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/PostLike.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/PostQuery.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/RemovePost.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/post/UpdatePost.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/reply/AddReply.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/reply/GetReply.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/reply/RemoveReply.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/reply/ReplyCommand.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/reply/ReplyQuery.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/waste/GetWaste.java create mode 100644 usecase/src/main/java/blisgo/usecase/request/waste/WasteQuery.java create mode 100644 "\353\266\204\353\246\254\343\205\205\343\204\261V4.bsdesign" diff --git a/.github/ISSUE_TEMPLATE/report_bug.md b/.github/ISSUE_TEMPLATE/report_bug.md new file mode 100644 index 0000000..2675453 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/report_bug.md @@ -0,0 +1,50 @@ +--- +name: Report bug +about: 오류가 발생한 영역에 대해 보고합니다 [Dev] +title: "[BUG] " +labels: bug +assignees: '' + +--- + +## 설명 + +짧고 명확하게 오류에 대해 설명합니다 + + +## 오류 발생 재현 + +이렇게 했더니 다음과 같은 오류가 발생했습니다 +주의. log는 절대!!! 복붙하지 않고 인용, gist등을 이용합니다 + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + + +## 기대 결과 + +이런 결과가 나왔으면 좋겠습니다 + + +## 첨부 자료 + +해당 템플릿에 자료(사진, 동영상 등) 첨부합니다 + + +## 추가 정보 + +추가로 하고 싶은 말이나 위에서 설명하지 못했던 것 등을 간략히 작성합니다 +긴 논의는 GitHub Discussion에서 진행해주세요 + + +## 나의 환경 + +외부적 환경으로 인해 문제가 발생한 것 같다면 기재해줍니다 + +**Desktop** + +- OS: windows 11 +- IDE: Intellij +- Browser: Chrome diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..703317f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,19 @@ +## 변경사항 + +변경사항에 대해 간략하게 설명해주세요. +SemVer 규칙을 따라야 합니다 + +### Issue Link - #1 + + +## 체크리스트 + +리뷰 요청 전에 확인해야 할 사항들을 나열해주세요. + +- [ ] 내 코드를 스스로 검토했나요? +- [ ] 핵심 기능에 대해 충분한 테스트를 수행했나요? +- [ ] 분석이 필요한가요? +- [ ] 이것이 제품 업데이트의 일부인가요? 그렇다면, 이 업데이트에 대해 한 문장으로 작성해주세요. + + +## 참고 diff --git a/.github/workflows/FUNDING.yml b/.github/workflows/FUNDING.yml new file mode 100644 index 0000000..9e12df3 --- /dev/null +++ b/.github/workflows/FUNDING.yml @@ -0,0 +1,2 @@ +github: laigasus +custom: https://toss.me/laigasus \ No newline at end of file diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..8ccf6e8 --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,29 @@ +name: github action tag release + +on: + push: + branches: + - main + +jobs: + setup-build-deploy: + name: Setup, Build, and Deploy + runs-on: ubuntu-latest + permissions: + packages: write + contents: write + id-token: write + + steps: + - name: Bump version and push tag + id: tag_version + uses: mathieudutour/github-tag-action@v6.1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Create a GitHub release + uses: ncipollo/release-action@v1 + with: + tag: ${{ steps.tag_version.outputs.new_tag }} + name: Release ${{ steps.tag_version.outputs.new_tag }} + body: ${{ steps.tag_version.outputs.changelog }} \ No newline at end of file diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml new file mode 100644 index 0000000..5c65734 --- /dev/null +++ b/.github/workflows/ci-test.yml @@ -0,0 +1,50 @@ +name: CI - test + +on: + push: + branches: [ "main", "develop" ] + pull_request: + branches: [ "main", "develop" ] + +permissions: + contents: read + checks: write + pull-requests: write + +jobs: + build: + name: Build and test project + runs-on: ubuntu-latest + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + with: + token: ${{ secrets.ACTION_TOKEN }} + submodules: true + + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'corretto' + + - name: Grant execute permission for gradlew + run: | + chmod +x ./gradlew + + - name: Test with Gradle + run: | + ./gradlew test + + - name: Publish result of unit test + uses: EnricoMi/publish-unit-test-result-action@v2 + if: always() + with: + files: "**/build/test-results/test/TEST-*.xml" + + - name: Publish failure of unit test + uses: mikepenz/action-junit-report@v3 + if: always() + with: + report_paths: '**/build/test-results/test/TEST-*.xml' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ff88f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ +.env + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3dc8a52 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM gradle:8.2.1-jdk17-alpine AS builder +WORKDIR /build + +# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함. +COPY build.gradle settings.gradle /build/ +RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true + +ARG EnvironmentVariable +ARG RAILWAY_ENVIRONMENT +ENV RAILWAY_ENVIRONMENT=$RAILWAY_ENVIRONMENT + +# 빌더 이미지에서 애플리케이션 빌드 +COPY . /build +RUN gradle build -x test --parallel + +# APP +FROM openjdk:21-slim +WORKDIR /app + +# 빌더 이미지에서 jar 파일만 복사 +COPY --from=builder /build/build/libs/blisgo.jar . + +EXPOSE 8080 + +# root 권한으로 실행 +USER root +ENTRYPOINT ["java","-jar","application.jar"] \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..f20050c --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,9 @@ +bootJar.mainClass = 'blisgo.app.BlisgoApplication' +bootJar.enabled = true + +dependencies { + implementation project(':usecase') + implementation project(':infrastructure:internal') + implementation project(':infrastructure:external') + implementation project(':domain') +} \ No newline at end of file diff --git a/app/src/main/java/blisgo/app/BlisgoApplication.java b/app/src/main/java/blisgo/app/BlisgoApplication.java new file mode 100644 index 0000000..391a893 --- /dev/null +++ b/app/src/main/java/blisgo/app/BlisgoApplication.java @@ -0,0 +1,23 @@ +package blisgo.app; + +import blisgo.domain.DomainRoot; +import blisgo.infrastructure.external.ExternalRoot; +import blisgo.infrastructure.internal.InternalRoot; +import blisgo.usecase.UseCaseRoot; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.TimeZone; + +@SpringBootApplication(scanBasePackageClasses = { + InternalRoot.class, + DomainRoot.class, + ExternalRoot.class, + UseCaseRoot.class +}) +public class BlisgoApplication { + public static void main(String[] args) { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + SpringApplication.run(BlisgoApplication.class, args); + } +} diff --git a/app/src/main/resources/application-dev.yml b/app/src/main/resources/application-dev.yml new file mode 100644 index 0000000..840f51a --- /dev/null +++ b/app/src/main/resources/application-dev.yml @@ -0,0 +1,48 @@ +spring: + config: + activate: + on-profile: dev + + devtools: + livereload: + enabled: true + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: "jdbc:mysql://localhost:3306/blisgo" + username: root + password: root + + jpa: + show-sql: true + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + highlight_sql: true + use_sql_comments: true + ejb: + naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy + defer-datasource-initialization: true + + sql: + init: + mode: always + + thymeleaf: + cache: false + + data: + redis: + host: localhost + port: 6379 + + flyway: + enabled: false + +server: + servlet: + session: + cookie: + domain: localhost \ No newline at end of file diff --git a/app/src/main/resources/application-prod.yml b/app/src/main/resources/application-prod.yml new file mode 100644 index 0000000..cb75928 --- /dev/null +++ b/app/src/main/resources/application-prod.yml @@ -0,0 +1,36 @@ +spring: + data: + redis: + host: ${REDISHOST} + username: ${REDISUSER} + password: ${REDISPASSWORD} + port: ${REDISPORT} + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: "jdbc:${MYSQL_URL}" + username: ${MYSQLUSER} + password: ${MYSQLPASSWORD} + + thymeleaf: + cache: true + + jpa: + show-sql: true + hibernate: + ddl-auto: validate + + flyway: + enabled: true + baseline-on-migrate: on + locations: classpath:db/migration + url: "jdbc:${MYSQL_URL}" + user: ${MYSQLUSER} + password: ${MYSQLPASSWORD} + driver-class-name: com.mysql.cj.jdbc.Driver + +server: + servlet: + session: + cookie: + domain: blisgo.up.railway.app \ No newline at end of file diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml new file mode 100644 index 0000000..9468e7a --- /dev/null +++ b/app/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + profiles: + include: + common, thymeleaf, oauth, redis + active: ${APP_PROFILE} diff --git a/app/src/main/resources/banner.txt b/app/src/main/resources/banner.txt new file mode 100644 index 0000000..c97469c --- /dev/null +++ b/app/src/main/resources/banner.txt @@ -0,0 +1,8 @@ + ____ _ ___ ____ ____ ___ +| __ )| | |_ _/ ___| / ___|/ _ \ +| _ \| | | |\___ \| | _| | | | +| |_) | |___ | | ___) | |_| | |_| | +|____/|_____|___|____/ \____|\___/ + +Until the Earth becomes HEALTHY!!! +Powered by Spring Boot ${spring-boot.version} \ No newline at end of file diff --git a/app/src/main/resources/data.sql b/app/src/main/resources/data.sql new file mode 100644 index 0000000..4c4c222 --- /dev/null +++ b/app/src/main/resources/data.sql @@ -0,0 +1,948 @@ +INSERT INTO reply (post_id, content) +VALUES (1, 'This is a test comment 1.'), + (1, 'This is a test comment 2.'), + (1, 'This is a test comment 3.'), + (1, 'This is a test comment 4.'), + (1, 'This is a test comment 5.'), + (1, 'This is a test comment 6.'), + (1, 'This is a test comment 7.'), + (1, 'This is a test comment 8.'), + (1, 'This is a test comment 9.'), + (1, 'This is a test comment 10.'), + (1, 'This is a test comment 11.'), + (1, 'This is a test comment 12.'), + (1, 'This is a test comment 13.'), + (1, 'This is a test comment 14.'), + (1, 'This is a test comment 15.'), + (1, 'This is a test comment 16.'), + (1, 'This is a test comment 17.'), + (1, 'This is a test comment 18.'), + (1, 'This is a test comment 19.'), + (1, 'This is a test comment 20.'), + (1, 'This is a test comment 21.'), + (1, 'This is a test comment 22.'), + (1, 'This is a test comment 23.'), + (1, 'This is a test comment 24.'), + (1, 'This is a test comment 25.'), + (1, 'This is a test comment 26.'), + (1, 'This is a test comment 27.'), + (1, 'This is a test comment 28.'), + (1, 'This is a test comment 29.'), + (1, 'This is a test comment 30.'), + (1, 'This is a test comment 31.'), + (1, 'This is a test comment 32.'), + (1, 'This is a test comment 33.'), + (1, 'This is a test comment 34.'), + (1, 'This is a test comment 35.'), + (1, 'This is a test comment 36.'), + (1, 'This is a test comment 37.'), + (1, 'This is a test comment 38.'), + (1, 'This is a test comment 39.'), + (1, 'This is a test comment 40.'); + + +INSERT INTO post (title, content, author_email, author_name, author_picture) +VALUES ('Post 1', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 2', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 3', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 4', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 5', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 6', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 7', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 8', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 9', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 10', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 11', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 12', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 13', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 14', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 15', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 16', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 17', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 18', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 19', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 20', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 21', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 22', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 23', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 24', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 25', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 26', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 27', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 28', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 29', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 30', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 31', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 32', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 33', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 34', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 35', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 36', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 37', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 38', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 39', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 40', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 41', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 42', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 43', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 44', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 45', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 46', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 47', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 48', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 49', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 50', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 51', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 52', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 53', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 54', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 55', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 56', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 57', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 58', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 59', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 60', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 61', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 62', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 63', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 64', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 65', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 66', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 67', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 68', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 69', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 70', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 71', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 72', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 73', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 74', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 75', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 76', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 77', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 78', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 79', null, 'a@gmail.com', 'A', 'https://a.jpg'), + ('Post 80', null, 'a@gmail.com', 'A', 'https://a.jpg'); + +INSERT INTO guide (category, content, picture) +VALUES ('IRON', '고철로 배출', 'https://ik.imagekit.io/blisgo/guide/rhcjffb.webp'), + ('METAL', '금속캔으로 배출', 'https://ik.imagekit.io/blisgo/guide/rmathrzos.webp'), + ('BULKY', '대형폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/eogudvPrlanf.webp'), + ('STYROFOAM', '스티로폼으로 배출', 'https://ik.imagekit.io/blisgo/guide/qkfvhgkqtjdtnwl.webp'), + ('NON_FLAMMABLE', '불연성폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/qnfdustjd-whdfidwp.webp'), + ('VINYL', '비닐로 배출', 'https://ik.imagekit.io/blisgo/guide/qlslffb.webp'), + ('GLASS', '유리병류로 배출', 'https://ik.imagekit.io/blisgo/guide/dbflqud.webp'), + ('PROG', '음식물류 폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/dmatlranf.webp'), + ('CLOTHES', '의류 및 원단류로 배출', 'https://ik.imagekit.io/blisgo/guide/dmlfb.webp'), + ('ONLY_BOX', '전용수거함으로 배출', 'https://ik.imagekit.io/blisgo/guide/wjsdydgka.webp'), + ('PAPER', '종이류로 배출', 'https://ik.imagekit.io/blisgo/guide/whddl.webp'), + ('CARTON', '종이팩으로 배출', 'https://ik.imagekit.io/blisgo/guide/whddlvor-whddlzjq.webp'), + ('HOME_APPLIANCES', '폐가전제품으로 배출', 'https://ik.imagekit.io/blisgo/guide/vPrkwjswpvna.webp'), + ('PLASTIC', '플라스틱으로 배출', 'https://ik.imagekit.io/blisgo/guide/vmffktmxlr.webp'), + ('PAY_AS_YOU_GO_BAG', '종량제봉투로 배출', NULL), + ('SEPARATION_BY_MATERIAL', '재질에 맞게 배출', NULL), + ('CAUTION', '위험! 폐기시 주의가 필요함', NULL), + ('PRO_FACILITY', '전문처리시설로 배출', NULL); + + + +INSERT INTO waste (waste_id, name, type, picture, treatment) +VALUES (1001, '가격표', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1001.webp', NULL), + (1002, '가구류', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1002.webp', NULL), + (1003, '가발', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1003.webp', NULL), + (1004, '가습기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1004.webp', NULL), + (1005, '가위', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1005.webp', + '

다른 재질이 많이 섞인 제품은 분리해서 배출하며, 분리가 어렵다면 종량제봉투로 배출

'), + (1006, '개수대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1006.webp', NULL), + (1007, '거울', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1007.webp', + '

크기에 따라 해당 폐기물로 배출

'), + (1008, '걸레', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1008.webp', NULL), + (1009, '계란껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1009.webp', NULL), + (1010, '고무장갑', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1010.webp', NULL), + (1011, '골판지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1011.webp', + '

종이 < 일반 골판지
플라스틱 < PP 골판지

'), + (1012, '골프 클럽 백', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1012.webp', NULL), + (1013, '골프공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1013.webp', NULL), + (1014, '공구류(철)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1014.webp', + '

다른 재질이 많이 섞인 제품은 분리해서 배출하며, 분리가 어렵다면 종량제봉투로 배출

'), + (1015, '공기청정기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1015.webp', NULL), + (1016, '광고전단지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1016.webp', + '

비닐코팅된 종이는 종량제봉투 배출

'), + (1017, '구두, 샌들, 슬리퍼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1017.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출하거나 종량제봉투로 배출

'), + (1018, '국자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1018.webp', + '

고철 < 금속, 비금속 국자
플라스틱 < 플라스틱 국자
종량제봉투 < 나무 국자

'), + (1019, '그릇', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1019.webp', + '

불연성-종량제 < 도자기·유리그릇
고철 < 금속, 비금속그릇
플라스틱 < 플라스틱 그릇

'), + (1020, '기름(기계)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1020.webp', NULL), + (1021, '기름(식용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1021.webp', + '

전용수거함으로 배출

'), + (1022, '기타(악기)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1022.webp', NULL), + (1023, '깨진유리', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1023.webp', + '

불연성폐기물 배출방법을 참조하여 배출

'), + (1024, '나무젓가락', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1024.webp', NULL), + (1025, '나무조각, 나뭇가지, 나무줄기', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1025.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1026, '나사(못)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1026.webp', NULL), + (1027, '나침반', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1027.webp', NULL), + (1028, '낙엽', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1028.webp', NULL), + (1029, '낚싯대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1029.webp', NULL), + (1030, '난로(전기난로)', '폐가전제품/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1030.webp', + '

대형폐기물 또는 가전제품으로 배출

'), + (1031, '낫', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1031.webp', + '

고철로 배출하되, 가능하다면 손잡이 부분(나무재질 등)을 분리하여 배출

'), + (1032, '내열식기류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1032.webp', NULL), + (1033, '냄비뚜껑(강화유리)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1033.webp', NULL), + (1034, '냉장고(냉동고)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1034.webp', NULL), + (1035, '노트북', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1035.webp', NULL), + (1036, '농약용기', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1036.webp', + '

내용물을 다 사용한 후 따로 봉투에 담아 배출

'), + (1037, '다리미', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1037.webp', NULL), + (1038, '도끼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1038.webp', + '

고철로 배출하되, 가능하다면 손잡이 부분(나무재질 등)을 분리하여 배출

'), + (1039, '도마', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1039.webp', + '

종량제봉투 < 나무도마
플라스틱 < 플라스틱 도마

'), + (1040, '도자기류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1040.webp', NULL), + (1041, '돋보기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1041.webp', NULL), + (1042, '디지털카메라', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1042.webp', NULL), + (1043, '뚝배기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1043.webp', NULL), + (1044, '라디오', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1044.webp', NULL), + (1045, '라이터(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1045.webp', + '

모두 사용한 후 종량제봉투로 배출

'), + (1046, '라켓(배드민턴, 테니스 등)', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1046.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1047, '랩(사용 후)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1047.webp', + '

사용한 랩은 종량제봉투로 배출

'), + (1048, '랩의 심', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1048.webp', NULL), + (1049, '런닝머신', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1049.webp', NULL), + (1050, '리코더(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1050.webp', NULL), + (1051, '마스크', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1051.webp', NULL), + (1052, '마우스패드', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1052.webp', NULL), + (1053, '마커펜, 만년필', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1053.webp', NULL), + (1054, '매트, 매트리스', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1054.webp', NULL), + (1055, '맥주병뚜껑(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1055.webp', NULL), + (1056, '머그컵(도자기류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1056.webp', NULL), + (1057, '머플러(목도리)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1057.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출

'), + (1058, '메가폰(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1058.webp', NULL), + (1059, '면도기(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1059.webp', NULL), + (1060, '면도칼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1060.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출

'), + (1061, '면봉', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1061.webp', NULL), + (1062, '명함', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1062.webp', + '

종이류로 배출하며, 플라스틱 합성지 등 다른 재질 포함시 종량제봉투에 배출

'), + (1063, '명함지갑', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1063.webp', NULL), + (1064, '모니터(컴퓨터 TV)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1064.webp', NULL), + (1065, '모자(의류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1065.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출하거나 종량제봉투로 배출

'), + (1066, '목발', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1066.webp', + '

대형폐기물 또는 고철 등 재질에 맞게 배출

'), + (1067, '목재', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1067.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1068, '문갑, 문짝', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1068.webp', NULL), + (1069, '물티슈', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1069.webp', NULL), + (1070, '밀짚모자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1070.webp', NULL), + (1071, '바나나껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1071.webp', NULL), + (1072, '바둑판', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1072.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1073, '바베큐그릴', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1073.webp', NULL), + (1074, '밥상', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1074.webp', NULL), + (1075, '방석', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1075.webp', NULL), + (1076, '백과사전, 사전', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1076.webp', NULL), + (1077, '백열전구', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1077.webp', NULL), + (1078, '벼루', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1078.webp', NULL), + (1079, '벽돌', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1079.webp', NULL), + (1080, '벽시계', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1080.webp', NULL), + (1081, '보온병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1081.webp', NULL), + (1082, '복사기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1082.webp', NULL), + (1083, '볼펜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1083.webp', NULL), + (1084, '볼풀공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1084.webp', NULL), + (1085, '분무기(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1085.webp', NULL), + (1086, '분유 깡통', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1086.webp', NULL), + (1087, '붓', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1087.webp', NULL), + (1088, '블라인드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1088.webp', NULL), + (1089, '비닐봉지(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1089.webp', NULL), + (1090, '비닐장판', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1090.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1091, '비닐코팅종이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1091.webp', NULL), + (1092, '비디오카메라(캠코더)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1092.webp', NULL), + (1093, '비디오테이프', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1093.webp', + '

내부 필름은 분리하여 종량제봉투로 배출

'), + (1094, '빗, 헤어브러시', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1094.webp', + '

재질에 맞게 배출하되 나무 빗 등은 종량제봉투로 배출

'), + (1095, '빨대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1095.webp', NULL), + (1096, '사다리', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1096.webp', + '

대형폐기물 또는 고철로 배출

'), + (1097, '사인펜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1097.webp', NULL), + (1098, '사진', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1098.webp', NULL), + (1099, '사진인화지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1099.webp', NULL), + (1100, '삽', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1100.webp', + '

대형폐기물 또는 재질에 맞게 배출

'), + (1101, '상한 음식', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1101.webp', NULL), + (1102, '생선(먹고 남은)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1102.webp', + '

생선뼈는 종량제봉투에 버리고, 나머지는 음식물로 배출

'), + (1103, '샤프펜슬', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1103.webp', NULL), + (1104, '샴푸용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1104.webp', + '

내부를 헹구고 플라스틱으로 배출

'), + (1105, '서랍장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1105.webp', NULL), + (1106, '서류봉투(갈색 종이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1106.webp', NULL), + (1107, '선풍기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1107.webp', NULL), + (1108, '성냥', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1108.webp', + '

물에 적신 후 종량제봉투로 배출

'), + (1109, '세면대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1109.webp', NULL), + (1110, '세탁기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1110.webp', NULL), + (1111, '셔틀콕(배드민턴공, 깃털공)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1111.webp', NULL), + (1112, '소스용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1112.webp', + '

내부를 헹구고 플라스틱 또는 재질에 맞게 배출

'), + (1113, '손목 시계', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1113.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 처리, 건전지는 분리하여 전용수거함으로 배출

'), + (1114, '솜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1114.webp', NULL), + (1115, '솜이불', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1115.webp', NULL), + (1116, '송곳', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1116.webp', NULL), + (1117, '수세미', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1117.webp', NULL), + (1118, '수조, 수족관', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1118.webp', NULL), + (1119, '수첩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1119.webp', + '

종이류 또는 재질에 맞게 배출

'), + (1120, '숯', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1120.webp', NULL), + (1121, '스노우보드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1121.webp', NULL), + (1122, '스캐너', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1122.webp', NULL), + (1123, '스케이트보드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1123.webp', NULL), + (1124, '스키용구류', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1124.webp', NULL), + (1125, '스탠드', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1125.webp', NULL), + (1126, '스폰지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1126.webp', NULL), + (1127, '스프레이, 부탄가스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1127.webp', '

금속캔(부탄가스통) 배출방법 참고

'), + (1128, '스피커', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1128.webp', NULL), + (1129, '식기세척기(식기건조기)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1129.webp', NULL), + (1130, '식물, 나무', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1130.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1131, '식용유용기(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1131.webp', + '

모두 사용 후 플라스틱으로 배출

'), + (1132, '신문지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1132.webp', NULL), + (1133, '신발', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1133.webp', NULL), + (1134, '신발장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1134.webp', NULL), + (1135, '싱크대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1135.webp', NULL), + (1136, '쌀통', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1136.webp', NULL), + (1137, '쌀포대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1137.webp', + '

종이류 또는 재질에 맞게 배출

'), + (1138, '쓰레받기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1138.webp', + '

플라스틱 < 가정용 플라스틱 쓰레받기
고철 < 고철 쓰레받기

'), + (1139, '아기욕조, 아기침대', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1139.webp', NULL), + (1140, '아령', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1140.webp', + '

고철 또는 재질에 맞게 배출

'), + (1141, '아이스팩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1141.webp', NULL), + (1142, '악기', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1142.webp', + '

종량제봉투에 담을 수 없는 경우 대형페기물로 배출
※악기는 폐가전 제품 무상방문 수거 대상품목이 아님

'), + (1143, '압력솓', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1143.webp', NULL), + (1144, '애완동물 용변 시트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1144.webp', NULL), + (1145, '애완동물 음식캔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1145.webp', + '

금속캔으로 배출

'), + (1146, '애완동물집, 운반케이스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1146.webp', NULL), + (1147, '액자', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1147.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1148, '앨범', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1148.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1149, '야구공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1149.webp', NULL), + (1150, '야구글러브', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1150.webp', NULL), + (1151, '야구배트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1151.webp', + '

재질에 맞게 배출 또는 종량제봉투로 배출

'), + (1152, '약 종류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1152.webp', + '

약국, 보건소 등의 전용수거함으로 배출

'), + (1153, '양초', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1153.webp', NULL), + (1154, '에어매트', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1154.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1155, '에어컨', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1155.webp', NULL), + (1156, '엔진오일', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1156.webp', + '

전문처리시설(카센터 등)로 배출

'), + (1157, '여행가방(트렁크)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1157.webp', NULL), + (1158, '역기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1158.webp', NULL), + (1159, '연필, 색연필', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1159.webp', NULL), + (1160, '연필깎이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1160.webp', NULL), + (1161, '오디오세트', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1161.webp', NULL), + (1162, '오렌지껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1162.webp', NULL), + (1163, '온풍기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1163.webp', NULL), + (1164, '옷걸이(세탁소 흰색 철사)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1164.webp', NULL), + (1165, '와이퍼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1165.webp', NULL), + (1166, '와인셀러', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1166.webp', NULL), + (1167, '완충재(뽁뽁이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1167.webp', NULL), + (1168, '요가매트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1168.webp', NULL), + (1169, '우산', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1169.webp', + '

뼈대와 비닐을 분리하여, 각각의 분리수거함으로 배출, 분리가 어렵다면 종량제봉투로 배출

'), + (1170, '유리병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1170.webp', '

유리병류로 배출

'), + (1171, '유리병뚜껑(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1171.webp', NULL), + (1172, '유리판, 유리제품', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1172.webp', + '

불연성폐기물 또는 대형폐기물로 배출

'), + (1173, '유모차', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1173.webp', NULL), + (1174, '윤활유', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1174.webp', '

구입처와 상담 후 배출

'), + (1175, '응접세트', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1175.webp', NULL), + (1176, '의류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1176.webp', + '

의류 및 원단류로 배출

'), + (1177, '의류건조대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1177.webp', + '

고철, 플라스틱재질에 맞게 배출

'), + (1178, '의자', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1178.webp', NULL), + (1179, '이불', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1179.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1180, '인형류', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1180.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1181, '자동차 부품', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1181.webp', '

중고센터, 판매처 등과 상담하여 처리

'), + (1182, '자루걸레', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1182.webp', NULL), + (1183, '자석', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1183.webp', NULL), + (1184, '자전거', '기타폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1184.webp', + '

대형폐기물로 처리하거나, 중고센터 등과 상담하여 처리

'), + (1185, '잡지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1185.webp', NULL), + (1186, '장난감류', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1186.webp', + '

크기에 따라 대형폐기물 또는 재질에 맞게 배출 (여러재질이 섞인 경우 종량제봉투로 배출)

'), + (1187, '장롱', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1187.webp', NULL), + (1188, '장식장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1188.webp', NULL), + (1189, '장판', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1189.webp', NULL), + (1190, '재떨이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1190.webp', + '

불연성-종량제 < 도자기·유리재떨이
고철 < 금속류 재떨이

'), + (1191, '전기밥솔', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1191.webp', NULL), + (1192, '전기비데', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1192.webp', NULL), + (1193, '전기오븐레인지', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1193.webp', NULL), + (1194, '전기코드류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1194.webp', NULL), + (1195, '전기포트', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1195.webp', NULL), + (1196, '전단지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1196.webp', NULL), + (1197, '전동칫솔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1197.webp', NULL), + (1198, '전자레인지', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1198.webp', NULL), + (1199, '전자사전(전자수첩)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1199.webp', NULL), + (1200, '전자피아노', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1200.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리
※악기는 폐가전 제품 무상방문 수거 대상품목이 아님

'), + (1201, '전지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1201.webp', + '

전용수거함으로 배출

'), + (1202, '전축', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1202.webp', NULL), + (1203, '전화기(팩스포함)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1203.webp', NULL), + (1204, '전화번호부', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1204.webp', NULL), + (1205, '접착제(본드 등)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1205.webp', NULL), + (1206, '정기장판', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1206.webp', + '

대형폐기물로 배출 (전기이불담요 포함)

'), + (1207, '정수기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1207.webp', + '

대형가전으로 배출

'), + (1208, '젖꼭지(아기용품)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1208.webp', NULL), + (1209, '젖병(아기용품)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1209.webp', + '

젖병의 몸체와 윗부분의 젖꼭지는 분리하여 재질에 맞게 배출

'), + (1210, '조각칼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1210.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출

'), + (1211, '종이기저귀', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1211.webp', NULL), + (1212, '종이상자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1212.webp', NULL), + (1213, '종이심', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1213.webp', NULL), + (1214, '종이조각', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1214.webp', NULL), + (1215, '종이팩(우유팩 등)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1215.webp', + '

내부에 알루미늄박이 붙어 있다면 종량제봉투로 배출

'), + (1216, '주전자(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1216.webp', + '

플라스틱 뚜껑 등은 돌려서 제거한 후 고철로 배출

'), + (1217, '줄자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1217.webp', + '

재질에 맞게 배출 또는 종량제봉투로 배출

'), + (1218, '지우개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1218.webp', NULL), + (1219, '진열대', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1219.webp', NULL), + (1220, '차 찌꺼기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1220.webp', NULL), + (1221, '찬장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1221.webp', NULL), + (1222, '찻잔(도자기류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1222.webp', NULL), + (1223, '책', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1223.webp', NULL), + (1224, '책상, 책장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1224.webp', NULL), + (1225, '천체망원경', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1225.webp', NULL), + (1226, '철사', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1226.webp', NULL), + (1227, '철판(가정요리용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1227.webp', NULL), + (1228, '청소기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1228.webp', NULL), + (1229, '체온계(건전지, 디지털)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1229.webp', + '

건전지는 분리하여 전용수거함으로 배출

'), + (1230, '체중계', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1230.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1231, '축구공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1231.webp', NULL), + (1232, '충전식전지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1232.webp', + '

전용수거함으로 배출

'), + (1233, '치약용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1233.webp', + '

플라스틱 또는 재질에 맞게 배출

'), + (1234, '치킨박스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1234.webp', + '

기름에 오염된 내부 종이는 종량제봉투로 배출

'), + (1235, '침구류(이불, 베개 등)', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1235.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1236, '침대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1236.webp', NULL), + (1237, '칫솔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1237.webp', NULL), + (1238, '카펫, 융단', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1238.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1239, '캐비넷', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1239.webp', NULL), + (1240, '캔 따개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1240.webp', NULL), + (1241, '캡(플라스틱 뚜껑)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1241.webp', NULL), + (1242, '커튼, 커튼 레일', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1242.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1243, '커피메이커', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1243.webp', NULL), + (1244, '커피원두, 찌꺼기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1244.webp', NULL), + (1245, '컴퓨터', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1245.webp', NULL), + (1246, '컵', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1246.webp', + '

불연성-종량제 < 도자기·유리 컵
고철 < 금속·비금속 컵
플라스틱 < 플라스틱컵

'), + (1247, '코르크따개(와인따개)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1247.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출
재질에 맞게 해당 분리수거함으로 배출

'), + (1248, '코르크마개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1248.webp', NULL), + (1249, '코팅된 종이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1249.webp', NULL), + (1250, '콘센트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1250.webp', NULL), + (1251, '콘텍트렌즈', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1251.webp', NULL), + (1252, '쿠션', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1252.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1253, '크레용', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1253.webp', NULL), + (1254, '키보드(컴퓨터용)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1254.webp', NULL), + (1255, '타이어', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1255.webp', '

구입처와 상담 후 배출

'), + (1256, '탁상달력', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1256.webp', + '

종이류 배출방법을 참고하여 배출

'), + (1257, '탈수기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1257.webp', NULL), + (1258, '텐트', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1258.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1259, '텔레비전(TV)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1259.webp', NULL), + (1260, '토스터기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1260.webp', NULL), + (1261, '톱', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1261.webp', NULL), + (1262, '튀김기름', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1262.webp', + '

폐식용유 전용수거함 배출

'), + (1263, '틀니', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1263.webp', NULL), + (1264, '티백(녹차)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1264.webp', NULL), + (1265, '파인애플껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1265.webp', NULL), + (1266, '팩스(복합기)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1266.webp', NULL), + (1267, '페트병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1267.webp', NULL), + (1268, '포스터, 포장지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1268.webp', + '

종이류 배출방법을 참고하여 배출

'), + (1269, '프린터', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1269.webp', NULL), + (1270, '피아노', '기타폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1270.webp', + '

대형폐기물로 처리하거나, 중고센터등과 상담하여 처리

'), + (1271, '피자 세이버(피자 삼발이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1271.webp', NULL), + (1272, '피자박스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1272.webp', + '

기름에 오염된 내부 종이는 종량제봉투로 배출

'), + (1273, '필름(사진용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1273.webp', NULL), + (1274, '핫팩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1274.webp', NULL), + (1275, '항아리', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1275.webp', + '

대형폐기물로 처리

'), + (1276, '헝겁류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1276.webp', NULL), + (1277, '헤드폰(헤드셋)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1277.webp', NULL), + (1278, '헬멧', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1278.webp', + '

종량제봉투로 배출하되, 분리하여 재질에 맞게 배출

'), + (1279, '형광등', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1279.webp', + '

전용수거함으로 배출

'), + (1280, '호일(사용 후)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1280.webp', NULL), + (1281, '화로', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1281.webp', NULL), + (1282, '화분, 화병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1282.webp', + '

불연성폐기물로 배출 등 재질에 맞게 배출

'), + (1283, '화장대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1283.webp', NULL), + (1284, '화장품냉장고', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1284.webp', NULL), + (1285, '후라이팬', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1285.webp', NULL), + (1286, '휴대용 플레이어(MP3등)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1286.webp', NULL), + (1287, '휴대전화', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1287.webp', + '

폐가전제품으로 배출
※우체국 보상판매 이용 가능

'); + +INSERT INTO waste_categories (categories, waste_id) +VALUES ('PAPER', 1001), + ('BULKY', 1002), + ('PAY_AS_YOU_GO_BAG', 1003), + ('HOME_APPLIANCES', 1004), + ('PAY_AS_YOU_GO_BAG', 1005), + ('SEPARATION_BY_MATERIAL', 1005), + ('BULKY', 1006), + ('NON_FLAMMABLE', 1007), + ('BULKY', 1007), + ('PAY_AS_YOU_GO_BAG', 1008), + ('PAY_AS_YOU_GO_BAG', 1009), + ('PAY_AS_YOU_GO_BAG', 1010), + ('PAPER', 1011), + ('PLASTIC', 1011), + ('BULKY', 1012), + ('PAY_AS_YOU_GO_BAG', 1013), + ('IRON', 1014), + ('HOME_APPLIANCES', 1015), + ('PAPER', 1016), + ('CLOTHES', 1017), + ('PAY_AS_YOU_GO_BAG', 1017), + ('IRON', 1018), + ('PLASTIC', 1018), + ('PAY_AS_YOU_GO_BAG', 1018), + ('NON_FLAMMABLE', 1019), + ('IRON', 1019), + ('PLASTIC', 1019), + ('PRO_FACILITY', 1020), + ('ONLY_BOX', 1021), + ('BULKY', 1022), + ('NON_FLAMMABLE', 1023), + ('PAY_AS_YOU_GO_BAG', 1024), + ('PAY_AS_YOU_GO_BAG', 1025), + ('BULKY', 1025), + ('IRON', 1026), + ('PAY_AS_YOU_GO_BAG', 1027), + ('PAY_AS_YOU_GO_BAG', 1028), + ('BULKY', 1029), + ('HOME_APPLIANCES', 1030), + ('BULKY', 1030), + ('IRON', 1031), + ('PAY_AS_YOU_GO_BAG', 1031), + ('NON_FLAMMABLE', 1032), + ('PAY_AS_YOU_GO_BAG', 1033), + ('HOME_APPLIANCES', 1034), + ('HOME_APPLIANCES', 1035), + ('CAUTION', 1036), + ('HOME_APPLIANCES', 1037), + ('IRON', 1038), + ('PAY_AS_YOU_GO_BAG', 1038), + ('PAY_AS_YOU_GO_BAG', 1039), + ('PLASTIC', 1039), + ('NON_FLAMMABLE', 1040), + ('PAY_AS_YOU_GO_BAG', 1041), + ('HOME_APPLIANCES', 1042), + ('NON_FLAMMABLE', 1043), + ('HOME_APPLIANCES', 1044), + ('PAY_AS_YOU_GO_BAG', 1045), + ('CAUTION', 1045), + ('PAY_AS_YOU_GO_BAG', 1046), + ('BULKY', 1046), + ('PAY_AS_YOU_GO_BAG', 1047), + ('PAPER', 1048), + ('HOME_APPLIANCES', 1049), + ('PLASTIC', 1050), + ('PAY_AS_YOU_GO_BAG', 1051), + ('PAY_AS_YOU_GO_BAG', 1052), + ('PAY_AS_YOU_GO_BAG', 1053), + ('BULKY', 1054), + ('IRON', 1055), + ('NON_FLAMMABLE', 1056), + ('CLOTHES', 1057), + ('PLASTIC', 1058), + ('PAY_AS_YOU_GO_BAG', 1059), + ('PAY_AS_YOU_GO_BAG', 1060), + ('CAUTION', 1060), + ('PAY_AS_YOU_GO_BAG', 1061), + ('PAPER', 1062), + ('PAY_AS_YOU_GO_BAG', 1062), + ('PAY_AS_YOU_GO_BAG', 1063), + ('HOME_APPLIANCES', 1064), + ('CLOTHES', 1065), + ('PAY_AS_YOU_GO_BAG', 1065), + ('IRON', 1066), + ('SEPARATION_BY_MATERIAL', 1066), + ('BULKY', 1066), + ('PAY_AS_YOU_GO_BAG', 1067), + ('BULKY', 1067), + ('BULKY', 1068), + ('PAY_AS_YOU_GO_BAG', 1069), + ('PAY_AS_YOU_GO_BAG', 1070), + ('PROG', 1071), + ('PAY_AS_YOU_GO_BAG', 1072), + ('BULKY', 1072), + ('BULKY', 1073), + ('BULKY', 1074), + ('PAY_AS_YOU_GO_BAG', 1075), + ('PAPER', 1076), + ('NON_FLAMMABLE', 1077), + ('PAY_AS_YOU_GO_BAG', 1078), + ('NON_FLAMMABLE', 1079), + ('BULKY', 1080), + ('PAY_AS_YOU_GO_BAG', 1081), + ('HOME_APPLIANCES', 1082), + ('PAY_AS_YOU_GO_BAG', 1083), + ('PLASTIC', 1084), + ('PLASTIC', 1085), + ('IRON', 1086), + ('PAY_AS_YOU_GO_BAG', 1087), + ('BULKY', 1088), + ('VINYL', 1089), + ('PAY_AS_YOU_GO_BAG', 1090), + ('BULKY', 1090), + ('PAY_AS_YOU_GO_BAG', 1091), + ('HOME_APPLIANCES', 1092), + ('PLASTIC', 1093), + ('SEPARATION_BY_MATERIAL', 1094), + ('PAY_AS_YOU_GO_BAG', 1094), + ('PLASTIC', 1095), + ('IRON', 1096), + ('BULKY', 1096), + ('PAY_AS_YOU_GO_BAG', 1097), + ('PAY_AS_YOU_GO_BAG', 1098), + ('PAY_AS_YOU_GO_BAG', 1099), + ('SEPARATION_BY_MATERIAL', 1100), + ('BULKY', 1100), + ('PROG', 1101), + ('PROG', 1102), + ('PAY_AS_YOU_GO_BAG', 1102), + ('PAY_AS_YOU_GO_BAG', 1103), + ('PLASTIC', 1104), + ('BULKY', 1105), + ('PAPER', 1106), + ('HOME_APPLIANCES', 1107), + ('PAY_AS_YOU_GO_BAG', 1108), + ('BULKY', 1109), + ('HOME_APPLIANCES', 1110), + ('PAY_AS_YOU_GO_BAG', 1111), + ('PLASTIC', 1112), + ('SEPARATION_BY_MATERIAL', 1112), + ('PAY_AS_YOU_GO_BAG', 1113), + ('PAY_AS_YOU_GO_BAG', 1114), + ('BULKY', 1115), + ('PAY_AS_YOU_GO_BAG', 1116), + ('PAY_AS_YOU_GO_BAG', 1117), + ('BULKY', 1118), + ('PAPER', 1119), + ('SEPARATION_BY_MATERIAL', 1119), + ('PAY_AS_YOU_GO_BAG', 1120), + ('BULKY', 1121), + ('HOME_APPLIANCES', 1122), + ('BULKY', 1123), + ('BULKY', 1124), + ('HOME_APPLIANCES', 1125), + ('PAY_AS_YOU_GO_BAG', 1126), + ('METAL', 1127), + ('CAUTION', 1127), + ('HOME_APPLIANCES', 1128), + ('HOME_APPLIANCES', 1129), + ('PAY_AS_YOU_GO_BAG', 1130), + ('BULKY', 1130), + ('PLASTIC', 1131), + ('PAPER', 1132), + ('PAY_AS_YOU_GO_BAG', 1133), + ('BULKY', 1134), + ('BULKY', 1135), + ('BULKY', 1136), + ('PAPER', 1137), + ('SEPARATION_BY_MATERIAL', 1137), + ('PLASTIC', 1138), + ('IRON', 1138), + ('SEPARATION_BY_MATERIAL', 1139), + ('BULKY', 1139), + ('IRON', 1140), + ('SEPARATION_BY_MATERIAL', 1140), + ('PAY_AS_YOU_GO_BAG', 1141), + ('PAY_AS_YOU_GO_BAG', 1142), + ('BULKY', 1142), + ('IRON', 1143), + ('PAY_AS_YOU_GO_BAG', 1144), + ('METAL', 1145), + ('CAUTION', 1145), + ('SEPARATION_BY_MATERIAL', 1146), + ('PAY_AS_YOU_GO_BAG', 1147), + ('BULKY', 1147), + ('PAY_AS_YOU_GO_BAG', 1148), + ('BULKY', 1148), + ('PAY_AS_YOU_GO_BAG', 1149), + ('PAY_AS_YOU_GO_BAG', 1150), + ('SEPARATION_BY_MATERIAL', 1151), + ('PAY_AS_YOU_GO_BAG', 1151), + ('ONLY_BOX', 1152), + ('PAY_AS_YOU_GO_BAG', 1153), + ('PAY_AS_YOU_GO_BAG', 1154), + ('BULKY', 1154), + ('HOME_APPLIANCES', 1155), + ('PRO_FACILITY', 1156), + ('BULKY', 1157), + ('IRON', 1158), + ('PAY_AS_YOU_GO_BAG', 1159), + ('PAY_AS_YOU_GO_BAG', 1160), + ('HOME_APPLIANCES', 1161), + ('PROG', 1162), + ('HOME_APPLIANCES', 1163), + ('IRON', 1164), + ('SEPARATION_BY_MATERIAL', 1165), + ('HOME_APPLIANCES', 1166), + ('VINYL', 1167), + ('PAY_AS_YOU_GO_BAG', 1168), + ('PAY_AS_YOU_GO_BAG', 1169), + ('GLASS', 1170), + ('CAUTION', 1170), + ('IRON', 1171), + ('NON_FLAMMABLE', 1172), + ('BULKY', 1172), + ('BULKY', 1173), + ('PRO_FACILITY', 1174), + ('BULKY', 1175), + ('CLOTHES', 1176), + ('IRON', 1177), + ('PLASTIC', 1177), + ('SEPARATION_BY_MATERIAL', 1177), + ('BULKY', 1178), + ('PAY_AS_YOU_GO_BAG', 1179), + ('BULKY', 1179), + ('PAY_AS_YOU_GO_BAG', 1180), + ('BULKY', 1180), + ('PRO_FACILITY', 1181), + ('BULKY', 1182), + ('PAY_AS_YOU_GO_BAG', 1183), + ('PRO_FACILITY', 1184), + ('BULKY', 1184), + ('PAPER', 1185), + ('SEPARATION_BY_MATERIAL', 1186), + ('PAY_AS_YOU_GO_BAG', 1186), + ('BULKY', 1186), + ('BULKY', 1187), + ('BULKY', 1188), + ('BULKY', 1189), + ('NON_FLAMMABLE', 1190), + ('IRON', 1190), + ('HOME_APPLIANCES', 1191), + ('HOME_APPLIANCES', 1192), + ('HOME_APPLIANCES', 1193), + ('PAY_AS_YOU_GO_BAG', 1194), + ('HOME_APPLIANCES', 1195), + ('PAPER', 1196), + ('PAY_AS_YOU_GO_BAG', 1197), + ('HOME_APPLIANCES', 1198), + ('HOME_APPLIANCES', 1199), + ('PAY_AS_YOU_GO_BAG', 1200), + ('BULKY', 1200), + ('ONLY_BOX', 1201), + ('HOME_APPLIANCES', 1202), + ('HOME_APPLIANCES', 1203), + ('PAPER', 1204), + ('PAY_AS_YOU_GO_BAG', 1205), + ('BULKY', 1206), + ('HOME_APPLIANCES', 1207), + ('PAY_AS_YOU_GO_BAG', 1208), + ('PLASTIC', 1209), + ('SEPARATION_BY_MATERIAL', 1209), + ('PAY_AS_YOU_GO_BAG', 1210), + ('PAY_AS_YOU_GO_BAG', 1211), + ('PAPER', 1212), + ('PAPER', 1213), + ('PAPER', 1214), + ('CARTON', 1215), + ('IRON', 1216), + ('SEPARATION_BY_MATERIAL', 1217), + ('PAY_AS_YOU_GO_BAG', 1217), + ('PAY_AS_YOU_GO_BAG', 1218), + ('SEPARATION_BY_MATERIAL', 1219), + ('BULKY', 1219), + ('PAY_AS_YOU_GO_BAG', 1220), + ('BULKY', 1221), + ('NON_FLAMMABLE', 1222), + ('PAPER', 1223), + ('BULKY', 1224), + ('BULKY', 1225), + ('IRON', 1226), + ('IRON', 1227), + ('HOME_APPLIANCES', 1228), + ('PAY_AS_YOU_GO_BAG', 1229), + ('PAY_AS_YOU_GO_BAG', 1230), + ('BULKY', 1230), + ('PAY_AS_YOU_GO_BAG', 1231), + ('ONLY_BOX', 1232), + ('PLASTIC', 1233), + ('SEPARATION_BY_MATERIAL', 1233), + ('PAPER', 1234), + ('PAY_AS_YOU_GO_BAG', 1235), + ('BULKY', 1235), + ('BULKY', 1236), + ('PAY_AS_YOU_GO_BAG', 1237), + ('PAY_AS_YOU_GO_BAG', 1238), + ('BULKY', 1238), + ('BULKY', 1239), + ('IRON', 1240), + ('PLASTIC', 1241), + ('PAY_AS_YOU_GO_BAG', 1242), + ('BULKY', 1242), + ('HOME_APPLIANCES', 1243), + ('PAY_AS_YOU_GO_BAG', 1244), + ('HOME_APPLIANCES', 1245), + ('NON_FLAMMABLE', 1246), + ('IRON', 1246), + ('PLASTIC', 1246), + ('PAY_AS_YOU_GO_BAG', 1247), + ('SEPARATION_BY_MATERIAL', 1247), + ('PAY_AS_YOU_GO_BAG', 1248), + ('PAY_AS_YOU_GO_BAG', 1249), + ('PAY_AS_YOU_GO_BAG', 1250), + ('PAY_AS_YOU_GO_BAG', 1251), + ('PAY_AS_YOU_GO_BAG', 1252), + ('BULKY', 1252), + ('PAY_AS_YOU_GO_BAG', 1253), + ('HOME_APPLIANCES', 1254), + ('PRO_FACILITY', 1255), + ('PAPER', 1256), + ('HOME_APPLIANCES', 1257), + ('PAY_AS_YOU_GO_BAG', 1258), + ('BULKY', 1258), + ('HOME_APPLIANCES', 1259), + ('HOME_APPLIANCES', 1260), + ('IRON', 1261), + ('ONLY_BOX', 1262), + ('PAY_AS_YOU_GO_BAG', 1263), + ('PAY_AS_YOU_GO_BAG', 1264), + ('PAY_AS_YOU_GO_BAG', 1265), + ('HOME_APPLIANCES', 1266), + ('PLASTIC', 1267), + ('PAPER', 1268), + ('HOME_APPLIANCES', 1269), + ('BULKY', 1270), + ('PRO_FACILITY', 1270), + ('PLASTIC', 1271), + ('PAPER', 1272), + ('PAY_AS_YOU_GO_BAG', 1273), + ('PAY_AS_YOU_GO_BAG', 1274), + ('BULKY', 1275), + ('PAY_AS_YOU_GO_BAG', 1276), + ('HOME_APPLIANCES', 1277), + ('PAY_AS_YOU_GO_BAG', 1278), + ('SEPARATION_BY_MATERIAL', 1278), + ('ONLY_BOX', 1279), + ('PAY_AS_YOU_GO_BAG', 1280), + ('BULKY', 1281), + ('NON_FLAMMABLE', 1282), + ('SEPARATION_BY_MATERIAL', 1282), + ('BULKY', 1283), + ('HOME_APPLIANCES', 1284), + ('IRON', 1285), + ('HOME_APPLIANCES', 1286), + ('HOME_APPLIANCES', 1287); + +/*INSERT INTO dogam (member_id, waste_id) +VALUES ('okjaeook98@gmail.com', 1001), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1002), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1003), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1004), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1005), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1006), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1007), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1008), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1009), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1010), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1011), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1012), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1013), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1014), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1015), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1016), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1017), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1018), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1019), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1020), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1021), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1022), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1023), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1024), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1025), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1026), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1027), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1028), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1029), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1030), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1031), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1032), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1033), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1034), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1035), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1036), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1037), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1038), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1039), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1040), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1041), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1042), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1043), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1044), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1045), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1046), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1047), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1048), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1049), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1050), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1051), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1052), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1053), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1054), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1055), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1056), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1057), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1058), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1059), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1060), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1061), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1062), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1063), + ('4c29cb26-d2f3-38d8-9d02-a9da30c7ad99', 1064);*/ \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V2__insert_guide.sql b/app/src/main/resources/db/migration/V2__insert_guide.sql new file mode 100644 index 0000000..d6f67fc --- /dev/null +++ b/app/src/main/resources/db/migration/V2__insert_guide.sql @@ -0,0 +1,22 @@ +INSERT INTO guide (category, content, picture) +VALUES ('IRON', '고철로 배출', 'https://ik.imagekit.io/blisgo/guide/rhcjffb.webp'), + ('METAL', '금속캔으로 배출', 'https://ik.imagekit.io/blisgo/guide/rmathrzos.webp'), + ('BULKY', '대형폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/eogudvPrlanf.webp'), + ('STYROFOAM', '스티로폼으로 배출', 'https://ik.imagekit.io/blisgo/guide/qkfvhgkqtjdtnwl.webp'), + ('NON_FLAMMABLE', '불연성폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/qnfdustjd-whdfidwp.webp'), + ('VINYL', '비닐로 배출', 'https://ik.imagekit.io/blisgo/guide/qlslffb.webp'), + ('GLASS', '유리병류로 배출', 'https://ik.imagekit.io/blisgo/guide/dbflqud.webp'), + ('PROG', '음식물류 폐기물로 배출', 'https://ik.imagekit.io/blisgo/guide/dmatlranf.webp'), + ('CLOTHES', '의류 및 원단류로 배출', 'https://ik.imagekit.io/blisgo/guide/dmlfb.webp'), + ('ONLY_BOX', '전용수거함으로 배출', 'https://ik.imagekit.io/blisgo/guide/wjsdydgka.webp'), + ('PAPER', '종이류로 배출', 'https://ik.imagekit.io/blisgo/guide/whddl.webp'), + ('CARTON', '종이팩으로 배출', 'https://ik.imagekit.io/blisgo/guide/whddlvor-whddlzjq.webp'), + ('HOME_APPLIANCES', '폐가전제품으로 배출', 'https://ik.imagekit.io/blisgo/guide/vPrkwjswpvna.webp'), + ('PLASTIC', '플라스틱으로 배출', 'https://ik.imagekit.io/blisgo/guide/vmffktmxlr.webp'), + ('PAY_AS_YOU_GO_BAG', '종량제봉투로 배출', NULL), + ('SEPARATION_BY_MATERIAL', '재질에 맞게 배출', NULL), + ('CAUTION', '위험! 폐기시 주의가 필요함', NULL), + ('PRO_FACILITY', '전문처리시설로 배출', NULL); + + + diff --git a/app/src/main/resources/db/migration/V3__insert_waste.sql b/app/src/main/resources/db/migration/V3__insert_waste.sql new file mode 100644 index 0000000..0793b07 --- /dev/null +++ b/app/src/main/resources/db/migration/V3__insert_waste.sql @@ -0,0 +1,378 @@ +INSERT INTO waste (waste_id, name, type, picture, treatment) +VALUES (1001, '가격표', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1001.webp', NULL), + (1002, '가구류', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1002.webp', NULL), + (1003, '가발', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1003.webp', NULL), + (1004, '가습기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1004.webp', NULL), + (1005, '가위', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1005.webp', + '

다른 재질이 많이 섞인 제품은 분리해서 배출하며, 분리가 어렵다면 종량제봉투로 배출

'), + (1006, '개수대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1006.webp', NULL), + (1007, '거울', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1007.webp', + '

크기에 따라 해당 폐기물로 배출

'), + (1008, '걸레', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1008.webp', NULL), + (1009, '계란껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1009.webp', NULL), + (1010, '고무장갑', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1010.webp', NULL), + (1011, '골판지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1011.webp', + '

종이 < 일반 골판지
플라스틱 < PP 골판지

'), + (1012, '골프 클럽 백', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1012.webp', NULL), + (1013, '골프공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1013.webp', NULL), + (1014, '공구류(철)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1014.webp', + '

다른 재질이 많이 섞인 제품은 분리해서 배출하며, 분리가 어렵다면 종량제봉투로 배출

'), + (1015, '공기청정기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1015.webp', NULL), + (1016, '광고전단지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1016.webp', + '

비닐코팅된 종이는 종량제봉투 배출

'), + (1017, '구두, 샌들, 슬리퍼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1017.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출하거나 종량제봉투로 배출

'), + (1018, '국자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1018.webp', + '

고철 < 금속, 비금속 국자
플라스틱 < 플라스틱 국자
종량제봉투 < 나무 국자

'), + (1019, '그릇', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1019.webp', + '

불연성-종량제 < 도자기·유리그릇
고철 < 금속, 비금속그릇
플라스틱 < 플라스틱 그릇

'), + (1020, '기름(기계)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1020.webp', NULL), + (1021, '기름(식용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1021.webp', + '

전용수거함으로 배출

'), + (1022, '기타(악기)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1022.webp', NULL), + (1023, '깨진유리', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1023.webp', + '

불연성폐기물 배출방법을 참조하여 배출

'), + (1024, '나무젓가락', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1024.webp', NULL), + (1025, '나무조각, 나뭇가지, 나무줄기', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1025.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1026, '나사(못)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1026.webp', NULL), + (1027, '나침반', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1027.webp', NULL), + (1028, '낙엽', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1028.webp', NULL), + (1029, '낚싯대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1029.webp', NULL), + (1030, '난로(전기난로)', '폐가전제품/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1030.webp', + '

대형폐기물 또는 가전제품으로 배출

'), + (1031, '낫', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1031.webp', + '

고철로 배출하되, 가능하다면 손잡이 부분(나무재질 등)을 분리하여 배출

'), + (1032, '내열식기류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1032.webp', NULL), + (1033, '냄비뚜껑(강화유리)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1033.webp', NULL), + (1034, '냉장고(냉동고)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1034.webp', NULL), + (1035, '노트북', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1035.webp', NULL), + (1036, '농약용기', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1036.webp', + '

내용물을 다 사용한 후 따로 봉투에 담아 배출

'), + (1037, '다리미', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1037.webp', NULL), + (1038, '도끼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1038.webp', + '

고철로 배출하되, 가능하다면 손잡이 부분(나무재질 등)을 분리하여 배출

'), + (1039, '도마', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1039.webp', + '

종량제봉투 < 나무도마
플라스틱 < 플라스틱 도마

'), + (1040, '도자기류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1040.webp', NULL), + (1041, '돋보기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1041.webp', NULL), + (1042, '디지털카메라', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1042.webp', NULL), + (1043, '뚝배기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1043.webp', NULL), + (1044, '라디오', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1044.webp', NULL), + (1045, '라이터(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1045.webp', + '

모두 사용한 후 종량제봉투로 배출

'), + (1046, '라켓(배드민턴, 테니스 등)', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1046.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1047, '랩(사용 후)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1047.webp', + '

사용한 랩은 종량제봉투로 배출

'), + (1048, '랩의 심', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1048.webp', NULL), + (1049, '런닝머신', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1049.webp', NULL), + (1050, '리코더(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1050.webp', NULL), + (1051, '마스크', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1051.webp', NULL), + (1052, '마우스패드', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1052.webp', NULL), + (1053, '마커펜, 만년필', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1053.webp', NULL), + (1054, '매트, 매트리스', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1054.webp', NULL), + (1055, '맥주병뚜껑(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1055.webp', NULL), + (1056, '머그컵(도자기류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1056.webp', NULL), + (1057, '머플러(목도리)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1057.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출

'), + (1058, '메가폰(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1058.webp', NULL), + (1059, '면도기(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1059.webp', NULL), + (1060, '면도칼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1060.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출

'), + (1061, '면봉', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1061.webp', NULL), + (1062, '명함', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1062.webp', + '

종이류로 배출하며, 플라스틱 합성지 등 다른 재질 포함시 종량제봉투에 배출

'), + (1063, '명함지갑', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1063.webp', NULL), + (1064, '모니터(컴퓨터 TV)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1064.webp', NULL), + (1065, '모자(의류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1065.webp', + '

의류 및 원단류 배출 방법을 참고하여 배출하거나 종량제봉투로 배출

'), + (1066, '목발', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1066.webp', + '

대형폐기물 또는 고철 등 재질에 맞게 배출

'), + (1067, '목재', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1067.webp', + '

종량제봉투에 담을 수 없다면 대형폐기물로 처리

'), + (1068, '문갑, 문짝', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1068.webp', NULL), + (1069, '물티슈', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1069.webp', NULL), + (1070, '밀짚모자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1070.webp', NULL), + (1071, '바나나껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1071.webp', NULL), + (1072, '바둑판', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1072.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1073, '바베큐그릴', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1073.webp', NULL), + (1074, '밥상', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1074.webp', NULL), + (1075, '방석', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1075.webp', NULL), + (1076, '백과사전, 사전', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1076.webp', NULL), + (1077, '백열전구', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1077.webp', NULL), + (1078, '벼루', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1078.webp', NULL), + (1079, '벽돌', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1079.webp', NULL), + (1080, '벽시계', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1080.webp', NULL), + (1081, '보온병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1081.webp', NULL), + (1082, '복사기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1082.webp', NULL), + (1083, '볼펜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1083.webp', NULL), + (1084, '볼풀공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1084.webp', NULL), + (1085, '분무기(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1085.webp', NULL), + (1086, '분유 깡통', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1086.webp', NULL), + (1087, '붓', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1087.webp', NULL), + (1088, '블라인드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1088.webp', NULL), + (1089, '비닐봉지(일회용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1089.webp', NULL), + (1090, '비닐장판', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1090.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1091, '비닐코팅종이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1091.webp', NULL), + (1092, '비디오카메라(캠코더)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1092.webp', NULL), + (1093, '비디오테이프', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1093.webp', + '

내부 필름은 분리하여 종량제봉투로 배출

'), + (1094, '빗, 헤어브러시', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1094.webp', + '

재질에 맞게 배출하되 나무 빗 등은 종량제봉투로 배출

'), + (1095, '빨대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1095.webp', NULL), + (1096, '사다리', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1096.webp', + '

대형폐기물 또는 고철로 배출

'), + (1097, '사인펜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1097.webp', NULL), + (1098, '사진', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1098.webp', NULL), + (1099, '사진인화지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1099.webp', NULL), + (1100, '삽', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1100.webp', + '

대형폐기물 또는 재질에 맞게 배출

'), + (1101, '상한 음식', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1101.webp', NULL), + (1102, '생선(먹고 남은)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1102.webp', + '

생선뼈는 종량제봉투에 버리고, 나머지는 음식물로 배출

'), + (1103, '샤프펜슬', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1103.webp', NULL), + (1104, '샴푸용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1104.webp', + '

내부를 헹구고 플라스틱으로 배출

'), + (1105, '서랍장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1105.webp', NULL), + (1106, '서류봉투(갈색 종이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1106.webp', NULL), + (1107, '선풍기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1107.webp', NULL), + (1108, '성냥', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1108.webp', + '

물에 적신 후 종량제봉투로 배출

'), + (1109, '세면대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1109.webp', NULL), + (1110, '세탁기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1110.webp', NULL), + (1111, '셔틀콕(배드민턴공, 깃털공)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1111.webp', NULL), + (1112, '소스용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1112.webp', + '

내부를 헹구고 플라스틱 또는 재질에 맞게 배출

'), + (1113, '손목 시계', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1113.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 처리, 건전지는 분리하여 전용수거함으로 배출

'), + (1114, '솜', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1114.webp', NULL), + (1115, '솜이불', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1115.webp', NULL), + (1116, '송곳', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1116.webp', NULL), + (1117, '수세미', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1117.webp', NULL), + (1118, '수조, 수족관', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1118.webp', NULL), + (1119, '수첩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1119.webp', + '

종이류 또는 재질에 맞게 배출

'), + (1120, '숯', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1120.webp', NULL), + (1121, '스노우보드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1121.webp', NULL), + (1122, '스캐너', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1122.webp', NULL), + (1123, '스케이트보드', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1123.webp', NULL), + (1124, '스키용구류', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1124.webp', NULL), + (1125, '스탠드', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1125.webp', NULL), + (1126, '스폰지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1126.webp', NULL), + (1127, '스프레이, 부탄가스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1127.webp', '

금속캔(부탄가스통) 배출방법 참고

'), + (1128, '스피커', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1128.webp', NULL), + (1129, '식기세척기(식기건조기)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1129.webp', NULL), + (1130, '식물, 나무', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1130.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1131, '식용유용기(플라스틱)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1131.webp', + '

모두 사용 후 플라스틱으로 배출

'), + (1132, '신문지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1132.webp', NULL), + (1133, '신발', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1133.webp', NULL), + (1134, '신발장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1134.webp', NULL), + (1135, '싱크대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1135.webp', NULL), + (1136, '쌀통', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1136.webp', NULL), + (1137, '쌀포대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1137.webp', + '

종이류 또는 재질에 맞게 배출

'), + (1138, '쓰레받기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1138.webp', + '

플라스틱 < 가정용 플라스틱 쓰레받기
고철 < 고철 쓰레받기

'), + (1139, '아기욕조, 아기침대', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1139.webp', NULL), + (1140, '아령', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1140.webp', + '

고철 또는 재질에 맞게 배출

'), + (1141, '아이스팩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1141.webp', NULL), + (1142, '악기', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1142.webp', + '

종량제봉투에 담을 수 없는 경우 대형페기물로 배출
※악기는 폐가전 제품 무상방문 수거 대상품목이 아님

'), + (1143, '압력솓', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1143.webp', NULL), + (1144, '애완동물 용변 시트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1144.webp', NULL), + (1145, '애완동물 음식캔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1145.webp', + '

금속캔으로 배출

'), + (1146, '애완동물집, 운반케이스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1146.webp', NULL), + (1147, '액자', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1147.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1148, '앨범', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1148.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1149, '야구공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1149.webp', NULL), + (1150, '야구글러브', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1150.webp', NULL), + (1151, '야구배트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1151.webp', + '

재질에 맞게 배출 또는 종량제봉투로 배출

'), + (1152, '약 종류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1152.webp', + '

약국, 보건소 등의 전용수거함으로 배출

'), + (1153, '양초', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1153.webp', NULL), + (1154, '에어매트', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1154.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리

'), + (1155, '에어컨', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1155.webp', NULL), + (1156, '엔진오일', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1156.webp', + '

전문처리시설(카센터 등)로 배출

'), + (1157, '여행가방(트렁크)', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1157.webp', NULL), + (1158, '역기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1158.webp', NULL), + (1159, '연필, 색연필', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1159.webp', NULL), + (1160, '연필깎이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1160.webp', NULL), + (1161, '오디오세트', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1161.webp', NULL), + (1162, '오렌지껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1162.webp', NULL), + (1163, '온풍기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1163.webp', NULL), + (1164, '옷걸이(세탁소 흰색 철사)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1164.webp', NULL), + (1165, '와이퍼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1165.webp', NULL), + (1166, '와인셀러', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1166.webp', NULL), + (1167, '완충재(뽁뽁이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1167.webp', NULL), + (1168, '요가매트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1168.webp', NULL), + (1169, '우산', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1169.webp', + '

뼈대와 비닐을 분리하여, 각각의 분리수거함으로 배출, 분리가 어렵다면 종량제봉투로 배출

'), + (1170, '유리병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1170.webp', '

유리병류로 배출

'), + (1171, '유리병뚜껑(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1171.webp', NULL), + (1172, '유리판, 유리제품', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1172.webp', + '

불연성폐기물 또는 대형폐기물로 배출

'), + (1173, '유모차', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1173.webp', NULL), + (1174, '윤활유', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1174.webp', '

구입처와 상담 후 배출

'), + (1175, '응접세트', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1175.webp', NULL), + (1176, '의류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1176.webp', + '

의류 및 원단류로 배출

'), + (1177, '의류건조대', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1177.webp', + '

고철, 플라스틱재질에 맞게 배출

'), + (1178, '의자', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1178.webp', NULL), + (1179, '이불', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1179.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1180, '인형류', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1180.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1181, '자동차 부품', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1181.webp', '

중고센터, 판매처 등과 상담하여 처리

'), + (1182, '자루걸레', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1182.webp', NULL), + (1183, '자석', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1183.webp', NULL), + (1184, '자전거', '기타폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1184.webp', + '

대형폐기물로 처리하거나, 중고센터 등과 상담하여 처리

'), + (1185, '잡지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1185.webp', NULL), + (1186, '장난감류', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1186.webp', + '

크기에 따라 대형폐기물 또는 재질에 맞게 배출 (여러재질이 섞인 경우 종량제봉투로 배출)

'), + (1187, '장롱', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1187.webp', NULL), + (1188, '장식장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1188.webp', NULL), + (1189, '장판', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1189.webp', NULL), + (1190, '재떨이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1190.webp', + '

불연성-종량제 < 도자기·유리재떨이
고철 < 금속류 재떨이

'), + (1191, '전기밥솔', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1191.webp', NULL), + (1192, '전기비데', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1192.webp', NULL), + (1193, '전기오븐레인지', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1193.webp', NULL), + (1194, '전기코드류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1194.webp', NULL), + (1195, '전기포트', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1195.webp', NULL), + (1196, '전단지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1196.webp', NULL), + (1197, '전동칫솔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1197.webp', NULL), + (1198, '전자레인지', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1198.webp', NULL), + (1199, '전자사전(전자수첩)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1199.webp', NULL), + (1200, '전자피아노', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1200.webp', + '

종량제봉투에 담을 수 없는 경우 대형폐기물로 처리
※악기는 폐가전 제품 무상방문 수거 대상품목이 아님

'), + (1201, '전지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1201.webp', + '

전용수거함으로 배출

'), + (1202, '전축', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1202.webp', NULL), + (1203, '전화기(팩스포함)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1203.webp', NULL), + (1204, '전화번호부', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1204.webp', NULL), + (1205, '접착제(본드 등)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1205.webp', NULL), + (1206, '정기장판', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1206.webp', + '

대형폐기물로 배출 (전기이불담요 포함)

'), + (1207, '정수기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1207.webp', + '

대형가전으로 배출

'), + (1208, '젖꼭지(아기용품)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1208.webp', NULL), + (1209, '젖병(아기용품)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1209.webp', + '

젖병의 몸체와 윗부분의 젖꼭지는 분리하여 재질에 맞게 배출

'), + (1210, '조각칼', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1210.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출

'), + (1211, '종이기저귀', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1211.webp', NULL), + (1212, '종이상자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1212.webp', NULL), + (1213, '종이심', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1213.webp', NULL), + (1214, '종이조각', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1214.webp', NULL), + (1215, '종이팩(우유팩 등)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1215.webp', + '

내부에 알루미늄박이 붙어 있다면 종량제봉투로 배출

'), + (1216, '주전자(철, 알루미늄)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1216.webp', + '

플라스틱 뚜껑 등은 돌려서 제거한 후 고철로 배출

'), + (1217, '줄자', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1217.webp', + '

재질에 맞게 배출 또는 종량제봉투로 배출

'), + (1218, '지우개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1218.webp', NULL), + (1219, '진열대', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1219.webp', NULL), + (1220, '차 찌꺼기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1220.webp', NULL), + (1221, '찬장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1221.webp', NULL), + (1222, '찻잔(도자기류)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1222.webp', NULL), + (1223, '책', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1223.webp', NULL), + (1224, '책상, 책장', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1224.webp', NULL), + (1225, '천체망원경', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1225.webp', NULL), + (1226, '철사', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1226.webp', NULL), + (1227, '철판(가정요리용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1227.webp', NULL), + (1228, '청소기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1228.webp', NULL), + (1229, '체온계(건전지, 디지털)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1229.webp', + '

건전지는 분리하여 전용수거함으로 배출

'), + (1230, '체중계', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1230.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1231, '축구공', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1231.webp', NULL), + (1232, '충전식전지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1232.webp', + '

전용수거함으로 배출

'), + (1233, '치약용기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1233.webp', + '

플라스틱 또는 재질에 맞게 배출

'), + (1234, '치킨박스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1234.webp', + '

기름에 오염된 내부 종이는 종량제봉투로 배출

'), + (1235, '침구류(이불, 베개 등)', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1235.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1236, '침대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1236.webp', NULL), + (1237, '칫솔', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1237.webp', NULL), + (1238, '카펫, 융단', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1238.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1239, '캐비넷', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1239.webp', NULL), + (1240, '캔 따개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1240.webp', NULL), + (1241, '캡(플라스틱 뚜껑)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1241.webp', NULL), + (1242, '커튼, 커튼 레일', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1242.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1243, '커피메이커', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1243.webp', NULL), + (1244, '커피원두, 찌꺼기', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1244.webp', NULL), + (1245, '컴퓨터', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1245.webp', NULL), + (1246, '컵', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1246.webp', + '

불연성-종량제 < 도자기·유리 컵
고철 < 금속·비금속 컵
플라스틱 < 플라스틱컵

'), + (1247, '코르크따개(와인따개)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1247.webp', + '

수거원이 다치지 않도록 종이 등으로 감싸서 종량제봉투로 배출
재질에 맞게 해당 분리수거함으로 배출

'), + (1248, '코르크마개', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1248.webp', NULL), + (1249, '코팅된 종이', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1249.webp', NULL), + (1250, '콘센트', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1250.webp', NULL), + (1251, '콘텍트렌즈', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1251.webp', NULL), + (1252, '쿠션', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1252.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1253, '크레용', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1253.webp', NULL), + (1254, '키보드(컴퓨터용)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1254.webp', NULL), + (1255, '타이어', '기타폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1255.webp', '

구입처와 상담 후 배출

'), + (1256, '탁상달력', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1256.webp', + '

종이류 배출방법을 참고하여 배출

'), + (1257, '탈수기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1257.webp', NULL), + (1258, '텐트', '생활폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1258.webp', + '

종량제종투에 담을 수 없는 경우 대형폐기물로 배출

'), + (1259, '텔레비전(TV)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1259.webp', NULL), + (1260, '토스터기', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1260.webp', NULL), + (1261, '톱', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1261.webp', NULL), + (1262, '튀김기름', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1262.webp', + '

폐식용유 전용수거함 배출

'), + (1263, '틀니', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1263.webp', NULL), + (1264, '티백(녹차)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1264.webp', NULL), + (1265, '파인애플껍질', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1265.webp', NULL), + (1266, '팩스(복합기)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1266.webp', NULL), + (1267, '페트병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1267.webp', NULL), + (1268, '포스터, 포장지', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1268.webp', + '

종이류 배출방법을 참고하여 배출

'), + (1269, '프린터', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1269.webp', NULL), + (1270, '피아노', '기타폐기물/대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1270.webp', + '

대형폐기물로 처리하거나, 중고센터등과 상담하여 처리

'), + (1271, '피자 세이버(피자 삼발이)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1271.webp', NULL), + (1272, '피자박스', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1272.webp', + '

기름에 오염된 내부 종이는 종량제봉투로 배출

'), + (1273, '필름(사진용)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1273.webp', NULL), + (1274, '핫팩', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1274.webp', NULL), + (1275, '항아리', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1275.webp', + '

대형폐기물로 처리

'), + (1276, '헝겁류', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1276.webp', NULL), + (1277, '헤드폰(헤드셋)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1277.webp', NULL), + (1278, '헬멧', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1278.webp', + '

종량제봉투로 배출하되, 분리하여 재질에 맞게 배출

'), + (1279, '형광등', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1279.webp', + '

전용수거함으로 배출

'), + (1280, '호일(사용 후)', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1280.webp', NULL), + (1281, '화로', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1281.webp', NULL), + (1282, '화분, 화병', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1282.webp', + '

불연성폐기물로 배출 등 재질에 맞게 배출

'), + (1283, '화장대', '대형폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1283.webp', NULL), + (1284, '화장품냉장고', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1284.webp', NULL), + (1285, '후라이팬', '생활폐기물', 'https://ik.imagekit.io/blisgo/dictionary/1285.webp', NULL), + (1286, '휴대용 플레이어(MP3등)', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1286.webp', NULL), + (1287, '휴대전화', '폐가전제품', 'https://ik.imagekit.io/blisgo/dictionary/1287.webp', + '

폐가전제품으로 배출
※우체국 보상판매 이용 가능

'); \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V4__insert_waste_categories.sql b/app/src/main/resources/db/migration/V4__insert_waste_categories.sql new file mode 100644 index 0000000..9c3ea18 --- /dev/null +++ b/app/src/main/resources/db/migration/V4__insert_waste_categories.sql @@ -0,0 +1,356 @@ +INSERT INTO waste_categories (categories, waste_id) +VALUES ('PAPER', 1001), + ('BULKY', 1002), + ('PAY_AS_YOU_GO_BAG', 1003), + ('HOME_APPLIANCES', 1004), + ('PAY_AS_YOU_GO_BAG', 1005), + ('SEPARATION_BY_MATERIAL', 1005), + ('BULKY', 1006), + ('NON_FLAMMABLE', 1007), + ('BULKY', 1007), + ('PAY_AS_YOU_GO_BAG', 1008), + ('PAY_AS_YOU_GO_BAG', 1009), + ('PAY_AS_YOU_GO_BAG', 1010), + ('PAPER', 1011), + ('PLASTIC', 1011), + ('BULKY', 1012), + ('PAY_AS_YOU_GO_BAG', 1013), + ('IRON', 1014), + ('HOME_APPLIANCES', 1015), + ('PAPER', 1016), + ('CLOTHES', 1017), + ('PAY_AS_YOU_GO_BAG', 1017), + ('IRON', 1018), + ('PLASTIC', 1018), + ('PAY_AS_YOU_GO_BAG', 1018), + ('NON_FLAMMABLE', 1019), + ('IRON', 1019), + ('PLASTIC', 1019), + ('PRO_FACILITY', 1020), + ('ONLY_BOX', 1021), + ('BULKY', 1022), + ('NON_FLAMMABLE', 1023), + ('PAY_AS_YOU_GO_BAG', 1024), + ('PAY_AS_YOU_GO_BAG', 1025), + ('BULKY', 1025), + ('IRON', 1026), + ('PAY_AS_YOU_GO_BAG', 1027), + ('PAY_AS_YOU_GO_BAG', 1028), + ('BULKY', 1029), + ('HOME_APPLIANCES', 1030), + ('BULKY', 1030), + ('IRON', 1031), + ('PAY_AS_YOU_GO_BAG', 1031), + ('NON_FLAMMABLE', 1032), + ('PAY_AS_YOU_GO_BAG', 1033), + ('HOME_APPLIANCES', 1034), + ('HOME_APPLIANCES', 1035), + ('CAUTION', 1036), + ('HOME_APPLIANCES', 1037), + ('IRON', 1038), + ('PAY_AS_YOU_GO_BAG', 1038), + ('PAY_AS_YOU_GO_BAG', 1039), + ('PLASTIC', 1039), + ('NON_FLAMMABLE', 1040), + ('PAY_AS_YOU_GO_BAG', 1041), + ('HOME_APPLIANCES', 1042), + ('NON_FLAMMABLE', 1043), + ('HOME_APPLIANCES', 1044), + ('PAY_AS_YOU_GO_BAG', 1045), + ('CAUTION', 1045), + ('PAY_AS_YOU_GO_BAG', 1046), + ('BULKY', 1046), + ('PAY_AS_YOU_GO_BAG', 1047), + ('PAPER', 1048), + ('HOME_APPLIANCES', 1049), + ('PLASTIC', 1050), + ('PAY_AS_YOU_GO_BAG', 1051), + ('PAY_AS_YOU_GO_BAG', 1052), + ('PAY_AS_YOU_GO_BAG', 1053), + ('BULKY', 1054), + ('IRON', 1055), + ('NON_FLAMMABLE', 1056), + ('CLOTHES', 1057), + ('PLASTIC', 1058), + ('PAY_AS_YOU_GO_BAG', 1059), + ('PAY_AS_YOU_GO_BAG', 1060), + ('CAUTION', 1060), + ('PAY_AS_YOU_GO_BAG', 1061), + ('PAPER', 1062), + ('PAY_AS_YOU_GO_BAG', 1062), + ('PAY_AS_YOU_GO_BAG', 1063), + ('HOME_APPLIANCES', 1064), + ('CLOTHES', 1065), + ('PAY_AS_YOU_GO_BAG', 1065), + ('IRON', 1066), + ('SEPARATION_BY_MATERIAL', 1066), + ('BULKY', 1066), + ('PAY_AS_YOU_GO_BAG', 1067), + ('BULKY', 1067), + ('BULKY', 1068), + ('PAY_AS_YOU_GO_BAG', 1069), + ('PAY_AS_YOU_GO_BAG', 1070), + ('PROG', 1071), + ('PAY_AS_YOU_GO_BAG', 1072), + ('BULKY', 1072), + ('BULKY', 1073), + ('BULKY', 1074), + ('PAY_AS_YOU_GO_BAG', 1075), + ('PAPER', 1076), + ('NON_FLAMMABLE', 1077), + ('PAY_AS_YOU_GO_BAG', 1078), + ('NON_FLAMMABLE', 1079), + ('BULKY', 1080), + ('PAY_AS_YOU_GO_BAG', 1081), + ('HOME_APPLIANCES', 1082), + ('PAY_AS_YOU_GO_BAG', 1083), + ('PLASTIC', 1084), + ('PLASTIC', 1085), + ('IRON', 1086), + ('PAY_AS_YOU_GO_BAG', 1087), + ('BULKY', 1088), + ('VINYL', 1089), + ('PAY_AS_YOU_GO_BAG', 1090), + ('BULKY', 1090), + ('PAY_AS_YOU_GO_BAG', 1091), + ('HOME_APPLIANCES', 1092), + ('PLASTIC', 1093), + ('SEPARATION_BY_MATERIAL', 1094), + ('PAY_AS_YOU_GO_BAG', 1094), + ('PLASTIC', 1095), + ('IRON', 1096), + ('BULKY', 1096), + ('PAY_AS_YOU_GO_BAG', 1097), + ('PAY_AS_YOU_GO_BAG', 1098), + ('PAY_AS_YOU_GO_BAG', 1099), + ('SEPARATION_BY_MATERIAL', 1100), + ('BULKY', 1100), + ('PROG', 1101), + ('PROG', 1102), + ('PAY_AS_YOU_GO_BAG', 1102), + ('PAY_AS_YOU_GO_BAG', 1103), + ('PLASTIC', 1104), + ('BULKY', 1105), + ('PAPER', 1106), + ('HOME_APPLIANCES', 1107), + ('PAY_AS_YOU_GO_BAG', 1108), + ('BULKY', 1109), + ('HOME_APPLIANCES', 1110), + ('PAY_AS_YOU_GO_BAG', 1111), + ('PLASTIC', 1112), + ('SEPARATION_BY_MATERIAL', 1112), + ('PAY_AS_YOU_GO_BAG', 1113), + ('PAY_AS_YOU_GO_BAG', 1114), + ('BULKY', 1115), + ('PAY_AS_YOU_GO_BAG', 1116), + ('PAY_AS_YOU_GO_BAG', 1117), + ('BULKY', 1118), + ('PAPER', 1119), + ('SEPARATION_BY_MATERIAL', 1119), + ('PAY_AS_YOU_GO_BAG', 1120), + ('BULKY', 1121), + ('HOME_APPLIANCES', 1122), + ('BULKY', 1123), + ('BULKY', 1124), + ('HOME_APPLIANCES', 1125), + ('PAY_AS_YOU_GO_BAG', 1126), + ('METAL', 1127), + ('CAUTION', 1127), + ('HOME_APPLIANCES', 1128), + ('HOME_APPLIANCES', 1129), + ('PAY_AS_YOU_GO_BAG', 1130), + ('BULKY', 1130), + ('PLASTIC', 1131), + ('PAPER', 1132), + ('PAY_AS_YOU_GO_BAG', 1133), + ('BULKY', 1134), + ('BULKY', 1135), + ('BULKY', 1136), + ('PAPER', 1137), + ('SEPARATION_BY_MATERIAL', 1137), + ('PLASTIC', 1138), + ('IRON', 1138), + ('SEPARATION_BY_MATERIAL', 1139), + ('BULKY', 1139), + ('IRON', 1140), + ('SEPARATION_BY_MATERIAL', 1140), + ('PAY_AS_YOU_GO_BAG', 1141), + ('PAY_AS_YOU_GO_BAG', 1142), + ('BULKY', 1142), + ('IRON', 1143), + ('PAY_AS_YOU_GO_BAG', 1144), + ('METAL', 1145), + ('CAUTION', 1145), + ('SEPARATION_BY_MATERIAL', 1146), + ('PAY_AS_YOU_GO_BAG', 1147), + ('BULKY', 1147), + ('PAY_AS_YOU_GO_BAG', 1148), + ('BULKY', 1148), + ('PAY_AS_YOU_GO_BAG', 1149), + ('PAY_AS_YOU_GO_BAG', 1150), + ('SEPARATION_BY_MATERIAL', 1151), + ('PAY_AS_YOU_GO_BAG', 1151), + ('ONLY_BOX', 1152), + ('PAY_AS_YOU_GO_BAG', 1153), + ('PAY_AS_YOU_GO_BAG', 1154), + ('BULKY', 1154), + ('HOME_APPLIANCES', 1155), + ('PRO_FACILITY', 1156), + ('BULKY', 1157), + ('IRON', 1158), + ('PAY_AS_YOU_GO_BAG', 1159), + ('PAY_AS_YOU_GO_BAG', 1160), + ('HOME_APPLIANCES', 1161), + ('PROG', 1162), + ('HOME_APPLIANCES', 1163), + ('IRON', 1164), + ('SEPARATION_BY_MATERIAL', 1165), + ('HOME_APPLIANCES', 1166), + ('VINYL', 1167), + ('PAY_AS_YOU_GO_BAG', 1168), + ('PAY_AS_YOU_GO_BAG', 1169), + ('GLASS', 1170), + ('CAUTION', 1170), + ('IRON', 1171), + ('NON_FLAMMABLE', 1172), + ('BULKY', 1172), + ('BULKY', 1173), + ('PRO_FACILITY', 1174), + ('BULKY', 1175), + ('CLOTHES', 1176), + ('IRON', 1177), + ('PLASTIC', 1177), + ('SEPARATION_BY_MATERIAL', 1177), + ('BULKY', 1178), + ('PAY_AS_YOU_GO_BAG', 1179), + ('BULKY', 1179), + ('PAY_AS_YOU_GO_BAG', 1180), + ('BULKY', 1180), + ('PRO_FACILITY', 1181), + ('BULKY', 1182), + ('PAY_AS_YOU_GO_BAG', 1183), + ('PRO_FACILITY', 1184), + ('BULKY', 1184), + ('PAPER', 1185), + ('SEPARATION_BY_MATERIAL', 1186), + ('PAY_AS_YOU_GO_BAG', 1186), + ('BULKY', 1186), + ('BULKY', 1187), + ('BULKY', 1188), + ('BULKY', 1189), + ('NON_FLAMMABLE', 1190), + ('IRON', 1190), + ('HOME_APPLIANCES', 1191), + ('HOME_APPLIANCES', 1192), + ('HOME_APPLIANCES', 1193), + ('PAY_AS_YOU_GO_BAG', 1194), + ('HOME_APPLIANCES', 1195), + ('PAPER', 1196), + ('PAY_AS_YOU_GO_BAG', 1197), + ('HOME_APPLIANCES', 1198), + ('HOME_APPLIANCES', 1199), + ('PAY_AS_YOU_GO_BAG', 1200), + ('BULKY', 1200), + ('ONLY_BOX', 1201), + ('HOME_APPLIANCES', 1202), + ('HOME_APPLIANCES', 1203), + ('PAPER', 1204), + ('PAY_AS_YOU_GO_BAG', 1205), + ('BULKY', 1206), + ('HOME_APPLIANCES', 1207), + ('PAY_AS_YOU_GO_BAG', 1208), + ('PLASTIC', 1209), + ('SEPARATION_BY_MATERIAL', 1209), + ('PAY_AS_YOU_GO_BAG', 1210), + ('PAY_AS_YOU_GO_BAG', 1211), + ('PAPER', 1212), + ('PAPER', 1213), + ('PAPER', 1214), + ('CARTON', 1215), + ('IRON', 1216), + ('SEPARATION_BY_MATERIAL', 1217), + ('PAY_AS_YOU_GO_BAG', 1217), + ('PAY_AS_YOU_GO_BAG', 1218), + ('SEPARATION_BY_MATERIAL', 1219), + ('BULKY', 1219), + ('PAY_AS_YOU_GO_BAG', 1220), + ('BULKY', 1221), + ('NON_FLAMMABLE', 1222), + ('PAPER', 1223), + ('BULKY', 1224), + ('BULKY', 1225), + ('IRON', 1226), + ('IRON', 1227), + ('HOME_APPLIANCES', 1228), + ('PAY_AS_YOU_GO_BAG', 1229), + ('PAY_AS_YOU_GO_BAG', 1230), + ('BULKY', 1230), + ('PAY_AS_YOU_GO_BAG', 1231), + ('ONLY_BOX', 1232), + ('PLASTIC', 1233), + ('SEPARATION_BY_MATERIAL', 1233), + ('PAPER', 1234), + ('PAY_AS_YOU_GO_BAG', 1235), + ('BULKY', 1235), + ('BULKY', 1236), + ('PAY_AS_YOU_GO_BAG', 1237), + ('PAY_AS_YOU_GO_BAG', 1238), + ('BULKY', 1238), + ('BULKY', 1239), + ('IRON', 1240), + ('PLASTIC', 1241), + ('PAY_AS_YOU_GO_BAG', 1242), + ('BULKY', 1242), + ('HOME_APPLIANCES', 1243), + ('PAY_AS_YOU_GO_BAG', 1244), + ('HOME_APPLIANCES', 1245), + ('NON_FLAMMABLE', 1246), + ('IRON', 1246), + ('PLASTIC', 1246), + ('PAY_AS_YOU_GO_BAG', 1247), + ('SEPARATION_BY_MATERIAL', 1247), + ('PAY_AS_YOU_GO_BAG', 1248), + ('PAY_AS_YOU_GO_BAG', 1249), + ('PAY_AS_YOU_GO_BAG', 1250), + ('PAY_AS_YOU_GO_BAG', 1251), + ('PAY_AS_YOU_GO_BAG', 1252), + ('BULKY', 1252), + ('PAY_AS_YOU_GO_BAG', 1253), + ('HOME_APPLIANCES', 1254), + ('PRO_FACILITY', 1255), + ('PAPER', 1256), + ('HOME_APPLIANCES', 1257), + ('PAY_AS_YOU_GO_BAG', 1258), + ('BULKY', 1258), + ('HOME_APPLIANCES', 1259), + ('HOME_APPLIANCES', 1260), + ('IRON', 1261), + ('ONLY_BOX', 1262), + ('PAY_AS_YOU_GO_BAG', 1263), + ('PAY_AS_YOU_GO_BAG', 1264), + ('PAY_AS_YOU_GO_BAG', 1265), + ('HOME_APPLIANCES', 1266), + ('PLASTIC', 1267), + ('PAPER', 1268), + ('HOME_APPLIANCES', 1269), + ('BULKY', 1270), + ('PRO_FACILITY', 1270), + ('PLASTIC', 1271), + ('PAPER', 1272), + ('PAY_AS_YOU_GO_BAG', 1273), + ('PAY_AS_YOU_GO_BAG', 1274), + ('BULKY', 1275), + ('PAY_AS_YOU_GO_BAG', 1276), + ('HOME_APPLIANCES', 1277), + ('PAY_AS_YOU_GO_BAG', 1278), + ('SEPARATION_BY_MATERIAL', 1278), + ('ONLY_BOX', 1279), + ('PAY_AS_YOU_GO_BAG', 1280), + ('BULKY', 1281), + ('NON_FLAMMABLE', 1282), + ('SEPARATION_BY_MATERIAL', 1282), + ('BULKY', 1283), + ('HOME_APPLIANCES', 1284), + ('IRON', 1285), + ('HOME_APPLIANCES', 1286), + ('HOME_APPLIANCES', 1287); \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V5__insert_account.sql b/app/src/main/resources/db/migration/V5__insert_account.sql new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/resources/db/migration/V6__insert_board_values.sql b/app/src/main/resources/db/migration/V6__insert_board_values.sql new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/resources/db/migration/V7__insert_reply_values.sql b/app/src/main/resources/db/migration/V7__insert_reply_values.sql new file mode 100644 index 0000000..e69de29 diff --git a/autoexecute.bat b/autoexecute.bat new file mode 100644 index 0000000..9c765c5 --- /dev/null +++ b/autoexecute.bat @@ -0,0 +1,15 @@ +@echo off + +echo Current directory: %cd% + +cd .\infrastructure\internal\src\main\resources + +if exist static ( + rmdir /s /q static +) + +if not exist static ( + mkdir static +) + +move /y assets .\static\assets \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7299852 --- /dev/null +++ b/build.gradle @@ -0,0 +1,60 @@ +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:+") + } +} + +subprojects { + if (name == 'infrastructure' || name == 'interfaces') return + + group = 'blisgo' + version = 'V4' + + apply { + plugin 'java' + plugin 'org.springframework.boot' + plugin 'io.spring.dependency-management' + } + + repositories { + mavenCentral() + } + + dependencies { + developmentOnly 'org.springframework.boot:spring-boot-devtools' + + // componentScan + implementation 'org.springframework.boot:spring-boot-autoconfigure' + + // configuration processor + annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' + + // minimal web + implementation 'org.springframework.boot:spring-boot-starter:+' + + // spring-data-commons(ex. pageable) + implementation 'org.springframework.data:spring-data-commons' + + // ddd hexagonal + implementation 'org.jmolecules:jmolecules-hexagonal-architecture:+' + + // lombok + implementation 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + // modelmapper + implementation 'org.modelmapper:modelmapper:+' + implementation 'org.modelmapper:modelmapper-module-record:+' + + // docker + developmentOnly 'org.springframework.boot:spring-boot-docker-compose' + } + + test { + useJUnitPlatform() + } +} \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..71d3d85 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,9 @@ +repositories { + mavenCentral() +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2261322 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +services: + mysql: + image: mysql:latest + container_name: blisgo-db + environment: + - MYSQL_DATABASE=blisgo + - MYSQL_ROOT_PASSWORD=root + ports: + - 3306:3306 + + redis: + image: redis:latest + container_name: blisgo-documents + ports: + - 6379:6379 + +networks: + network: \ No newline at end of file diff --git a/domain/build.gradle b/domain/build.gradle new file mode 100644 index 0000000..dfa8623 --- /dev/null +++ b/domain/build.gradle @@ -0,0 +1,5 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { +} diff --git a/domain/src/main/java/blisgo/domain/DomainRoot.java b/domain/src/main/java/blisgo/domain/DomainRoot.java new file mode 100644 index 0000000..704bf95 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/DomainRoot.java @@ -0,0 +1,7 @@ +package blisgo.domain; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan(basePackageClasses = DomainRoot.class) +public interface DomainRoot { +} diff --git a/domain/src/main/java/blisgo/domain/common/Author.java b/domain/src/main/java/blisgo/domain/common/Author.java new file mode 100644 index 0000000..441d956 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/common/Author.java @@ -0,0 +1,15 @@ +package blisgo.domain.common; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Author { + private String email; + private String name; + private Picture picture; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/common/Content.java b/domain/src/main/java/blisgo/domain/common/Content.java new file mode 100644 index 0000000..f6949f4 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/common/Content.java @@ -0,0 +1,19 @@ +package blisgo.domain.common; + +import lombok.*; + +@Builder +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Content { + private String text; + private Picture thumbnail; + private String preview; + + public static Content of(String text) { + return Content.builder() + .text(text) + .build(); + } +} diff --git a/domain/src/main/java/blisgo/domain/common/Hashtag.java b/domain/src/main/java/blisgo/domain/common/Hashtag.java new file mode 100644 index 0000000..9cb77e3 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/common/Hashtag.java @@ -0,0 +1,13 @@ +package blisgo.domain.common; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Hashtag { + private String content; +} diff --git a/domain/src/main/java/blisgo/domain/common/Picture.java b/domain/src/main/java/blisgo/domain/common/Picture.java new file mode 100644 index 0000000..565631c --- /dev/null +++ b/domain/src/main/java/blisgo/domain/common/Picture.java @@ -0,0 +1,13 @@ +package blisgo.domain.common; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Picture { + private String url; +} diff --git a/domain/src/main/java/blisgo/domain/community/Post.java b/domain/src/main/java/blisgo/domain/community/Post.java new file mode 100644 index 0000000..cca7164 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/community/Post.java @@ -0,0 +1,51 @@ +package blisgo.domain.community; + +import blisgo.domain.common.Author; +import blisgo.domain.common.Content; +import blisgo.domain.community.vo.PostId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Getter +@SuperBuilder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Post { + private PostId postId; + private String title; + private Author author; + private Content content; + private long views; + private long likes; + private long replies; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; + + public static Post create(Long postId, String title, String content) { + return Post.builder() + .postId(PostId.of(postId)) + .title(title) + .content(Content.of(content)) + .build(); + } + + public static Post create(String title, String content) { + return Post.builder() + .title(title) + .content(Content.of(content)) + .build(); + } + + public void likePost() { + this.likes++; + } + + public boolean isAuthor(String email) { + return this.author.email().equals(email); + } +} diff --git a/domain/src/main/java/blisgo/domain/community/Reply.java b/domain/src/main/java/blisgo/domain/community/Reply.java new file mode 100644 index 0000000..de76ebd --- /dev/null +++ b/domain/src/main/java/blisgo/domain/community/Reply.java @@ -0,0 +1,25 @@ +package blisgo.domain.community; + +import blisgo.domain.common.Author; +import blisgo.domain.community.vo.PostId; +import blisgo.domain.community.vo.ReplyId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Getter +@SuperBuilder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Reply { + private ReplyId replyId; + private PostId postId; + private Author author; + private String content; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} diff --git a/domain/src/main/java/blisgo/domain/community/vo/PostId.java b/domain/src/main/java/blisgo/domain/community/vo/PostId.java new file mode 100644 index 0000000..72a8d48 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/community/vo/PostId.java @@ -0,0 +1,13 @@ +package blisgo.domain.community.vo; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostId { + private Long id; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/community/vo/ReplyId.java b/domain/src/main/java/blisgo/domain/community/vo/ReplyId.java new file mode 100644 index 0000000..c737842 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/community/vo/ReplyId.java @@ -0,0 +1,13 @@ +package blisgo.domain.community.vo; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ReplyId { + private Long id; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/dictionary/Dogam.java b/domain/src/main/java/blisgo/domain/dictionary/Dogam.java new file mode 100644 index 0000000..ca6b2c8 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/Dogam.java @@ -0,0 +1,31 @@ +package blisgo.domain.dictionary; + +import blisgo.domain.dictionary.vo.DogamId; +import blisgo.domain.dictionary.vo.WasteId; +import blisgo.domain.member.vo.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Getter +@SuperBuilder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Dogam { + private DogamId dogamId; + private Waste waste; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; + + public static Dogam create(MemberId memberId, WasteId wasteId) { + return Dogam.builder() + .dogamId(DogamId.of(memberId, wasteId)) + .waste(Waste.builder().wasteId(wasteId).build()) + .createdDate(LocalDateTime.now()) + .build(); + } +} diff --git a/domain/src/main/java/blisgo/domain/dictionary/Waste.java b/domain/src/main/java/blisgo/domain/dictionary/Waste.java new file mode 100644 index 0000000..e33d18a --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/Waste.java @@ -0,0 +1,30 @@ +package blisgo.domain.dictionary; + +import blisgo.domain.common.Picture; +import blisgo.domain.dictionary.vo.Category; +import blisgo.domain.dictionary.vo.WasteId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@SuperBuilder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Waste { + private WasteId wasteId; + private String name; + private String type; + private Picture picture; + private String treatment; + private Short popularity; + private Long views; + private List categories; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/dictionary/vo/Category.java b/domain/src/main/java/blisgo/domain/dictionary/vo/Category.java new file mode 100644 index 0000000..6cdc558 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/vo/Category.java @@ -0,0 +1,29 @@ +package blisgo.domain.dictionary.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Category { + IRON("고철"), + METAL("금속캔"), + BULKY("대형"), + STYROFOAM("발포합성"), + NON_FLAMMABLE("불연성-종량제"), + VINYL("비닐"), + GLASS("유리병"), + PROG("음식물"), + CLOTHES("의류"), + ONLY_BOX("전용함"), + PAPER("종이"), + CARTON("종이팩"), + HOME_APPLIANCES("가전제품"), + PLASTIC("플라스틱"), + PAY_AS_YOU_GO_BAG("종량제봉투"), + SEPARATION_BY_MATERIAL("재질별분리"), + CAUTION("주의"), + PRO_FACILITY("전문시설"); + + final String tag; +} diff --git a/domain/src/main/java/blisgo/domain/dictionary/vo/DogamId.java b/domain/src/main/java/blisgo/domain/dictionary/vo/DogamId.java new file mode 100644 index 0000000..3fd170b --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/vo/DogamId.java @@ -0,0 +1,13 @@ +package blisgo.domain.dictionary.vo; + +import blisgo.domain.member.vo.MemberId; +import lombok.*; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder(toBuilder = true) +public class DogamId { + private MemberId memberId; + private WasteId wasteId; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/dictionary/vo/Guide.java b/domain/src/main/java/blisgo/domain/dictionary/vo/Guide.java new file mode 100644 index 0000000..bf05cfc --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/vo/Guide.java @@ -0,0 +1,16 @@ +package blisgo.domain.dictionary.vo; + +import blisgo.domain.common.Picture; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Guide { + private Category category; + private String content; + private Picture picture; +} diff --git a/domain/src/main/java/blisgo/domain/dictionary/vo/WasteId.java b/domain/src/main/java/blisgo/domain/dictionary/vo/WasteId.java new file mode 100644 index 0000000..edf5080 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/dictionary/vo/WasteId.java @@ -0,0 +1,13 @@ +package blisgo.domain.dictionary.vo; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class WasteId { + private Long id; +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/member/Member.java b/domain/src/main/java/blisgo/domain/member/Member.java new file mode 100644 index 0000000..f14c868 --- /dev/null +++ b/domain/src/main/java/blisgo/domain/member/Member.java @@ -0,0 +1,34 @@ +package blisgo.domain.member; + +import blisgo.domain.common.Picture; +import blisgo.domain.member.vo.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Getter +@SuperBuilder(toBuilder = true) +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Member { + private MemberId memberId; + private String name; + private String email; + private Picture picture; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; + + public static Member create(String name, String email, String picture) { + return Member.builder() + .memberId(MemberId.of(email)) + .name(name) + .email(email) + .picture(Picture.of(picture)) + .build(); + } + +} \ No newline at end of file diff --git a/domain/src/main/java/blisgo/domain/member/vo/MemberId.java b/domain/src/main/java/blisgo/domain/member/vo/MemberId.java new file mode 100644 index 0000000..dc7994a --- /dev/null +++ b/domain/src/main/java/blisgo/domain/member/vo/MemberId.java @@ -0,0 +1,18 @@ +package blisgo.domain.member.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor +public class MemberId { + private UUID id; + + public static MemberId of(String email) { + return new MemberId(UUID.nameUUIDFromBytes(email.getBytes())); + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d64cd4917707c1f8861d8cb53dd15194d4248596 GIT binary patch literal 43462 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a80b22c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1aa94a4 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/infrastructure/external/build.gradle b/infrastructure/external/build.gradle new file mode 100644 index 0000000..2ab9e26 --- /dev/null +++ b/infrastructure/external/build.gradle @@ -0,0 +1,13 @@ +bootJar.enabled = false +jar.enabled = true + +description = 'redis 를 사용하여 세션관리' + +dependencies { + implementation project(':usecase') + implementation project(':infrastructure:internal') + + implementation 'org.springframework.session:spring-session-data-redis' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + developmentOnly 'org.springframework.boot:spring-boot-docker-compose' +} \ No newline at end of file diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/ExternalRoot.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/ExternalRoot.java new file mode 100644 index 0000000..40e9fa4 --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/ExternalRoot.java @@ -0,0 +1,7 @@ +package blisgo.infrastructure.external; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan(basePackageClasses = ExternalRoot.class) +public interface ExternalRoot { +} diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/handler/PostViewedEventHandler.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/handler/PostViewedEventHandler.java new file mode 100644 index 0000000..764159a --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/handler/PostViewedEventHandler.java @@ -0,0 +1,23 @@ +package blisgo.infrastructure.external.handler; + +import blisgo.infrastructure.external.redis.ViewCountCache; +import blisgo.usecase.event.PostViewedEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Description; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +@Description("게시물 조회 이벤트 핸들러") +public class PostViewedEventHandler { + + private final ViewCountCache viewCountCache; + + @EventListener + public void handlePostViewedEvent(PostViewedEvent event) { + viewCountCache.increaseViewCount(event.postId()); + } +} \ No newline at end of file diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigDev.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigDev.java new file mode 100644 index 0000000..c9b929e --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigDev.java @@ -0,0 +1,67 @@ +package blisgo.infrastructure.external.redis; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; +import org.springframework.context.annotation.Profile; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +import java.time.Duration; + +@Profile("dev") +@Configuration +@EnableRedisRepositories +@EnableRedisHttpSession +@EnableCaching +public class RedisConfigDev { + + @Value("${spring.data.redis.host}") + private String host; + + @Value("${spring.data.redis.port}") + private int port; + + @Bean + @Profile("dev") + @Description("운영 환경용 redis 접속 정보") + public RedisConnectionFactory redisConnectionFactoryDev() { + return new LettuceConnectionFactory(host, port); + } + + @Bean + @Description("redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new StringRedisSerializer()); + + return redisTemplate; + } + + @Bean + @Description("cacheManager") + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer 변경 + .entryTtl(Duration.ofMinutes(3L)); // 캐시 수명 30분 + + return RedisCacheManager.RedisCacheManagerBuilder + .fromConnectionFactory(redisConnectionFactory) + .cacheDefaults(redisCacheConfiguration) + .build(); + } +} diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigProd.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigProd.java new file mode 100644 index 0000000..30db0da --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/RedisConfigProd.java @@ -0,0 +1,80 @@ +package blisgo.infrastructure.external.redis; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; +import org.springframework.context.annotation.Profile; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +import java.time.Duration; + +@Profile("prod") +@Configuration +@EnableRedisRepositories +@EnableRedisHttpSession +@EnableCaching +public class RedisConfigProd { + + @Value("${spring.data.redis.host}") + private String host; + + @Value("${spring.data.redis.port}") + private int port; + + @Value("${spring.data.redis.username}") + private String username; + + @Value("${spring.data.redis.password}") + private String password; + + @Bean + @Profile("prod") + @Description("운영 환경용 redis 접속 정보") + public RedisConnectionFactory redisConnectionFactoryProd() { + RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); + redisStandaloneConfiguration.setHostName(host); + redisStandaloneConfiguration.setPort(port); + redisStandaloneConfiguration.setUsername(username); + redisStandaloneConfiguration.setPassword(password); + + return new LettuceConnectionFactory(redisStandaloneConfiguration); + } + + @Bean + @Description("redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new StringRedisSerializer()); + + return redisTemplate; + } + + @Bean + @Description("cacheManager") + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer 변경 + .entryTtl(Duration.ofMinutes(3L)); // 캐시 수명 30분 + + return RedisCacheManager.RedisCacheManagerBuilder + .fromConnectionFactory(redisConnectionFactory) + .cacheDefaults(redisCacheConfiguration) + .build(); + } +} diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/SchedulerConfig.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/SchedulerConfig.java new file mode 100644 index 0000000..89788a4 --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/SchedulerConfig.java @@ -0,0 +1,26 @@ +package blisgo.infrastructure.external.redis; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +@EnableScheduling +@Configuration +@Description("스케줄러 설정") +public class SchedulerConfig implements SchedulingConfigurer { + private static final int POOL_SIZE = 2; + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + + threadPoolTaskScheduler.setPoolSize(POOL_SIZE); + threadPoolTaskScheduler.setThreadNamePrefix("scheduled--pool-"); + threadPoolTaskScheduler.initialize(); + + scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); + } +} diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/ViewCountCache.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/ViewCountCache.java new file mode 100644 index 0000000..10a557f --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/redis/ViewCountCache.java @@ -0,0 +1,32 @@ +package blisgo.infrastructure.external.redis; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Description; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Description("게시물 조회수 캐시") +public class ViewCountCache { + private final RedisTemplate redisTemplate; + + public void increaseViewCount(Long postId) { + ValueOperations ops = redisTemplate.opsForValue(); + ops.increment(getKey(postId), 1); + } + + public long getViewCount(Long postId) { + var value = redisTemplate.opsForValue().get(getKey(postId)); + return value == null ? 0 : Long.parseLong(value.toString()); + } + + private String getKey(Long postId) { + return "post:" + postId + ":views"; + } + + public void remove(Long postId) { + redisTemplate.delete(getKey(postId)); + } +} \ No newline at end of file diff --git a/infrastructure/external/src/main/java/blisgo/infrastructure/external/scheduler/ViewCountScheduler.java b/infrastructure/external/src/main/java/blisgo/infrastructure/external/scheduler/ViewCountScheduler.java new file mode 100644 index 0000000..c489ce1 --- /dev/null +++ b/infrastructure/external/src/main/java/blisgo/infrastructure/external/scheduler/ViewCountScheduler.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.external.scheduler; + +import blisgo.infrastructure.external.redis.ViewCountCache; +import blisgo.infrastructure.internal.persistence.community.PostMySQLAdapter; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Description; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +@Description("캐시에 저장된 조회수를 DB에 업데이트하는 스케줄러") +public class ViewCountScheduler { + private final ViewCountCache viewCountCache; + private final PostMySQLAdapter postMySQLAdapter; + + @Scheduled(fixedRate = 60000) + public void updateViewCounts() { + List postIds = postMySQLAdapter.findPostIds(); + + for (Long postId : postIds) { + long viewCount = viewCountCache.getViewCount(postId); + if (viewCount > 0 && (postMySQLAdapter.updateViewCount(postId, viewCount))) { + viewCountCache.remove(postId); + } + } + } +} \ No newline at end of file diff --git a/infrastructure/internal/build.gradle b/infrastructure/internal/build.gradle new file mode 100644 index 0000000..dbb1ad9 --- /dev/null +++ b/infrastructure/internal/build.gradle @@ -0,0 +1,90 @@ +plugins { + id 'org.springdoc.openapi-gradle-plugin' version '+' + id 'io.swagger.swaggerhub' version '+' +} + +bootJar.enabled = false +jar.enabled = true + +dependencies { + implementation project(':domain') + implementation project(':usecase') + + // jpa + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + + // hibernate & jakarta validator + implementation 'org.springframework.boot:spring-boot-starter-validation' + + // querydsl + implementation 'com.querydsl:querydsl-jpa:5.+:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.+:jakarta' + + // mysql + runtimeOnly 'com.mysql:mysql-connector-j' + + // jakarta + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + + // auth0 security + implementation 'com.okta.spring:okta-spring-boot-starter:+' + + //spring security + implementation 'org.springframework.boot:spring-boot-starter-security' + + // 게시판 json 글 저장용 + implementation 'com.fasterxml.jackson.core:jackson-databind:+' + + // documentation + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:+' + + // htmx + thymeleaf support + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:+' + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:+' + implementation 'org.thymeleaf.extras:thymeleaf-extras-java8time:+' + + implementation 'org.springframework.boot:spring-boot-starter-web' + + // flyway + implementation 'org.flywaydb:flyway-core:+' + implementation 'org.flywaydb:flyway-mysql:+' +} + +def querydslDir = "${project.projectDir}/build/generated/querydsl" + +sourceSets { + main.java.srcDirs += [querydslDir] +} + +tasks.withType(JavaCompile).configureEach { + options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) +} + +clean.doLast { + file(querydslDir).deleteDir() +} + +openApi { + apiDocsUrl.set('http://localhost:8080/v3/api-docs.yaml') + outputDir.set(file("${project.rootDir}/build/docs")) + outputFileName.set('swagger.yaml') + waitTimeInSeconds.set(10) + customBootRun { + args.set(['--spring.profiles.active=dev']) + } +} + +import java.text.SimpleDateFormat + +swaggerhubUpload { + def dateVersion = new SimpleDateFormat('yyyy-MM-dd').format(new Date()) + + api 'blisgo' + owner 'okjaeook' + version dateVersion + format 'yaml' + inputFile "${project.rootDir}/build/docs/swagger.yaml" + token System.getenv('SWAGGERHUB_API_KEY') +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/InternalRoot.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/InternalRoot.java new file mode 100644 index 0000000..5cfc616 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/InternalRoot.java @@ -0,0 +1,7 @@ +package blisgo.infrastructure.internal; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan(basePackageClasses = InternalRoot.class) +public interface InternalRoot { +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/ContentConverter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/ContentConverter.java new file mode 100644 index 0000000..29cc850 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/ContentConverter.java @@ -0,0 +1,80 @@ +package blisgo.infrastructure.internal.persistence.base; + +import blisgo.infrastructure.internal.persistence.common.JpaPicture; +import blisgo.infrastructure.internal.persistence.common.JpaContent; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter(autoApply = true) +public class ContentConverter implements AttributeConverter { + private final ObjectMapper objectMapper = new ObjectMapper(); + + private static final String TYPE = "type"; + private static final String DATA = "data"; + private static final String TEXT = "text"; + private static final String BLOCKS = "blocks"; + private static final String URL = "url"; + private static final String IMAGE = "image"; + private static final String PARAGRAPH = "paragraph"; + + @Override + public String convertToDatabaseColumn(JpaContent content) { + return content.text(); + } + + @Override + public JpaContent convertToEntityAttribute(String dbData) { + JsonNode json; + String thumbnail, preview; + + dbData = dbData == null ? "" : dbData; + + try { + json = objectMapper.readTree(dbData); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + thumbnail = parseFirstImageUrl(json); + preview = parseFirstParagraph(json); + + return JpaContent.of(dbData, JpaPicture.of(thumbnail), preview); + } + + private String parseFirstParagraph(JsonNode json) { + JsonNode blocksNode = json.get(BLOCKS); + + if (blocksNode == null) { + return null; + } + + for (JsonNode blockNode : blocksNode) { + if (PARAGRAPH.equals(blockNode.get(TYPE).asText())) { + return blockNode.get(DATA).get(TEXT).asText(); + } + } + + return null; + } + + private String parseFirstImageUrl(JsonNode json) { + JsonNode blocksNode = json.get(BLOCKS); + + if (blocksNode == null) { + return null; + } + + for (JsonNode blockNode : blocksNode) { + if (IMAGE.equals(blockNode.get(TYPE).asText())) { + return blockNode.get(DATA).get(URL).asText(); + } + } + + return null; + } + + +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/JpaConfig.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/JpaConfig.java new file mode 100644 index 0000000..af5ff1b --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/JpaConfig.java @@ -0,0 +1,36 @@ +package blisgo.infrastructure.internal.persistence.base; + +import blisgo.infrastructure.internal.InternalRoot; +import blisgo.infrastructure.internal.persistence.common.JpaAuthor; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; +import org.springframework.data.domain.AuditorAware; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@Configuration +@EnableJpaAuditing +@EnableJpaRepositories(basePackageClasses = InternalRoot.class) +@EntityScan(basePackageClasses = InternalRoot.class) +public class JpaConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + @Description("QueryDSL JPA 설정") + public JPAQueryFactory init() { + return new JPAQueryFactory(entityManager); + } + + @Bean + @Description("도메인 중 회원 정보 데이터가 필요한 경우 OIDC 에서 받아온 회원 정보를 사용하도록 함") + public AuditorAware auditorProvider() { + return new OidcAuditorAware(); + } + +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/MapperConfig.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/MapperConfig.java new file mode 100644 index 0000000..06db0ad --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/MapperConfig.java @@ -0,0 +1,24 @@ +package blisgo.infrastructure.internal.persistence.base; + +import org.modelmapper.ModelMapper; +import org.modelmapper.convention.MatchingStrategies; +import org.modelmapper.record.RecordModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; + +@Configuration +public class MapperConfig { + @Bean + @Description("ModelMapper 설정") + public ModelMapper modelMapper() { + ModelMapper modelMapper = new ModelMapper(); + modelMapper.registerModule(new RecordModule()); + modelMapper.getConfiguration() + .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) + .setFieldMatchingEnabled(true) + .setMatchingStrategy(MatchingStrategies.LOOSE); + + return modelMapper; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/NoOffsetSliceHelper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/NoOffsetSliceHelper.java new file mode 100644 index 0000000..d439fd6 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/NoOffsetSliceHelper.java @@ -0,0 +1,17 @@ +package blisgo.infrastructure.internal.persistence.base; + +import lombok.experimental.UtilityClass; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +@UtilityClass +public class NoOffsetSliceHelper { + public static boolean checkLastPage(List results, Pageable pageable) { + if (results.size() > pageable.getPageSize()) { + results.remove(pageable.getPageSize()); + return true; + } + return false; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/OidcAuditorAware.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/OidcAuditorAware.java new file mode 100644 index 0000000..3fb61f1 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/OidcAuditorAware.java @@ -0,0 +1,39 @@ +package blisgo.infrastructure.internal.persistence.base; + + +import blisgo.infrastructure.internal.persistence.common.JpaAuthor; +import blisgo.infrastructure.internal.persistence.common.JpaPicture; +import lombok.NonNull; +import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.oidc.OidcUserInfo; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; + +import java.util.Optional; + +public class OidcAuditorAware implements AuditorAware { + + @NonNull + @Override + public Optional getCurrentAuditor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + return Optional.of(JpaAuthor.of( + "admin@blisgo.com", + "관리자", + JpaPicture.of("https://res.cloudinary.com/blisgo/image/upload/f_auto,q_auto/v1/manifest/admin") + )); + } + + OidcUser oidcUser = (OidcUser) authentication.getPrincipal(); + OidcUserInfo oidcUserInfo = oidcUser.getUserInfo(); + + return Optional.of(JpaAuthor.of( + oidcUserInfo.getEmail(), + oidcUserInfo.getFullName(), + JpaPicture.of(oidcUserInfo.getPicture()) + )); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/PersistenceMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/PersistenceMapper.java new file mode 100644 index 0000000..cd390c3 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/base/PersistenceMapper.java @@ -0,0 +1,24 @@ +package blisgo.infrastructure.internal.persistence.base; + +import java.util.List; + +public interface PersistenceMapper { + + E toEntity(D domain); + + D toDomain(E entity); + + default List toDomains(List entities) { + return entities.stream().map(this::toDomain).toList(); + } + + default List toEntities(List domains) { + return domains.stream().map(this::toEntity).toList(); + } + + V toDTO(D domain); + + default List toDTOs(List domains) { + return domains.stream().map(this::toDTO).toList(); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseEntity.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseEntity.java new file mode 100644 index 0000000..5f0d28d --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseEntity.java @@ -0,0 +1,25 @@ +package blisgo.infrastructure.internal.persistence.common; + +import jakarta.persistence.Embedded; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(toBuilder = true) +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity extends BaseTimeEntity { + + @Embedded + @LastModifiedBy + protected JpaAuthor author; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseTimeEntity.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseTimeEntity.java new file mode 100644 index 0000000..1cef506 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/BaseTimeEntity.java @@ -0,0 +1,34 @@ +package blisgo.infrastructure.internal.persistence.common; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.Comment; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@SuperBuilder(toBuilder = true) +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseTimeEntity { + @CreatedDate + @Column(updatable = false, nullable = false, columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP") + @Comment("생성 시각") + protected LocalDateTime createdDate; + + @LastModifiedDate + @Column(nullable = false, columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP") + @Comment("수정 시각") + protected LocalDateTime modifiedDate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaAuthor.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaAuthor.java new file mode 100644 index 0000000..9b0ca6b --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaAuthor.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.common; + +import jakarta.persistence.AttributeOverride; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Embedded; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; + +@Getter +@Embeddable +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JpaAuthor { + + @Column(name = "author_email") + @Comment("회원 이메일(FK)") + private String email; + + @Column(name = "author_name") + @Comment("작성자") + private String name; + + @Embedded + @AttributeOverride(name = "url", column = @Column(name = "author_picture")) + private JpaPicture picture; +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaContent.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaContent.java new file mode 100644 index 0000000..a39ce96 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaContent.java @@ -0,0 +1,15 @@ +package blisgo.infrastructure.internal.persistence.common; + +import lombok.*; + +@Builder +@Getter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JpaContent { + private String text; + + private JpaPicture thumbnail; + + private String preview; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaPicture.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaPicture.java new file mode 100644 index 0000000..bdbccae --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/common/JpaPicture.java @@ -0,0 +1,19 @@ +package blisgo.infrastructure.internal.persistence.common; + +import jakarta.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.validator.constraints.URL; + +@Getter +@Embeddable +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JpaPicture { + @URL(protocol = "https") + @Comment("이미지") + private String url; +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/PostMySQLAdapter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/PostMySQLAdapter.java new file mode 100644 index 0000000..5269741 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/PostMySQLAdapter.java @@ -0,0 +1,86 @@ +package blisgo.infrastructure.internal.persistence.community; + +import blisgo.domain.community.Post; +import blisgo.infrastructure.internal.persistence.community.model.JpaPost; +import blisgo.infrastructure.internal.persistence.community.mapper.PostMapper; +import blisgo.infrastructure.internal.persistence.community.repository.PostCustomRepository; +import blisgo.infrastructure.internal.persistence.community.repository.PostJpaRepository; +import blisgo.usecase.port.PostOutputPort; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class PostMySQLAdapter implements PostOutputPort { + private final PostJpaRepository jpaRepository; + private final PostCustomRepository customRepository; + private final PostMapper mapper; + + @Override + @Transactional + public boolean create(Post domain) { + JpaPost jpaPost = mapper.toEntity(domain); + + jpaRepository.save(jpaPost); + return true; + } + + @Override + public Post read(Long postId) { + return jpaRepository.findById(postId) + .map(mapper::toDomain) + .orElse(null); + } + + @Override + public Slice read(Map columns, Pageable pageable) { + Long lastPostId = (Long) columns.get("lastPostId"); + + return customRepository.find(pageable, lastPostId) + .map(mapper::toDomain); + } + + @Override + @Transactional + public boolean update(Post domain) { + if (domain.postId().id() == null) { + jpaRepository.save(mapper.toEntity(domain)); + return true; + } + + jpaRepository.findById(domain.postId().id()).ifPresentOrElse( + existingPost -> existingPost.updateInfo(mapper.toEntity(domain)), + () -> jpaRepository.save(mapper.toEntity(domain)) + ); + + return true; + } + + @Override + @Transactional + public boolean delete(Long identifier) { + return jpaRepository.deleteByPostId(identifier) > 0; + } + + @Transactional + public boolean updateLike(Long postId, Boolean isLike) { + return customRepository.updateLike(postId, isLike); + } + + @Override + public List findPostIds() { + return customRepository.findAllPostIds(); + } + + @Transactional + public boolean updateViewCount(Long postId, Long views) { + return customRepository.updateViewCount(postId, views); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/ReplyMySQLAdapter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/ReplyMySQLAdapter.java new file mode 100644 index 0000000..5f600b6 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/ReplyMySQLAdapter.java @@ -0,0 +1,50 @@ +package blisgo.infrastructure.internal.persistence.community; + +import blisgo.domain.community.Reply; +import blisgo.infrastructure.internal.persistence.community.mapper.ReplyMapper; +import blisgo.infrastructure.internal.persistence.community.repository.ReplyCustomRepository; +import blisgo.infrastructure.internal.persistence.community.repository.ReplyJpaRepository; +import blisgo.usecase.port.ReplyOutputPort; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Transactional +@RequiredArgsConstructor +public class ReplyMySQLAdapter implements ReplyOutputPort { + private final ReplyJpaRepository jpaRepository; + private final ReplyCustomRepository customRepository; + private final ReplyMapper mapper; + + @Override + public boolean delete(Long identifier) { + return jpaRepository.deleteByReplyId(identifier) > 0; + } + + @Override + public boolean create(Reply domain) { + jpaRepository.save(mapper.toEntity(domain)); + return true; + } + + @Override + public Slice read(Long postId, Pageable pageable, Long lastReplyId) { + return customRepository.find(pageable, postId, lastReplyId) + .map(mapper::toDomain); + } + + @Override + public boolean update(Reply domain) { + var jpaReply = mapper.toEntity(domain); + + jpaRepository.findById(jpaReply.replyId()).ifPresentOrElse( + existingReply -> existingReply.updateInfo(jpaReply), + () -> jpaRepository.save(jpaReply) + ); + + return true; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/PostMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/PostMapper.java new file mode 100644 index 0000000..10538ea --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/PostMapper.java @@ -0,0 +1,34 @@ +package blisgo.infrastructure.internal.persistence.community.mapper; + +import blisgo.domain.community.Post; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.community.model.JpaPost; +import blisgo.infrastructure.internal.ui.response.PostDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class PostMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaPost toEntity(Post domain) { + return mapper.map(domain, JpaPost.class); + } + + @Override + public Post toDomain(JpaPost entity) { + return mapper.map(entity, Post.class); + } + + @Override + public PostDTO toDTO(Post domain) { + return mapper.map(domain, PostDTO.class); + } + + public Post toDomain(PostDTO dto) { + return mapper.map(dto, Post.class); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/ReplyMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/ReplyMapper.java new file mode 100644 index 0000000..2b1fae8 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/mapper/ReplyMapper.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.community.mapper; + +import blisgo.domain.community.Reply; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.community.model.JpaReply; +import blisgo.infrastructure.internal.ui.response.ReplyDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class ReplyMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaReply toEntity(Reply domain) { + return mapper.map(domain, JpaReply.class); + } + + @Override + public Reply toDomain(JpaReply entity) { + return mapper.map(entity, Reply.class); + } + + @Override + public ReplyDTO toDTO(Reply domain) { + return mapper.map(domain, ReplyDTO.class); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaPost.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaPost.java new file mode 100644 index 0000000..f913784 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaPost.java @@ -0,0 +1,54 @@ +package blisgo.infrastructure.internal.persistence.community.model; + +import blisgo.infrastructure.internal.persistence.common.BaseEntity; +import blisgo.infrastructure.internal.persistence.common.JpaContent; +import blisgo.infrastructure.internal.persistence.base.ContentConverter; +import jakarta.persistence.Table; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.*; + +@DynamicInsert +@DynamicUpdate +@Getter +@SuperBuilder(toBuilder = true) +@NoArgsConstructor +@Entity +@Table(name = "post") +@Comment("게시글") +public class JpaPost extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Comment("게시글 postId") + private Long postId; + + @Comment("제목") + private String title; + + @Comment("내용") + @Column(name = "content", columnDefinition = "JSON") + @Convert(converter = ContentConverter.class) + private JpaContent content; + + @ColumnDefault("0") + @Comment("조회수") + private long views; + + @ColumnDefault("0") + @Comment("좋아요") + private long likes; + + @Formula("(SELECT count(*) FROM reply r WHERE r.post_id = post_id)") + private long replies; + + @Version + @Comment("좋아요 동시성 해결을 위한 낙관적 락") + private Long version; + + public void updateInfo(JpaPost entity) { + this.title = entity.title; + this.content = entity.content; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaReply.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaReply.java new file mode 100644 index 0000000..c07c346 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/model/JpaReply.java @@ -0,0 +1,36 @@ +package blisgo.infrastructure.internal.persistence.community.model; + +import blisgo.infrastructure.internal.persistence.common.BaseEntity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +@DynamicInsert +@DynamicUpdate +@Getter +@SuperBuilder(toBuilder = true) +@NoArgsConstructor +@Entity +@Table(name = "reply") +@Comment("댓글") +public class JpaReply extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Comment("댓글 Id") + private Long replyId; + + @Comment("게시글 Id") + private Long postId; + + @Lob + @Comment("내용") + private String content; + + public void updateInfo(JpaReply jpaReply) { + this.content = jpaReply.content; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostCustomRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostCustomRepository.java new file mode 100644 index 0000000..5c1bdf8 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostCustomRepository.java @@ -0,0 +1,75 @@ +package blisgo.infrastructure.internal.persistence.community.repository; + +import blisgo.infrastructure.internal.persistence.base.NoOffsetSliceHelper; +import blisgo.infrastructure.internal.persistence.community.model.JpaPost; +import blisgo.infrastructure.internal.persistence.community.model.QJpaPost; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class PostCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + private final JdbcTemplate jdbcTemplate; + + public Slice find(Pageable pageable, long lastPostId) { + var qJpaPost = QJpaPost.jpaPost; + + var fields = Projections.fields(JpaPost.class, + qJpaPost.postId, + qJpaPost.title, + qJpaPost.content, + qJpaPost.author, + qJpaPost.views, + qJpaPost.likes, + qJpaPost.replies, + qJpaPost.modifiedDate + ); + + var results = jpaQueryFactory.select(fields) + .from(qJpaPost) + .where(qJpaPost.postId.lt(lastPostId)) + .orderBy(qJpaPost.postId.desc()) + .limit(pageable.getPageSize() + 1L) + .fetch(); + + boolean hasNext = NoOffsetSliceHelper.checkLastPage(results, pageable); + + return new SliceImpl<>(results, pageable, hasNext); + } + + public List findAllPostIds() { + var qJpaPost = QJpaPost.jpaPost; + + return jpaQueryFactory.select(qJpaPost.postId) + .from(qJpaPost) + .fetch(); + } + + public boolean updateViewCount(Long postId, Long views) { + var qJpaPost = QJpaPost.jpaPost; + + return jpaQueryFactory.update(qJpaPost) + .set(qJpaPost.views, views) + .where(qJpaPost.postId.eq(postId)) + .execute() > 0; + } + + public boolean updateLike(Long postId, Boolean isLike) { + var qJpaPost = QJpaPost.jpaPost; + + return jpaQueryFactory.update(qJpaPost) + .set(qJpaPost.likes, qJpaPost.likes.add(Boolean.TRUE.equals(isLike) ? 1 : -1)) + .where(qJpaPost.postId.eq(postId)) + .execute() > 0; + } +} + diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostJpaRepository.java new file mode 100644 index 0000000..2f5bfc9 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/PostJpaRepository.java @@ -0,0 +1,8 @@ +package blisgo.infrastructure.internal.persistence.community.repository; + +import blisgo.infrastructure.internal.persistence.community.model.JpaPost; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostJpaRepository extends JpaRepository { + long deleteByPostId(Long identifier); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyCustomRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyCustomRepository.java new file mode 100644 index 0000000..f991c3c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyCustomRepository.java @@ -0,0 +1,34 @@ +package blisgo.infrastructure.internal.persistence.community.repository; + +import blisgo.infrastructure.internal.persistence.base.NoOffsetSliceHelper; +import blisgo.infrastructure.internal.persistence.community.model.JpaReply; +import blisgo.infrastructure.internal.persistence.community.model.QJpaReply; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class ReplyCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + private final JdbcTemplate jdbcTemplate; + + public Slice find(Pageable pageable, Long postId, long lastReplyId) { + var qJpaReply = QJpaReply.jpaReply; + + + var results = jpaQueryFactory.selectFrom(qJpaReply) + .where(qJpaReply.postId.eq(postId)) + .where(qJpaReply.replyId.gt(lastReplyId)) + .limit(pageable.getPageSize() + 1L) + .fetch(); + + boolean hasNext = NoOffsetSliceHelper.checkLastPage(results, pageable); + + return new SliceImpl<>(results, pageable, hasNext); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyJpaRepository.java new file mode 100644 index 0000000..0116798 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/community/repository/ReplyJpaRepository.java @@ -0,0 +1,8 @@ +package blisgo.infrastructure.internal.persistence.community.repository; + +import blisgo.infrastructure.internal.persistence.community.model.JpaReply; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReplyJpaRepository extends JpaRepository { + long deleteByReplyId(Long identifier); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/DogamMySQLAdapter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/DogamMySQLAdapter.java new file mode 100644 index 0000000..d418917 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/DogamMySQLAdapter.java @@ -0,0 +1,41 @@ +package blisgo.infrastructure.internal.persistence.dictionary; + +import blisgo.domain.dictionary.Dogam; +import blisgo.domain.dictionary.vo.DogamId; +import blisgo.infrastructure.internal.persistence.dictionary.mapper.DogamMapper; +import blisgo.infrastructure.internal.persistence.dictionary.mapper.WasteMapper; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaDogamId; +import blisgo.infrastructure.internal.persistence.dictionary.repository.DogamCustomRepository; +import blisgo.infrastructure.internal.persistence.dictionary.repository.DogamJpaRepository; +import blisgo.usecase.port.DogamOutputPort; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class DogamMySQLAdapter implements DogamOutputPort { + private final DogamJpaRepository jpaRepository; + private final DogamCustomRepository customRepository; + private final DogamMapper mapper; + private final WasteMapper wasteMapper; + + @Override + @Transactional + public boolean delete(DogamId identifier) { + JpaDogamId jpaDogamId = JpaDogamId.of( + identifier.memberId().id(), + identifier.wasteId().id() + ); + + return jpaRepository.deleteByDogamId(jpaDogamId); + } + + @Override + @Transactional + public boolean create(Dogam domain) { + jpaRepository.save(mapper.toEntity(domain)); + return true; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/WasteMySQLAdapter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/WasteMySQLAdapter.java new file mode 100644 index 0000000..992706d --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/WasteMySQLAdapter.java @@ -0,0 +1,60 @@ +package blisgo.infrastructure.internal.persistence.dictionary; + +import blisgo.domain.dictionary.Waste; +import blisgo.domain.dictionary.vo.Category; +import blisgo.domain.dictionary.vo.Guide; +import blisgo.infrastructure.internal.persistence.dictionary.mapper.GuideMapper; +import blisgo.infrastructure.internal.persistence.dictionary.mapper.WasteMapper; +import blisgo.infrastructure.internal.persistence.dictionary.repository.GuideJpaRepository; +import blisgo.infrastructure.internal.persistence.dictionary.repository.WasteCustomRepository; +import blisgo.infrastructure.internal.persistence.dictionary.repository.WasteJpaRepository; +import blisgo.usecase.port.WasteOutputPort; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class WasteMySQLAdapter implements WasteOutputPort { + private final WasteJpaRepository wasteJpaRepository; + private final WasteCustomRepository wasteCustomRepository; + private final GuideJpaRepository guideJpaRepository; + private final WasteMapper wasteMapper; + private final GuideMapper guideMapper; + + @Override + public Waste read(Long wasteId) { + return wasteJpaRepository.findFirstByWasteId(wasteId) + .map(wasteMapper::toDomain) + .orElseThrow(() -> new IllegalArgumentException("Waste not found")); + } + + @Override + public Slice read(Pageable pageable, Long lastWasteId) { + return wasteCustomRepository.findPartial(pageable, lastWasteId) + .map(wasteMapper::toDomain); + } + + @Override + public List readGuides(List categories) { + return guideMapper.toDomains(guideJpaRepository.findAllById(categories)); + } + + @Override + public Slice readWastesFromDogam(UUID memberId, Pageable pageable, LocalDateTime lastDogamCreatedDate) { + return wasteCustomRepository.findWastesByMemberIdFromDogam(memberId, pageable, lastDogamCreatedDate) + .map(wasteMapper::toDomain); + } + + @Override + public List readWastesRelated(List categories) { + return wasteMapper.toDomains(wasteCustomRepository.findWastesByCategories(categories)); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/DogamMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/DogamMapper.java new file mode 100644 index 0000000..4182e92 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/DogamMapper.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.dictionary.mapper; + +import blisgo.domain.dictionary.Dogam; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaDogam; +import blisgo.infrastructure.internal.ui.response.DogamDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DogamMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaDogam toEntity(Dogam domain) { + return mapper.map(domain, JpaDogam.class); + } + + @Override + public Dogam toDomain(JpaDogam entity) { + return mapper.map(entity, Dogam.class); + } + + @Override + public DogamDTO toDTO(Dogam domain) { + return mapper.map(domain, DogamDTO.class); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/GuideMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/GuideMapper.java new file mode 100644 index 0000000..854a78b --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/GuideMapper.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.dictionary.mapper; + +import blisgo.domain.dictionary.vo.Guide; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaGuide; +import blisgo.infrastructure.internal.ui.response.GuideDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class GuideMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaGuide toEntity(Guide domain) { + return mapper.map(domain, JpaGuide.class); + } + + @Override + public Guide toDomain(JpaGuide entity) { + return mapper.map(entity, Guide.class); + } + + @Override + public GuideDTO toDTO(Guide domain) { + return mapper.map(domain, GuideDTO.class); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/WasteMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/WasteMapper.java new file mode 100644 index 0000000..c468fca --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/mapper/WasteMapper.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.dictionary.mapper; + +import blisgo.domain.dictionary.Waste; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaWaste; +import blisgo.infrastructure.internal.ui.response.WasteDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class WasteMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaWaste toEntity(Waste domain) { + return mapper.map(domain, JpaWaste.class); + } + + @Override + public Waste toDomain(JpaWaste entity) { + return mapper.map(entity, Waste.class); + } + + @Override + public WasteDTO toDTO(Waste domain) { + return mapper.map(domain, WasteDTO.class); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogam.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogam.java new file mode 100644 index 0000000..619511e --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogam.java @@ -0,0 +1,25 @@ +package blisgo.infrastructure.internal.persistence.dictionary.model; + +import blisgo.infrastructure.internal.persistence.common.BaseTimeEntity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.Comment; + +@Getter +@SuperBuilder(toBuilder = true) +@NoArgsConstructor +@Entity +@Table(name = "dogam") +@Comment("도감") +public class JpaDogam extends BaseTimeEntity { + @EmbeddedId + private JpaDogamId dogamId; + + @MapsId("wasteId") + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "waste_id") + @Comment("폐기물 번호(PK, FK)") + private JpaWaste waste; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogamId.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogamId.java new file mode 100644 index 0000000..be9c2a2 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaDogamId.java @@ -0,0 +1,21 @@ +package blisgo.infrastructure.internal.persistence.dictionary.model; + +import jakarta.persistence.Embeddable; +import lombok.*; +import org.hibernate.annotations.Comment; + +import java.io.Serializable; +import java.util.UUID; + +@Getter +@Embeddable +@EqualsAndHashCode +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JpaDogamId implements Serializable { + @Comment("회원 memberId(FK)") + private UUID memberId; + + @Comment("폐기물 wasteId(FK)") + private Long wasteId; +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaGuide.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaGuide.java new file mode 100644 index 0000000..3d63deb --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaGuide.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.dictionary.model; + +import blisgo.domain.dictionary.vo.Category; +import blisgo.infrastructure.internal.persistence.common.JpaPicture; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; + +@Getter +@Entity +@Table(name = "guide") +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JpaGuide { + @Id + @Enumerated(EnumType.STRING) + @Comment("카테고리(PK)") + private Category category; + + @Lob + @Comment("폐기물 처리 안내") + private String content; + + @Embedded + @AttributeOverride(name = "url", column = @Column(name = "picture")) + private JpaPicture picture; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaWaste.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaWaste.java new file mode 100644 index 0000000..37dc01f --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/model/JpaWaste.java @@ -0,0 +1,61 @@ +package blisgo.infrastructure.internal.persistence.dictionary.model; + +import blisgo.domain.dictionary.vo.Category; +import blisgo.infrastructure.internal.persistence.common.BaseTimeEntity; +import blisgo.infrastructure.internal.persistence.common.JpaPicture; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.Comment; +import org.hibernate.validator.constraints.Range; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@SuperBuilder(toBuilder = true) +@NoArgsConstructor +@Entity +@Table(name = "waste") +@Comment("폐기물") +public class JpaWaste extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Comment("폐기물 Id") + private Long wasteId; + + @Column(length = 45) + @Comment("이름") + private String name; + + @Column(length = 45) + @Comment("유형") + private String type; + + @Embedded + @AttributeOverride(name = "url", column = @Column(name = "picture")) + private JpaPicture picture; + + @Lob + @Basic(fetch = FetchType.LAZY) + @Comment("처리 안내") + private String treatment; + + + @Range(min = 1, max = 10) + @ColumnDefault("5") + @Comment("인지도") + private Short popularity; + + @Comment("조회 수") + @ColumnDefault("0") + private Long views; + + @ElementCollection + @CollectionTable(name = "waste_categories", joinColumns = @JoinColumn(name = "waste_id")) + @Enumerated(EnumType.STRING) + @Comment("폐기 분류") + private final List categories = new ArrayList<>(); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamCustomRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamCustomRepository.java new file mode 100644 index 0000000..7fd0107 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamCustomRepository.java @@ -0,0 +1,13 @@ +package blisgo.infrastructure.internal.persistence.dictionary.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class DogamCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + private final JdbcTemplate jdbcTemplate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamJpaRepository.java new file mode 100644 index 0000000..fb5bc87 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/DogamJpaRepository.java @@ -0,0 +1,18 @@ +package blisgo.infrastructure.internal.persistence.dictionary.repository; + +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaDogam; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaDogamId; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface DogamJpaRepository extends JpaRepository { + Optional findFirstByDogamId(JpaDogamId dogamId); + + Slice findByDogamIdMemberId(UUID memberId, Pageable pageable); + + boolean deleteByDogamId(JpaDogamId dogamId); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/GuideJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/GuideJpaRepository.java new file mode 100644 index 0000000..879f53a --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/GuideJpaRepository.java @@ -0,0 +1,8 @@ +package blisgo.infrastructure.internal.persistence.dictionary.repository; + +import blisgo.domain.dictionary.vo.Category; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaGuide; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GuideJpaRepository extends JpaRepository { +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteCustomRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteCustomRepository.java new file mode 100644 index 0000000..3249c3c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteCustomRepository.java @@ -0,0 +1,79 @@ +package blisgo.infrastructure.internal.persistence.dictionary.repository; + +import blisgo.domain.dictionary.vo.Category; +import blisgo.infrastructure.internal.persistence.base.NoOffsetSliceHelper; +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaWaste; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +import static blisgo.infrastructure.internal.persistence.dictionary.model.QJpaDogam.jpaDogam; +import static blisgo.infrastructure.internal.persistence.dictionary.model.QJpaWaste.jpaWaste; + +@Repository +@RequiredArgsConstructor +public class WasteCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + private final JdbcTemplate jdbcTemplate; + + public Slice findWastesByMemberIdFromDogam(UUID memberId, Pageable pageable, LocalDateTime lastDogamCreatedDate) { + var results = jpaQueryFactory.selectFrom(jpaWaste) + .join(jpaDogam).on(jpaWaste.wasteId.eq(jpaDogam.dogamId.wasteId)) + .where(jpaDogam.dogamId.memberId.eq(memberId)) + .where(jpaWaste.createdDate.lt(lastDogamCreatedDate)) + .orderBy(jpaWaste.createdDate.desc()) + .limit(pageable.getPageSize() + 1L) + .fetch(); + + boolean hasNext = NoOffsetSliceHelper.checkLastPage(results, pageable); + + return new SliceImpl<>(results, pageable, hasNext); + } + + public Slice findPartial(Pageable pageable, long lastWasteId) { + var fields = Projections.fields( + JpaWaste.class, + jpaWaste.wasteId, + jpaWaste.name, + jpaWaste.picture + ); + + var results = jpaQueryFactory.select(fields) + .from(jpaWaste) + .where(jpaWaste.wasteId.gt(lastWasteId)) + .orderBy(jpaWaste.wasteId.asc()) + .limit(pageable.getPageSize() + 1L) + .fetch(); + + boolean hasNext = NoOffsetSliceHelper.checkLastPage(results, pageable); + + return new SliceImpl<>(results, pageable, hasNext); + } + + public List findWastesByCategories(List categories) { + var fields = Projections.fields( + JpaWaste.class, + jpaWaste.wasteId, + jpaWaste.name, + jpaWaste.picture + ); + + return jpaQueryFactory.select(fields) + .from(jpaWaste) + .where(jpaWaste.categories.any().in(categories)) + .orderBy(Expressions.numberTemplate(Integer.class, "function('rand')").asc()) + .limit(4) + .fetch(); + } + +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteJpaRepository.java new file mode 100644 index 0000000..14dcc8c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/dictionary/repository/WasteJpaRepository.java @@ -0,0 +1,10 @@ +package blisgo.infrastructure.internal.persistence.dictionary.repository; + +import blisgo.infrastructure.internal.persistence.dictionary.model.JpaWaste; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface WasteJpaRepository extends JpaRepository { + Optional findFirstByWasteId(Long wasteId); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/MemberMySQLAdapter.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/MemberMySQLAdapter.java new file mode 100644 index 0000000..c430deb --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/MemberMySQLAdapter.java @@ -0,0 +1,58 @@ +package blisgo.infrastructure.internal.persistence.member; + +import blisgo.domain.member.Member; +import blisgo.infrastructure.internal.persistence.member.mapper.MemberMapper; +import blisgo.infrastructure.internal.persistence.member.repository.MemberCustomRepository; +import blisgo.infrastructure.internal.persistence.member.repository.MemberJpaRepository; +import blisgo.usecase.port.MemberOutputPort; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +@Slf4j +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class MemberMySQLAdapter implements MemberOutputPort { + private final MemberJpaRepository jpaRepository; + private final MemberCustomRepository customRepository; + private final MemberMapper mapper; + + @Override + @Transactional + public boolean update(Member domain) { + var jpaMember = mapper.toEntity(domain); + + jpaRepository.findFirstByEmail(jpaMember.email()).ifPresentOrElse( + existingMember -> existingMember.updateInfo(jpaMember), + () -> jpaRepository.save(jpaMember) + ); + + return true; + } + + @Override + @Transactional + public boolean delete(String email) { + return jpaRepository.deleteByEmail(email); + } + + @Override + @Transactional + public boolean create(Member domain) { + jpaRepository.save(mapper.toEntity(domain)); + return true; + } + + @Override + public Member read(Map columns) { + String email = String.valueOf(columns.get("email")); + + return jpaRepository.findFirstByEmail(email) + .map(mapper::toDomain) + .orElseThrow(() -> new IllegalArgumentException("해당 회원이 존재하지 않습니다: " + email)); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/mapper/MemberMapper.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/mapper/MemberMapper.java new file mode 100644 index 0000000..2d23435 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/mapper/MemberMapper.java @@ -0,0 +1,30 @@ +package blisgo.infrastructure.internal.persistence.member.mapper; + +import blisgo.domain.member.Member; +import blisgo.infrastructure.internal.persistence.base.PersistenceMapper; +import blisgo.infrastructure.internal.persistence.member.model.JpaMember; +import blisgo.infrastructure.internal.ui.response.MemberDTO; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MemberMapper implements PersistenceMapper { + private final ModelMapper mapper; + + @Override + public JpaMember toEntity(Member domain) { + return mapper.map(domain, JpaMember.class); + } + + @Override + public Member toDomain(JpaMember entity) { + return mapper.map(entity, Member.class); + } + + @Override + public MemberDTO toDTO(Member domain) { + return mapper.map(domain, MemberDTO.class); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/model/JpaMember.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/model/JpaMember.java new file mode 100644 index 0000000..f1c7e04 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/model/JpaMember.java @@ -0,0 +1,45 @@ +package blisgo.infrastructure.internal.persistence.member.model; + +import blisgo.infrastructure.internal.persistence.common.BaseTimeEntity; +import blisgo.infrastructure.internal.persistence.common.JpaPicture; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import java.util.UUID; + +@Getter +@SuperBuilder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +@Entity +@DynamicUpdate +@DynamicInsert +@Table(name = "member") +@Comment("회원") +public class JpaMember extends BaseTimeEntity { + @Id + @Comment("ID") + private UUID memberId; + + @Column(unique = true) + @Comment("이름") + private String name; + + @Comment("이메일") + private String email; + + @Embedded + @AttributeOverride(name = "url", column = @Column(name = "picture")) + private JpaPicture picture; + + public void updateInfo(JpaMember jpaMember) { + this.name = jpaMember.name(); + this.picture = jpaMember.picture(); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberCustomRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberCustomRepository.java new file mode 100644 index 0000000..42d6202 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberCustomRepository.java @@ -0,0 +1,13 @@ +package blisgo.infrastructure.internal.persistence.member.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class MemberCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + private final JdbcTemplate jdbcTemplate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberJpaRepository.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberJpaRepository.java new file mode 100644 index 0000000..fb51a9c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/persistence/member/repository/MemberJpaRepository.java @@ -0,0 +1,13 @@ +package blisgo.infrastructure.internal.persistence.member.repository; + +import blisgo.infrastructure.internal.persistence.member.model.JpaMember; +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface MemberJpaRepository extends CrudRepository { + Optional findFirstByEmail(String email); + + boolean deleteByEmail(String email); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/JacksonConfig.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/JacksonConfig.java new file mode 100644 index 0000000..a070064 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/JacksonConfig.java @@ -0,0 +1,20 @@ +package blisgo.infrastructure.internal.rest; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JacksonConfig { + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder + .featuresToEnable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT) + .defaultViewInclusion(true) + .indentOutput(true) + .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) + .build(); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/Uploadable.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/Uploadable.java new file mode 100644 index 0000000..31a3923 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/rest/Uploadable.java @@ -0,0 +1,11 @@ +package blisgo.infrastructure.internal.rest; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +public interface Uploadable { + @PostMapping("/upload") + String uploadAndReturnResourceUrl(final MultipartFile file); +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/CustomOidcUserService.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/CustomOidcUserService.java new file mode 100644 index 0000000..8cbb857 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/CustomOidcUserService.java @@ -0,0 +1,40 @@ +package blisgo.infrastructure.internal.security; + +import blisgo.usecase.port.MemberInputPort; +import blisgo.usecase.request.member.UpdateMember; +import lombok.RequiredArgsConstructor; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.oidc.OidcUserInfo; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CustomOidcUserService extends OidcUserService { + private final MemberInputPort usecase; + + @Override + public OidcUser loadUser(OidcUserRequest oidcUserRequest) throws OAuth2AuthenticationException { + OidcUser oidcUser = super.loadUser(oidcUserRequest); + + registerOrUpdate(oidcUser.getUserInfo()); + + return oidcUser; + } + + public void registerOrUpdate(OidcUserInfo oidcUserInfo) { + String email = oidcUserInfo.getEmail(); + String name = oidcUserInfo.getFullName(); + String picture = oidcUserInfo.getPicture(); + + UpdateMember command = UpdateMember.builder() + .email(email) + .name(name) + .picture(picture) + .build(); + + usecase.updateMember(command); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/SecurityConfig.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/SecurityConfig.java new file mode 100644 index 0000000..7388e09 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/security/SecurityConfig.java @@ -0,0 +1,96 @@ +package blisgo.infrastructure.internal.security; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.logout.LogoutHandler; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.io.IOException; +import java.util.List; + +@RequiredArgsConstructor +@EnableMethodSecurity +@Configuration +public class SecurityConfig { + private final CustomOidcUserService customOidcUserService; + + @Value("${okta.oauth2.issuer}") + private String issuer; + + @Value("${okta.oauth2.client-id}") + private String clientId; + + @Bean + public SecurityFilterChain configure(HttpSecurity http) throws Exception { + + http.headers(headers -> headers + .httpStrictTransportSecurity(hsts -> hsts + .includeSubDomains(true) + .preload(true) + .maxAgeInSeconds(31536000) + ) + ); + + http.oauth2Login(oauth2Login -> oauth2Login + .loginPage("/oauth2/authorization/okta") + .defaultSuccessUrl("/", false) + .userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint + .oidcUserService(customOidcUserService) + ) + ); + + http.formLogin(AbstractHttpConfigurer::disable); + http.httpBasic(AbstractHttpConfigurer::disable); + + http.csrf(AbstractHttpConfigurer::disable); + + http.cors(cors -> cors.configurationSource(corsConfigurationSource())); + + http.logout(logout -> logout + .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) + .invalidateHttpSession(true) + .deleteCookies("JSESSIONID") + .clearAuthentication(true) + .addLogoutHandler(logoutHandler()) + ); + + http.sessionManagement(session -> session + .maximumSessions(1) + .maxSessionsPreventsLogin(true) + ); + + return http.build(); + } + + private LogoutHandler logoutHandler() { + return (request, response, authentication) -> { + try { + String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString(); + response.sendRedirect(issuer + "v2/logout?client_id=" + clientId + "&returnTo=" + baseUrl); + } catch (IOException e) { + throw new RuntimeException(e); + } + }; + } + + @Bean + CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedOrigins(List.of("*")); + configuration.setAllowedMethods(List.of("*")); + configuration.setAllowedHeaders(List.of("*")); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/CustomServletConfig.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/CustomServletConfig.java new file mode 100644 index 0000000..ce9369b --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/CustomServletConfig.java @@ -0,0 +1,16 @@ +package blisgo.infrastructure.internal.ui.base; + +import org.springframework.boot.web.server.MimeMappings; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CustomServletConfig implements WebServerFactoryCustomizer { + @Override + public void customize(ConfigurableServletWebServerFactory factory) { + MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT); + mappings.add("mjs", "application/javascript;charset=utf-8"); + factory.setMimeMappings(mappings); + } +} \ No newline at end of file diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/Router.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/Router.java new file mode 100644 index 0000000..7df9711 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/Router.java @@ -0,0 +1,32 @@ +package blisgo.infrastructure.internal.ui.base; + +import java.util.StringJoiner; + +public class Router { + protected String routes(Object... strings) { + StringJoiner sj = new StringJoiner("/", "/", ""); + + for (Object str : strings) { + sj.add(str.toString().toLowerCase()); + } + + return sj.toString(); + } + + protected String fragment(Object target) { + return "::" + target.toString().toLowerCase(); + } + + protected enum Folder { + COMMUNITY, DICTIONARY, MEMBER + } + + protected enum Page { + INDEX, PROFILE, CATALOGUE, INFO, BOARD, CONTENT, WRITE, EDIT + } + + public enum Fragment { + POSTS, DOGAMS, MEMBER, POST, DICTIONARIES, WASTE, WASTES, WASTE_RELATED, REPLIES + } + +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/TimeDiffUtil.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/TimeDiffUtil.java new file mode 100644 index 0000000..09494e2 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/base/TimeDiffUtil.java @@ -0,0 +1,42 @@ +package blisgo.infrastructure.internal.ui.base; + +import lombok.experimental.UtilityClass; + +import java.time.Duration; +import java.time.LocalDateTime; + +@UtilityClass +public class TimeDiffUtil { + public static String calcTimeDiff(LocalDateTime localDateTime) { + LocalDateTime now = LocalDateTime.now(); + Duration duration = Duration.between(localDateTime, now); + + long diffSeconds = duration.getSeconds(); + if (diffSeconds < 60) { + return diffSeconds + "초 전"; + } + + long diffMinutes = diffSeconds / 60; + if (diffMinutes < 60) { + return diffMinutes + "분 전"; + } + + long diffHours = diffMinutes / 60; + if (diffHours < 24) { + return diffHours + "시간 전"; + } + + long diffDays = diffHours / 24; + if (diffDays < 30) { + return diffDays + "일 전"; + } + + long diffMonths = diffDays / 30; + if (diffMonths < 12) { + return diffMonths + "개월 전"; + } + + long diffYears = diffMonths / 12; + return diffYears + "년 전"; + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/UnsplashClient.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/UnsplashClient.java new file mode 100644 index 0000000..810e083 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/UnsplashClient.java @@ -0,0 +1,71 @@ +package blisgo.infrastructure.internal.ui.component; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class UnsplashClient { + static final String HOST = "https://api.unsplash.com/photos/random"; + static final String QUERY = "waste,garbage,trash,recycling"; + static final String OPTIONS = "&fm=webp&w=1500&q=50&blur=50"; + static final String CLIENT_ID = "CTW7rq3n5wwaqHphLTlv47RsPHweBqy4QWe7_YVCvk8"; + + public static void changeWallpaper() throws IOException, InterruptedException { + Optional imageUrl = Optional.of(getImageUrl()); + replaceImage(imageUrl.get()); + } + + + public static String getImageUrl() throws IOException, InterruptedException { + String link = String.format(HOST + "?query=" + QUERY + "&client_id=" + CLIENT_ID); + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(link)).method("GET", HttpRequest.BodyPublishers.noBody()).build(); + + try (HttpClient client = HttpClient.newHttpClient()) { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonObj = mapper.readTree(response.body()); + jsonObj = jsonObj.get("urls"); + + return jsonObj.get("raw").asText().concat(OPTIONS); + } + } + + private static void replaceImage(String editedImageLink) throws IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(editedImageLink)) + .build(); + + try (HttpClient client = HttpClient.newHttpClient()) { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofInputStream()); + + ReadableByteChannel rbc = Channels.newChannel(response.body()); + Resource resource = new ClassPathResource("static/assets/img/index_wallpaper.webp"); + Path wallpaperDir = Paths.get(resource.getURI()); + log.info("파일 위치>" + wallpaperDir); + + try (FileOutputStream fos = new FileOutputStream(wallpaperDir.toFile())) { + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + } + } + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/WallpaperChanger.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/WallpaperChanger.java new file mode 100644 index 0000000..e40724c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/component/WallpaperChanger.java @@ -0,0 +1,21 @@ +package blisgo.infrastructure.internal.ui.component; + +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Getter +@Slf4j +@Component +public class WallpaperChanger { + private volatile String wallpaperUrl; + + @PostConstruct + public void changeIndexWallpaperDaily() throws IOException, InterruptedException { + wallpaperUrl = UnsplashClient.getImageUrl(); + } + +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/DogamRender.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/DogamRender.java new file mode 100644 index 0000000..4fc8661 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/DogamRender.java @@ -0,0 +1,70 @@ +package blisgo.infrastructure.internal.ui.render; + +import blisgo.infrastructure.internal.persistence.dictionary.mapper.WasteMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.usecase.request.dogam.AddDogam; +import blisgo.usecase.request.dogam.DogamCommand; +import blisgo.usecase.request.dogam.DogamQuery; +import blisgo.usecase.request.dogam.GetDogam; +import blisgo.usecase.request.waste.WasteQuery; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import java.time.LocalDateTime; +import java.util.Map; + +import static org.springframework.data.domain.Sort.Direction.DESC; + +@Controller +@RequestMapping("/dogams") +@RequiredArgsConstructor +public class DogamRender extends Router { + private final DogamQuery queryUsecase; + private final DogamCommand commandUsecase; + private final WasteQuery wasteQuery; + private final WasteMapper wasteMapper; + + // 도감 추가 + @PostMapping + public void createDogam(AddDogam command) { + commandUsecase.addDogam(command); + } + + // 도감 삭제 + + @GetMapping + @PreAuthorize("isAuthenticated()") + public ModelAndView dogam( + @AuthenticationPrincipal DefaultOidcUser oidcUser, + @PageableDefault(size = 12, sort = "createdDate", direction = DESC) Pageable pageable, + @RequestParam(required = false) LocalDateTime lastDogamCreatedDate + ) { + if (lastDogamCreatedDate == null) { + lastDogamCreatedDate = LocalDateTime.now(); + } + + GetDogam query = GetDogam.builder() + .email(oidcUser.getEmail()) + .pageable(pageable) + .lastDogamCreatedDate(lastDogamCreatedDate) + .build(); + + var wastes = wasteQuery.getWastesFromDogam(query); + + return new ModelAndView( + routes(Folder.MEMBER, Page.PROFILE) + fragment(Fragment.WASTES), + Map.of("wastes", wastes.map(wasteMapper::toDTO)) + ); + + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/MemberRender.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/MemberRender.java new file mode 100644 index 0000000..c995051 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/MemberRender.java @@ -0,0 +1,39 @@ +package blisgo.infrastructure.internal.ui.render; + +import blisgo.infrastructure.internal.persistence.member.mapper.MemberMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.usecase.request.member.GetMember; +import blisgo.usecase.request.member.MemberQuery; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Map; + +@Controller +@RequestMapping("/members") +@RequiredArgsConstructor +public class MemberRender extends Router { + private final MemberQuery queryUsecase; + private final MemberMapper mapper; + + @GetMapping + @PreAuthorize("isAuthenticated()") + public ModelAndView profile(@AuthenticationPrincipal DefaultOidcUser user) { + var query = GetMember.builder() + .email(user.getEmail()) + .build(); + + var member = queryUsecase.getMember(query); + + return new ModelAndView( + routes(Router.Folder.MEMBER, Router.Page.PROFILE) + fragment(Router.Fragment.MEMBER), + Map.of("member", mapper.toDTO(member)) + ); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/PostRender.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/PostRender.java new file mode 100644 index 0000000..288f2a0 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/PostRender.java @@ -0,0 +1,102 @@ +package blisgo.infrastructure.internal.ui.render; + +import blisgo.infrastructure.internal.persistence.community.mapper.PostMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.usecase.request.post.*; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import java.util.Map; + +import static org.springframework.data.domain.Sort.Direction.DESC; + +@Controller +@RequestMapping("/posts") +@RequiredArgsConstructor +public class PostRender extends Router { + private final PostCommand commandUsecase; + private final PostQuery queryUsecase; + private final PostMapper mapper; + + @GetMapping + public ModelAndView posts( + @PageableDefault(sort = "createdDate", direction = DESC) Pageable pageable, + @RequestParam(required = false, defaultValue = "" + Long.MAX_VALUE) Long lastPostId, + @RequestParam(required = false) Long postId + ) { + if (postId == null) { + var query = GetPost.builder() + .pageable(pageable) + .postId(lastPostId) + .build(); + + var posts = queryUsecase.getPosts(query); + + return new ModelAndView( + routes(Folder.COMMUNITY, Page.BOARD) + fragment(Fragment.POSTS), + Map.of("posts", posts.map(mapper::toDTO)) + ); + } else { + var query = GetPost.builder() + .postId(postId) + .build(); + + var post = queryUsecase.getPost(query); + + return new ModelAndView( + routes(Folder.COMMUNITY, Page.CONTENT) + fragment(Fragment.POST), + Map.ofEntries( + Map.entry("post", mapper.toDTO(post)), + Map.entry("readOnly", true) + ) + ); + } + } + + @PostMapping + @PatchMapping + public RedirectView updateOrCreatePost(UpdatePost command) { + if (command.postId() == null) + commandUsecase.addPost(new AddPost(command.title(), command.content())); + else { + commandUsecase.updatePost(command); + } + + return new RedirectView(routes(Folder.COMMUNITY), false); + } + + @DeleteMapping("/{postId}") + public RedirectView removePost(@PathVariable long postId) { + commandUsecase.removePost(new RemovePost(postId)); + + return new RedirectView(routes(Folder.COMMUNITY), false); + } + + @PostMapping("/{postId}/like") + @ResponseStatus(HttpStatus.OK) + public void like(@PathVariable Long postId) { + PostLike command = PostLike.builder() + .postId(postId) + .isLike(true) + .build(); + + commandUsecase.like(command); + } + + @PostMapping("/{postId}/dislike") + @ResponseStatus(HttpStatus.OK) + public void dislike(@PathVariable Long postId) { + PostLike command = PostLike.builder() + .postId(postId) + .isLike(false) + .build(); + + commandUsecase.like(command); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/ReplyRender.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/ReplyRender.java new file mode 100644 index 0000000..4217b1d --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/ReplyRender.java @@ -0,0 +1,78 @@ +package blisgo.infrastructure.internal.ui.render; + +import blisgo.infrastructure.internal.persistence.community.mapper.ReplyMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.infrastructure.internal.ui.response.ReplyDTO; +import blisgo.usecase.request.reply.*; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Map; + +import static org.springframework.data.domain.Sort.Direction.ASC; + +@Controller +@RequestMapping("/replies") +@RequiredArgsConstructor +public class ReplyRender extends Router { + private final ReplyCommand commandUsecase; + private final ReplyQuery queryUsecase; + private final ReplyMapper mapper; + + + @GetMapping("/{postId}") + public ModelAndView replies( + @PathVariable Long postId, + @PageableDefault(sort = "createdDate", direction = ASC) Pageable pageable, + @RequestParam(required = false, defaultValue = "0") Long lastReplyId + ) { + GetReply query = GetReply.builder() + .postId(postId) + .lastReplyId(lastReplyId) + .pageable(pageable) + .build(); + + return new ModelAndView( + routes(Router.Folder.COMMUNITY, Router.Page.CONTENT) + fragment(Router.Fragment.REPLIES), + Map.of("replies", queryUsecase.getReplies(query) + .map(mapper::toDTO) + .map(ReplyDTO::withTimeDiff) + ) + ); + } + + @PostMapping("/{postId}") + @PreAuthorize("isAuthenticated()") + public ModelAndView create( + @PathVariable Long postId, + @RequestParam String content + ) { + AddReply command = AddReply.builder() + .postId(postId) + .content(content) + .build(); + + commandUsecase.addReply(command); + + return new ModelAndView( + routes(Router.Folder.COMMUNITY, Router.Page.CONTENT) + fragment(Router.Fragment.REPLIES) + ); + } + + @DeleteMapping("/{replyId}") + @PreAuthorize("isAuthenticated()") + public ModelAndView delete( + @PathVariable Long replyId + ) { + commandUsecase.removeReply(new RemoveReply(replyId)); + + return new ModelAndView( + routes(Router.Folder.COMMUNITY, Router.Page.CONTENT) + fragment(Router.Fragment.REPLIES) + ); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/WasteRender.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/WasteRender.java new file mode 100644 index 0000000..32a1760 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/render/WasteRender.java @@ -0,0 +1,66 @@ +package blisgo.infrastructure.internal.ui.render; + +import blisgo.infrastructure.internal.persistence.dictionary.mapper.GuideMapper; +import blisgo.infrastructure.internal.persistence.dictionary.mapper.WasteMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.usecase.request.waste.GetWaste; +import blisgo.usecase.request.waste.WasteQuery; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.stereotype.Controller; +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.servlet.ModelAndView; + +import java.util.Map; + +import static org.springframework.data.domain.Sort.Direction.ASC; + +@Controller +@RequestMapping("/wastes") +@RequiredArgsConstructor +public class WasteRender extends Router { + private final WasteQuery queryUsecase; + private final WasteMapper wasteMapper; + private final GuideMapper guideMapper; + + @GetMapping + public ModelAndView wastes( + @PageableDefault(size = 24, sort = "wasteId", direction = ASC) Pageable pageable, + @RequestParam(required = false, defaultValue = "0") Long lastWasteId, + @RequestParam(required = false) Long wasteId + ) { + if (wasteId == null) { + GetWaste query = GetWaste.builder() + .pageable(pageable) + .lastWasteId(lastWasteId) + .build(); + + var wastes = queryUsecase.getWastes(query); + + return new ModelAndView( + routes(Folder.DICTIONARY, Page.CATALOGUE) + fragment(Fragment.WASTES), + Map.of("wastes", wastes.map(wasteMapper::toDTO)) + ); + } else { + var query = GetWaste.builder() + .wasteId(wasteId) + .build(); + + var waste = queryUsecase.getWaste(query); + var guides = queryUsecase.getGuides(waste.categories()); + var relatedWastes = queryUsecase.getWastesRelated(waste.categories()); + + return new ModelAndView( + routes(Folder.DICTIONARY, Page.INFO) + fragment(Fragment.WASTE), + Map.ofEntries( + Map.entry("waste", wasteMapper.toDTO(waste)), + Map.entry("guides", guideMapper.toDTOs(guides)), + Map.entry("relatedWastes", wasteMapper.toDTOs(relatedWastes)) + ) + ); + } + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/DogamDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/DogamDTO.java new file mode 100644 index 0000000..eddd59c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/DogamDTO.java @@ -0,0 +1,18 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.dictionary.Waste; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class DogamDTO { + private Long memberId; + private Long wasteId; + private Waste waste; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/GuideDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/GuideDTO.java new file mode 100644 index 0000000..fd6b431 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/GuideDTO.java @@ -0,0 +1,15 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.common.Picture; +import blisgo.domain.dictionary.vo.Category; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class GuideDTO { + private Category category; + private String content; + private Picture picture; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/MemberDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/MemberDTO.java new file mode 100644 index 0000000..e7f11f9 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/MemberDTO.java @@ -0,0 +1,21 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.common.Picture; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class MemberDTO { + private UUID id; + private String name; + private String email; + private Picture picture; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} + diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/PostDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/PostDTO.java new file mode 100644 index 0000000..662e02c --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/PostDTO.java @@ -0,0 +1,23 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.common.Author; +import blisgo.domain.common.Content; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class PostDTO { + private Long postId; + private Author author; + private String title; + private Content content; + private Long views; + private Long likes; + private Long replies; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/ReplyDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/ReplyDTO.java new file mode 100644 index 0000000..e772a9f --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/ReplyDTO.java @@ -0,0 +1,27 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.common.Author; +import blisgo.infrastructure.internal.ui.base.TimeDiffUtil; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ReplyDTO { + private Long replyId; + private Long postId; + private Author author; + private String content; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; + private String timeDiff; + + public ReplyDTO withTimeDiff() { + this.timeDiff = TimeDiffUtil.calcTimeDiff(this.createdDate); + return this; + } +} + diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/WasteDTO.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/WasteDTO.java new file mode 100644 index 0000000..01feac8 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/response/WasteDTO.java @@ -0,0 +1,25 @@ +package blisgo.infrastructure.internal.ui.response; + +import blisgo.domain.common.Picture; +import blisgo.domain.dictionary.vo.Category; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class WasteDTO { + private Long wasteId; + private String name; + private String type; + private Picture picture; + private String treatment; + private Short popularity; + private Long views; + private List categories; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/CommunityView.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/CommunityView.java new file mode 100644 index 0000000..6c0a7cf --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/CommunityView.java @@ -0,0 +1,68 @@ +package blisgo.infrastructure.internal.ui.view; + +import blisgo.infrastructure.internal.persistence.community.mapper.PostMapper; +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.usecase.request.post.GetPost; +import blisgo.usecase.request.post.PostQuery; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Map; + +@Controller +@RequestMapping("/community") +@RequiredArgsConstructor +public class CommunityView extends Router { + private final PostQuery queryUsecase; + private final PostMapper mapper; + + @GetMapping + public ModelAndView board() { + return new ModelAndView(routes(Folder.COMMUNITY, Page.BOARD)); + } + + @GetMapping("/{postId}") + public ModelAndView content(@PathVariable Long postId) { + return new ModelAndView( + routes(Folder.COMMUNITY, Page.CONTENT), + Map.ofEntries( + Map.entry("postId", postId), + Map.entry("readOnly", false) + ) + ); + } + + @GetMapping("/write") + @PreAuthorize("isAuthenticated()") + public ModelAndView write( + @AuthenticationPrincipal DefaultOidcUser oidcUser, + @RequestParam(required = false) Long postId, + Model model + ) { + if (postId != null) { + GetPost query = GetPost.builder() + .postId(postId) + .build(); + + var post = queryUsecase.getPost(query); + + if (post != null && post.isAuthor(oidcUser.getEmail())) { + model.addAttribute("post", mapper.toDTO(post)); + model.addAttribute("readOnly", false); + } + } + + return new ModelAndView( + routes(Folder.COMMUNITY, Page.WRITE) + ); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/DictionaryView.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/DictionaryView.java new file mode 100644 index 0000000..a06f914 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/DictionaryView.java @@ -0,0 +1,29 @@ +package blisgo.infrastructure.internal.ui.view; + +import blisgo.infrastructure.internal.ui.base.Router; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Map; + +@Controller +@RequestMapping("/dictionary") +@RequiredArgsConstructor +public class DictionaryView extends Router { + @GetMapping + public String dictionary() { + return routes(Folder.DICTIONARY, Page.CATALOGUE); + } + + @GetMapping("/{wasteId}") + public ModelAndView product(@PathVariable Long wasteId) { + return new ModelAndView( + routes(Folder.DICTIONARY, Page.INFO), + Map.of("wasteId", wasteId) + ); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/HomeView.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/HomeView.java new file mode 100644 index 0000000..64b48c9 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/HomeView.java @@ -0,0 +1,34 @@ +package blisgo.infrastructure.internal.ui.view; + +import blisgo.infrastructure.internal.ui.base.Router; +import blisgo.infrastructure.internal.ui.component.WallpaperChanger; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import java.util.Map; + +@Slf4j +@RequiredArgsConstructor +@Controller +@RequestMapping("/") +public class HomeView extends Router { + private final WallpaperChanger wallpaperChanger; + + @GetMapping + public ModelAndView index() { + return new ModelAndView( + routes(Page.INDEX), + Map.of("wallpaper", wallpaperChanger.wallpaperUrl()) + ); + } + + @GetMapping("/login") + public RedirectView login() { + return new RedirectView("/oauth2/authorization/okta"); + } +} diff --git a/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/MemberView.java b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/MemberView.java new file mode 100644 index 0000000..eae45c1 --- /dev/null +++ b/infrastructure/internal/src/main/java/blisgo/infrastructure/internal/ui/view/MemberView.java @@ -0,0 +1,17 @@ +package blisgo.infrastructure.internal.ui.view; + +import blisgo.infrastructure.internal.ui.base.Router; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +@RequiredArgsConstructor +public class MemberView extends Router { + @GetMapping("/profile") + @PreAuthorize("isAuthenticated()") + public String profile() { + return routes(Folder.MEMBER, Page.PROFILE); + } +} diff --git a/infrastructure/internal/src/main/resources/application-common.yml b/infrastructure/internal/src/main/resources/application-common.yml new file mode 100644 index 0000000..e69de29 diff --git a/infrastructure/internal/src/main/resources/application-oauth.yml b/infrastructure/internal/src/main/resources/application-oauth.yml new file mode 100644 index 0000000..31d9b8a --- /dev/null +++ b/infrastructure/internal/src/main/resources/application-oauth.yml @@ -0,0 +1,13 @@ +okta: + oauth2: + issuer: https://${AUTH0_DOMAIN}/ + client-id: ${AUTH0_CLIENT_ID} + client-secret: ${AUTH0_CLIENT_SECRET} + audience: https://${AUTH0_DOMAIN}/userinfo + +spring: + security: + oauth2: + resourceserver: + jwt: + issuer-uri: https://${AUTH0_DOMAIN}/ \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/application-redis.yml b/infrastructure/internal/src/main/resources/application-redis.yml new file mode 100644 index 0000000..9da0068 --- /dev/null +++ b/infrastructure/internal/src/main/resources/application-redis.yml @@ -0,0 +1,14 @@ +server: + servlet: + session: + cookie: + path: / + name: JSESSIONID + http-only: true + secure: true + timeout: 3600 + +spring: + session: + redis: + namespace: spring:session \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/application-thymeleaf.yml b/infrastructure/internal/src/main/resources/application-thymeleaf.yml new file mode 100644 index 0000000..989436b --- /dev/null +++ b/infrastructure/internal/src/main/resources/application-thymeleaf.yml @@ -0,0 +1,34 @@ +spring: + mvc: + hiddenmethod: + filter: + enabled: true + thymeleaf: + prefix: classpath:/templates + check-template-location: true + suffix: .html + mode: HTML + servlet: + multipart: + maxRequestSize: 10MB + maxFileSize: 10MB + +server: + servlet: + encoding: + enabled: true + force: true + charset: UTF-8 + session: + tracking-modes: cookie + cookie: + http-only: false + secure: true + + error: + include-stacktrace: ALWAYS + include-exception: true + compression: + min-response-size: 512 + mime-types: text/html,text/plain,text/xml,text/css,application/javascript,application/json + enabled: true \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/static/assets/css/cmmn/editor-js.css b/infrastructure/internal/src/main/resources/static/assets/css/cmmn/editor-js.css new file mode 100644 index 0000000..366aaaa --- /dev/null +++ b/infrastructure/internal/src/main/resources/static/assets/css/cmmn/editor-js.css @@ -0,0 +1,24 @@ +.ce-block__content, .ce-toolbar__content { + max-width: calc(100% - 30px) !important; +} + +.cdx-block { + max-width: 100% !important; +} + +.codex-editor__loader { + height: 38px !important; +} + +.codex-editor__redactor { + padding-bottom: 38px !important; +} + +.ce-toolbar__plus, .ce-toolbar__settings-btn { + background-color: var(--bs-light); +} + +.cdx-search-field__input { + color: var(--bs-dark); +} + diff --git a/infrastructure/internal/src/main/resources/static/assets/css/cmmn/style.css b/infrastructure/internal/src/main/resources/static/assets/css/cmmn/style.css new file mode 100644 index 0000000..0e97c35 --- /dev/null +++ b/infrastructure/internal/src/main/resources/static/assets/css/cmmn/style.css @@ -0,0 +1,46 @@ +#accounticon-desktop { + cursor: pointer; +} + +#accounticon-mobile { + cursor: pointer; +} + +::-webkit-scrollbar { + display: none; +} + +#post-title { + font-weight: bold; +} + +#comment-table { + overflow-y: auto; + height: 50vh; +} + +.ql-editor { + font-size: 16px; +} + +.aa-DetachedCancelButton { + font-size: 0; +} + +.aa-DetachedCancelButton::before { + content: '✕'; + font-size: 1rem; +} + +main { + padding-right: 12px; + padding-left: 12px; + padding-top: 68px; +} + +#index { + padding-top: 0px; + padding-left: 0px; + padding-right: 0px; +} + diff --git a/infrastructure/internal/src/main/resources/static/assets/img/favicon/16x16.png b/infrastructure/internal/src/main/resources/static/assets/img/favicon/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb18fd87bf8081207fcff81513916c72a51e956 GIT binary patch literal 847 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 gP)zkguo&D?w5 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 FV1nh|G_wEz literal 0 HcmV?d00001 diff --git a/infrastructure/internal/src/main/resources/static/assets/img/favicon/32x32.png b/infrastructure/internal/src/main/resources/static/assets/img/favicon/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaf6ae6403a254a6139d95b97c351cebeb9dd93 GIT binary patch literal 1781 zcmV)$o&D2dUWk)L~1H=#my${J0&YDnfWn@?*d*;q*-npC++fc zEV7XP{wov}3VA8BGEG~0xz^n&97#j0PzT*j@nCH=UMK54{`$R?Og#t zcXuD*!3ekA8k!g;j+8s{yy`C}Q$%qxZaooGy?oCW+fLYVN&(ovhA3fuW@xILL3Q z#1qS8CR_SU$4YE_xJm_JxD_bB18j@lXg@oTfXjEwNP8NF<}JiqUOO&MU(Cgc=5gn53KUqfO%+nKx zEEUNBg3{})p5+%vbll14+4LC-Uib6~xYZ1eYyaXjG@u~po^IfZLKm|FjyL+$Am~;Q zv`)u2;1T@kejj^(;HNx)nk1xbRiu;-^>Jeaa|K>quZB%A*l<^B~q zCBZ3eMG}>*FmnHQ-~RXoJ7KK6b77O$aU3-QSyM^(57hLy6l$#j(*-%>fCZ?6u8Aq|NEk#4E&S%SA{B%!@2UhC% z4TX8LhHr$l1<$u690*9bG}74I+8~DUlhL7Z-KFI4BbBza+J!BBga2$CYefD@8j-FE z<`gP?(Cv7gjKQs#ynomCKoJpK+CowL_m3P202Kdg%e++k!nV|ZYCNL^+=d5TcaV09 zP=(Eo1-k~<&1t(s)EyYtj~)AK@X?mLQeFQ2(lk{7VHAM-6PMW-$~;#G)|7PA?`+(V z)$}HB@ZUJ?HQd%A(y>}$jTb?1ITO6rkv2|~;UIU?|q Xq`r5WKyEdY00000NkvXXu0mjfv!GRg literal 0 HcmV?d00001 diff --git a/infrastructure/internal/src/main/resources/static/assets/img/favicon/512x512.png b/infrastructure/internal/src/main/resources/static/assets/img/favicon/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d86919a6970f1173ac73389a63329246b444a1 GIT binary patch literal 32701 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

7l>0rc=Crqcin`j7% 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 literal 0 HcmV?d00001 diff --git a/infrastructure/internal/src/main/resources/static/assets/img/screenshots/mobile_2.webp b/infrastructure/internal/src/main/resources/static/assets/img/screenshots/mobile_2.webp new file mode 100644 index 0000000000000000000000000000000000000000..cfd3608ac68742c80861ee9653c0ecfe8bef0e07 GIT binary patch literal 29512 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 + + `; + }, + noResults() { + return '일치하는 검색결과가 없습니다.'; + } + } + } + ]); + } +})); \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/static/assets/js/cmmn/aos.mjs b/infrastructure/internal/src/main/resources/static/assets/js/cmmn/aos.mjs new file mode 100644 index 0000000..f46378f --- /dev/null +++ b/infrastructure/internal/src/main/resources/static/assets/js/cmmn/aos.mjs @@ -0,0 +1,3 @@ +AOS.init( + {duration: 250, offset:20, delay: 0, once: true} +); \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/base/header.html b/infrastructure/internal/src/main/resources/templates/base/header.html new file mode 100644 index 0000000..a0707d8 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/base/header.html @@ -0,0 +1,146 @@ + + + + + + + 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/base/layout.html b/infrastructure/internal/src/main/resources/templates/base/layout.html new file mode 100644 index 0000000..60a8d98 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/base/layout.html @@ -0,0 +1,154 @@ + + + + + + + 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/community/board.html b/infrastructure/internal/src/main/resources/templates/community/board.html new file mode 100644 index 0000000..9a89ad1 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/community/board.html @@ -0,0 +1,121 @@ + + + + + + + 게시판 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/community/content.html b/infrastructure/internal/src/main/resources/templates/community/content.html new file mode 100644 index 0000000..0136750 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/community/content.html @@ -0,0 +1,212 @@ + + + + + + + 게시글 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + 닉네임 + + + 작성일조회수좋아요
    \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/community/write.html b/infrastructure/internal/src/main/resources/templates/community/write.html new file mode 100644 index 0000000..e9f924b --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/community/write.html @@ -0,0 +1,265 @@ + + + + + + + 게시글 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/dictionary/catalogue.html b/infrastructure/internal/src/main/resources/templates/dictionary/catalogue.html new file mode 100644 index 0000000..f00a7e6 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/dictionary/catalogue.html @@ -0,0 +1,135 @@ + + + + + + + 사전 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    사전 이미지 +
    품명
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/dictionary/info.html b/infrastructure/internal/src/main/resources/templates/dictionary/info.html new file mode 100644 index 0000000..5cf43ba --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/dictionary/info.html @@ -0,0 +1,186 @@ + + + + + + + 상세정보 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    사전 이미지
    +
    +
    +
    + +
    +
    +

    이름

    +
    +
    + + + 별점/10
    + + + 태그명 +
    +
    태그에 해당되는 폐기물 공통 처리 안내  +

    해당 폐기물 만의 취급 내용

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    설명서 + +
    +
    설명서 + +
    +
    +
    +
    +
    +
    +
    +
    +

    연관된 폐기물

    +
    +
    +
    사전 이미지 +
    폐기물명
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/index.html b/infrastructure/internal/src/main/resources/templates/index.html new file mode 100644 index 0000000..1e9e145 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/index.html @@ -0,0 +1,133 @@ + + + + + + + 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +

    분리ㅅㄱ

    +

    분리배출을 더욱 편리하게!

    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/templates/member/profile.html b/infrastructure/internal/src/main/resources/templates/member/profile.html new file mode 100644 index 0000000..c25b446 --- /dev/null +++ b/infrastructure/internal/src/main/resources/templates/member/profile.html @@ -0,0 +1,123 @@ + + + + + + + 마이페이지 - 분리ㅅㄱ + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    프로필
    +
    +
    +
    +
    +

    옥재욱

    +
    okjaeook98@gmail.com
    since. 2020-03-01
    \ No newline at end of file diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..3426a54 --- /dev/null +++ b/lombok.config @@ -0,0 +1,17 @@ +config.stopBubbling = true + +#setter 차단. record 식 데이터 접근 +lombok.accessors.fluent = true + +# supressWarnings 차단 +lombok.addSuppressWarnings = false + +# no argments constructor default accessor protected 설정 +lombok.accessors.makeFinal = true + +# builder 패턴 사용시 생성자 자동 생성 +lombok.builder = true + +lombok.setter.flagUsage = ERROR +lombok.sneakyThrows.flagUsage = ERROR +lombok.data.flagUsage = ERROR \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..18f18ac --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +rootProject.name = "blisgo" + +include("app") + +include("domain") + +include("usecase") + +include 'infrastructure:internal' +findProject(':infrastructure:internal')?.name = 'internal' +include 'infrastructure:external' +findProject(':infrastructure:external')?.name = 'external' + diff --git a/usecase/build.gradle b/usecase/build.gradle new file mode 100644 index 0000000..334170f --- /dev/null +++ b/usecase/build.gradle @@ -0,0 +1,6 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { + implementation project(':domain') +} \ No newline at end of file diff --git a/usecase/src/main/java/blisgo/usecase/UseCaseRoot.java b/usecase/src/main/java/blisgo/usecase/UseCaseRoot.java new file mode 100644 index 0000000..1d14353 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/UseCaseRoot.java @@ -0,0 +1,7 @@ +package blisgo.usecase; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan(basePackageClasses = UseCaseRoot.class) +public interface UseCaseRoot { +} diff --git a/usecase/src/main/java/blisgo/usecase/base/Events.java b/usecase/src/main/java/blisgo/usecase/base/Events.java new file mode 100644 index 0000000..04603a5 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/base/Events.java @@ -0,0 +1,20 @@ +package blisgo.usecase.base; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class Events { + private static ApplicationEventPublisher publisher; + + static void setPublisher(ApplicationEventPublisher publisher) { + Events.publisher = publisher; + } + + public static void raise(Object event) { + if (publisher != null) { + publisher.publishEvent(event); + } + } +} \ No newline at end of file diff --git a/usecase/src/main/java/blisgo/usecase/base/EventsConfiguration.java b/usecase/src/main/java/blisgo/usecase/base/EventsConfiguration.java new file mode 100644 index 0000000..a17b79f --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/base/EventsConfiguration.java @@ -0,0 +1,18 @@ +package blisgo.usecase.base; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class EventsConfiguration { + private final ApplicationContext applicationContext; + + @Bean + public InitializingBean eventsInitializer() { + return () -> Events.setPublisher(applicationContext); + } +} \ No newline at end of file diff --git a/usecase/src/main/java/blisgo/usecase/event/PostViewedEvent.java b/usecase/src/main/java/blisgo/usecase/event/PostViewedEvent.java new file mode 100644 index 0000000..5f3fb4b --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/event/PostViewedEvent.java @@ -0,0 +1,4 @@ +package blisgo.usecase.event; + +public record PostViewedEvent(Long postId) { +} \ No newline at end of file diff --git a/usecase/src/main/java/blisgo/usecase/port/DogamInputPort.java b/usecase/src/main/java/blisgo/usecase/port/DogamInputPort.java new file mode 100644 index 0000000..7c98811 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/DogamInputPort.java @@ -0,0 +1,43 @@ +package blisgo.usecase.port; + +import blisgo.domain.dictionary.Dogam; +import blisgo.domain.dictionary.vo.DogamId; +import blisgo.domain.dictionary.vo.WasteId; +import blisgo.domain.member.vo.MemberId; +import blisgo.usecase.request.dogam.AddDogam; +import blisgo.usecase.request.dogam.DogamCommand; +import blisgo.usecase.request.dogam.DogamQuery; +import blisgo.usecase.request.dogam.RemoveDogam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DogamInputPort implements DogamCommand, DogamQuery { + private final DogamOutputPort port; + + @Override + public boolean addDogam(AddDogam command) { + MemberId memberId = MemberId.of(command.memberId()); + WasteId wasteId = WasteId.of(command.wasteId()); + + Dogam dogam = Dogam.create(memberId, wasteId); + + return port.create(dogam); + } + + @Override + public boolean removeDogam(RemoveDogam command) { + MemberId memberId = MemberId.of(command.memberId()); + WasteId wasteId = WasteId.of(command.wasteId()); + + DogamId dogamId = DogamId.builder() + .memberId(memberId) + .wasteId(wasteId) + .build(); + + return port.delete(dogamId); + } +} diff --git a/usecase/src/main/java/blisgo/usecase/port/DogamOutputPort.java b/usecase/src/main/java/blisgo/usecase/port/DogamOutputPort.java new file mode 100644 index 0000000..edcf9e9 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/DogamOutputPort.java @@ -0,0 +1,12 @@ +package blisgo.usecase.port; + +import blisgo.domain.dictionary.Dogam; +import blisgo.domain.dictionary.vo.DogamId; +import org.jmolecules.architecture.hexagonal.SecondaryPort; + +@SecondaryPort +public interface DogamOutputPort { + boolean delete(DogamId identifier); + + boolean create(Dogam domain); +} diff --git a/usecase/src/main/java/blisgo/usecase/port/MemberInputPort.java b/usecase/src/main/java/blisgo/usecase/port/MemberInputPort.java new file mode 100644 index 0000000..9bfa2e3 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/MemberInputPort.java @@ -0,0 +1,52 @@ +package blisgo.usecase.port; + +import blisgo.domain.member.Member; +import blisgo.usecase.request.member.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Slf4j +@Service +@RequiredArgsConstructor +public class MemberInputPort implements MemberCommand, MemberQuery { + private final MemberOutputPort port; + + @Override + public boolean addMember(AddMember command) { + var member = Member.create( + command.name(), + command.email(), + command.picture() + ); + + return port.create(member); + } + + @Override + public boolean updateMember(UpdateMember command) { + var member = Member.create( + command.name(), + command.email(), + command.picture() + ); + + return port.update(member); + } + + @Override + public boolean removeMember(RemoveMember command) { + var email = command.email(); + + return port.delete(email); + } + + @Override + public Member getMember(GetMember query) { + var columns = Map.of("email", query.email()); + + return port.read(columns); + } +} diff --git a/usecase/src/main/java/blisgo/usecase/port/MemberOutputPort.java b/usecase/src/main/java/blisgo/usecase/port/MemberOutputPort.java new file mode 100644 index 0000000..d4ed270 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/MemberOutputPort.java @@ -0,0 +1,17 @@ +package blisgo.usecase.port; + +import blisgo.domain.member.Member; +import org.jmolecules.architecture.hexagonal.SecondaryPort; + +import java.util.Map; + +@SecondaryPort +public interface MemberOutputPort { + boolean update(Member domain); + + boolean delete(String email); + + boolean create(Member domain); + + Member read(Map columns); +} diff --git a/usecase/src/main/java/blisgo/usecase/port/PostInputPort.java b/usecase/src/main/java/blisgo/usecase/port/PostInputPort.java new file mode 100644 index 0000000..dc3e961 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/PostInputPort.java @@ -0,0 +1,66 @@ +package blisgo.usecase.port; + +import blisgo.domain.community.Post; +import blisgo.usecase.base.Events; +import blisgo.usecase.event.PostViewedEvent; +import blisgo.usecase.request.post.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Slf4j +@Service +@RequiredArgsConstructor +public class PostInputPort implements PostCommand, PostQuery { + private final PostOutputPort port; + + @Override + public boolean addPost(AddPost command) { + var post = Post.create( + command.title(), + command.content() + ); + + return port.create(post); + } + + @Override + public boolean updatePost(UpdatePost command) { + var post = Post.create( + command.postId(), + command.title(), + command.content() + ); + + return port.update(post); + } + + @Override + public boolean removePost(RemovePost command) { + var postId = command.postId(); + + return port.delete(postId); + } + + @Override + public boolean like(PostLike command) { + Long postId = command.postId(); + Boolean isLike = command.isLike(); + + return port.updateLike(postId, isLike); + } + + @Override + public Post getPost(GetPost query) { + Events.raise(new PostViewedEvent(query.postId())); + return port.read(query.postId()); + } + + @Override + public Slice getPosts(GetPost query) { + return port.read(Map.of("lastPostId", query.postId()), query.pageable()); + } +} diff --git a/usecase/src/main/java/blisgo/usecase/port/PostOutputPort.java b/usecase/src/main/java/blisgo/usecase/port/PostOutputPort.java new file mode 100644 index 0000000..76bbab1 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/PostOutputPort.java @@ -0,0 +1,26 @@ +package blisgo.usecase.port; + +import blisgo.domain.community.Post; +import org.jmolecules.architecture.hexagonal.SecondaryPort; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; + +import java.util.List; +import java.util.Map; + +@SecondaryPort +public interface PostOutputPort { + boolean create(Post domain); + + Post read(Long postId); + + Slice read(Map columns, Pageable pageable); + + boolean update(Post domain); + + boolean delete(Long identifier); + + boolean updateLike(Long postId, Boolean isLike); + + List findPostIds(); +} diff --git a/usecase/src/main/java/blisgo/usecase/port/ReplyInputPort.java b/usecase/src/main/java/blisgo/usecase/port/ReplyInputPort.java new file mode 100644 index 0000000..fe96ab9 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/ReplyInputPort.java @@ -0,0 +1,36 @@ +package blisgo.usecase.port; + +import blisgo.domain.community.Reply; +import blisgo.domain.community.vo.PostId; +import blisgo.usecase.request.reply.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ReplyInputPort implements ReplyCommand, ReplyQuery { + private final ReplyOutputPort port; + + @Override + public boolean addReply(AddReply command) { + var reply = Reply.builder() + .postId(PostId.of(command.postId())) + .content(command.content()) + .build(); + + return port.create(reply); + } + + @Override + public boolean removeReply(RemoveReply command) { + return port.delete(command.replyId()); + } + + @Override + public Slice getReplies(GetReply query) { + return port.read(query.postId(), query.pageable(), query.lastReplyId()); + } +} diff --git a/usecase/src/main/java/blisgo/usecase/port/ReplyOutputPort.java b/usecase/src/main/java/blisgo/usecase/port/ReplyOutputPort.java new file mode 100644 index 0000000..0fbcb29 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/ReplyOutputPort.java @@ -0,0 +1,17 @@ +package blisgo.usecase.port; + +import blisgo.domain.community.Reply; +import org.jmolecules.architecture.hexagonal.SecondaryPort; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; + +@SecondaryPort +public interface ReplyOutputPort { + boolean delete(Long identifier); + + boolean create(Reply domain); + + Slice read(Long postId, Pageable pageable, Long lastReplyId); + + boolean update(Reply domain); +} diff --git a/usecase/src/main/java/blisgo/usecase/port/WasteInputPort.java b/usecase/src/main/java/blisgo/usecase/port/WasteInputPort.java new file mode 100644 index 0000000..e2546de --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/WasteInputPort.java @@ -0,0 +1,47 @@ +package blisgo.usecase.port; + +import blisgo.domain.dictionary.Waste; +import blisgo.domain.dictionary.vo.Category; +import blisgo.domain.dictionary.vo.Guide; +import blisgo.domain.member.vo.MemberId; +import blisgo.usecase.request.dogam.GetDogam; +import blisgo.usecase.request.waste.GetWaste; +import blisgo.usecase.request.waste.WasteQuery; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class WasteInputPort implements WasteQuery { + private final WasteOutputPort port; + + @Override + public Slice getWastes(GetWaste query) { + return port.read(query.pageable(), query.lastWasteId()); + } + + @Override + public Waste getWaste(GetWaste query) { + return port.read(query.wasteId()); + } + + @Override + public List getGuides(List categories) { + return port.readGuides(categories); + } + + @Override + public Slice getWastesFromDogam(GetDogam query) { + return port.readWastesFromDogam(MemberId.of(query.email()).id(), query.pageable(), query.lastDogamCreatedDate()); + } + + @Override + public List getWastesRelated(List categories) { + return port.readWastesRelated(categories); + } +} diff --git a/usecase/src/main/java/blisgo/usecase/port/WasteOutputPort.java b/usecase/src/main/java/blisgo/usecase/port/WasteOutputPort.java new file mode 100644 index 0000000..3c4f47a --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/port/WasteOutputPort.java @@ -0,0 +1,25 @@ +package blisgo.usecase.port; + +import blisgo.domain.dictionary.Waste; +import blisgo.domain.dictionary.vo.Category; +import blisgo.domain.dictionary.vo.Guide; +import org.jmolecules.architecture.hexagonal.SecondaryPort; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@SecondaryPort +public interface WasteOutputPort { + Waste read(Long wasteId); + + Slice read(Pageable pageable, Long lastWasteId); + + List readGuides(List categories); + + Slice readWastesFromDogam(UUID memberId, Pageable pageable, LocalDateTime lastDogamCreatedDate); + + List readWastesRelated(List categories); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/dogam/AddDogam.java b/usecase/src/main/java/blisgo/usecase/request/dogam/AddDogam.java new file mode 100644 index 0000000..10ab557 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/dogam/AddDogam.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.dogam; + +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record AddDogam( + UUID memberId, + Long wasteId +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/dogam/DogamCommand.java b/usecase/src/main/java/blisgo/usecase/request/dogam/DogamCommand.java new file mode 100644 index 0000000..f3f1f50 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/dogam/DogamCommand.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.dogam; + +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface DogamCommand { + boolean addDogam(AddDogam command); + + boolean removeDogam(RemoveDogam command); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/dogam/DogamQuery.java b/usecase/src/main/java/blisgo/usecase/request/dogam/DogamQuery.java new file mode 100644 index 0000000..105aea4 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/dogam/DogamQuery.java @@ -0,0 +1,7 @@ +package blisgo.usecase.request.dogam; + +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface DogamQuery { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/dogam/GetDogam.java b/usecase/src/main/java/blisgo/usecase/request/dogam/GetDogam.java new file mode 100644 index 0000000..41b18ce --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/dogam/GetDogam.java @@ -0,0 +1,14 @@ +package blisgo.usecase.request.dogam; + +import lombok.Builder; +import org.springframework.data.domain.Pageable; + +import java.time.LocalDateTime; + +@Builder +public record GetDogam( + String email, + Pageable pageable, + LocalDateTime lastDogamCreatedDate +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/dogam/RemoveDogam.java b/usecase/src/main/java/blisgo/usecase/request/dogam/RemoveDogam.java new file mode 100644 index 0000000..2224601 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/dogam/RemoveDogam.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.dogam; + +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record RemoveDogam( + UUID memberId, + Long wasteId +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/AddMember.java b/usecase/src/main/java/blisgo/usecase/request/member/AddMember.java new file mode 100644 index 0000000..1bfa12c --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/AddMember.java @@ -0,0 +1,8 @@ +package blisgo.usecase.request.member; + +public record AddMember( + String email, + String name, + String picture +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/GetMember.java b/usecase/src/main/java/blisgo/usecase/request/member/GetMember.java new file mode 100644 index 0000000..3fd53ba --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/GetMember.java @@ -0,0 +1,9 @@ +package blisgo.usecase.request.member; + +import lombok.Builder; + +@Builder +public record GetMember( + String email +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/MemberCommand.java b/usecase/src/main/java/blisgo/usecase/request/member/MemberCommand.java new file mode 100644 index 0000000..341af9b --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/MemberCommand.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.member; + +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface MemberCommand { + boolean addMember(AddMember command); + + boolean updateMember(UpdateMember command); + + boolean removeMember(RemoveMember command); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/MemberQuery.java b/usecase/src/main/java/blisgo/usecase/request/member/MemberQuery.java new file mode 100644 index 0000000..65fe3e1 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/MemberQuery.java @@ -0,0 +1,9 @@ +package blisgo.usecase.request.member; + +import blisgo.domain.member.Member; +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface MemberQuery { + Member getMember(GetMember getMemberQuery); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/RemoveMember.java b/usecase/src/main/java/blisgo/usecase/request/member/RemoveMember.java new file mode 100644 index 0000000..4492f3c --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/RemoveMember.java @@ -0,0 +1,9 @@ +package blisgo.usecase.request.member; + +import lombok.Builder; + +@Builder +public record RemoveMember( + String email +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/member/UpdateMember.java b/usecase/src/main/java/blisgo/usecase/request/member/UpdateMember.java new file mode 100644 index 0000000..93804c9 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/member/UpdateMember.java @@ -0,0 +1,11 @@ +package blisgo.usecase.request.member; + +import lombok.Builder; + +@Builder +public record UpdateMember( + String email, + String name, + String picture +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/AddPost.java b/usecase/src/main/java/blisgo/usecase/request/post/AddPost.java new file mode 100644 index 0000000..51d312d --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/AddPost.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.post; + +import lombok.Builder; + +@Builder +public record AddPost( + String title, + String content +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/GetPost.java b/usecase/src/main/java/blisgo/usecase/request/post/GetPost.java new file mode 100644 index 0000000..f6a819c --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/GetPost.java @@ -0,0 +1,11 @@ +package blisgo.usecase.request.post; + +import lombok.Builder; +import org.springframework.data.domain.Pageable; + +@Builder +public record GetPost( + Long postId, + Pageable pageable +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/PostCommand.java b/usecase/src/main/java/blisgo/usecase/request/post/PostCommand.java new file mode 100644 index 0000000..228dfa3 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/PostCommand.java @@ -0,0 +1,14 @@ +package blisgo.usecase.request.post; + +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface PostCommand { + boolean addPost(AddPost command); + + boolean updatePost(UpdatePost command); + + boolean removePost(RemovePost command); + + boolean like(PostLike command); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/PostLike.java b/usecase/src/main/java/blisgo/usecase/request/post/PostLike.java new file mode 100644 index 0000000..243d8bd --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/PostLike.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.post; + +import lombok.Builder; + +@Builder +public record PostLike( + Long postId, + Boolean isLike +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/PostQuery.java b/usecase/src/main/java/blisgo/usecase/request/post/PostQuery.java new file mode 100644 index 0000000..0a2a134 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/PostQuery.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.post; + +import blisgo.domain.community.Post; +import org.jmolecules.architecture.hexagonal.PrimaryPort; +import org.springframework.data.domain.Slice; + +@PrimaryPort +public interface PostQuery { + Post getPost(GetPost query); + + Slice getPosts(GetPost query); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/RemovePost.java b/usecase/src/main/java/blisgo/usecase/request/post/RemovePost.java new file mode 100644 index 0000000..a40fa92 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/RemovePost.java @@ -0,0 +1,9 @@ +package blisgo.usecase.request.post; + +import lombok.Builder; + +@Builder +public record RemovePost( + Long postId +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/post/UpdatePost.java b/usecase/src/main/java/blisgo/usecase/request/post/UpdatePost.java new file mode 100644 index 0000000..9241bfd --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/post/UpdatePost.java @@ -0,0 +1,11 @@ +package blisgo.usecase.request.post; + +import lombok.Builder; + +@Builder(toBuilder = true) +public record UpdatePost( + Long postId, + String title, + String content +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/reply/AddReply.java b/usecase/src/main/java/blisgo/usecase/request/reply/AddReply.java new file mode 100644 index 0000000..0e96d2e --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/reply/AddReply.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.reply; + +import lombok.Builder; + +@Builder +public record AddReply( + Long postId, + String content +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/reply/GetReply.java b/usecase/src/main/java/blisgo/usecase/request/reply/GetReply.java new file mode 100644 index 0000000..defdbc5 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/reply/GetReply.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.reply; + +import lombok.Builder; +import org.springframework.data.domain.Pageable; + +@Builder +public record GetReply( + Long postId, + Long lastReplyId, + Pageable pageable +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/reply/RemoveReply.java b/usecase/src/main/java/blisgo/usecase/request/reply/RemoveReply.java new file mode 100644 index 0000000..4e03f16 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/reply/RemoveReply.java @@ -0,0 +1,9 @@ +package blisgo.usecase.request.reply; + +import lombok.Builder; + +@Builder +public record RemoveReply( + Long replyId +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/reply/ReplyCommand.java b/usecase/src/main/java/blisgo/usecase/request/reply/ReplyCommand.java new file mode 100644 index 0000000..009d4e8 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/reply/ReplyCommand.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.reply; + +import org.jmolecules.architecture.hexagonal.PrimaryPort; + +@PrimaryPort +public interface ReplyCommand { + boolean addReply(AddReply command); + + boolean removeReply(RemoveReply command); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/reply/ReplyQuery.java b/usecase/src/main/java/blisgo/usecase/request/reply/ReplyQuery.java new file mode 100644 index 0000000..932a9c5 --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/reply/ReplyQuery.java @@ -0,0 +1,10 @@ +package blisgo.usecase.request.reply; + +import blisgo.domain.community.Reply; +import org.jmolecules.architecture.hexagonal.PrimaryPort; +import org.springframework.data.domain.Slice; + +@PrimaryPort +public interface ReplyQuery { + Slice getReplies(GetReply query); +} diff --git a/usecase/src/main/java/blisgo/usecase/request/waste/GetWaste.java b/usecase/src/main/java/blisgo/usecase/request/waste/GetWaste.java new file mode 100644 index 0000000..0557a9d --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/waste/GetWaste.java @@ -0,0 +1,12 @@ +package blisgo.usecase.request.waste; + +import lombok.Builder; +import org.springframework.data.domain.Pageable; + +@Builder +public record GetWaste( + Pageable pageable, + Long wasteId, + Long lastWasteId +) { +} diff --git a/usecase/src/main/java/blisgo/usecase/request/waste/WasteQuery.java b/usecase/src/main/java/blisgo/usecase/request/waste/WasteQuery.java new file mode 100644 index 0000000..ef2819e --- /dev/null +++ b/usecase/src/main/java/blisgo/usecase/request/waste/WasteQuery.java @@ -0,0 +1,25 @@ +package blisgo.usecase.request.waste; + +import blisgo.domain.dictionary.Waste; +import blisgo.domain.dictionary.vo.Category; +import blisgo.domain.dictionary.vo.Guide; +import blisgo.usecase.request.dogam.GetDogam; +import org.jmolecules.architecture.hexagonal.PrimaryPort; +import org.springframework.data.domain.Slice; + +import java.util.List; + +@PrimaryPort +public interface WasteQuery { + Slice getWastes(GetWaste query); + + Waste getWaste(GetWaste query); + + List getGuides(List categories); + + Slice getWastesFromDogam(GetDogam query); + + List getWastesRelated(List categories); + + +} diff --git "a/\353\266\204\353\246\254\343\205\205\343\204\261V4.bsdesign" "b/\353\266\204\353\246\254\343\205\205\343\204\261V4.bsdesign" new file mode 100644 index 0000000000000000000000000000000000000000..16886fcf4c762db2379c1067bf7629fe7cf1a64b GIT binary patch literal 220663 zcmV(yKVvN@%sOl=$=CWaL^AYpsa* zBEF5y{JY=p`MlKQ@cqvz_$S}5b)PS5+)v;C9428Hp-2)zDU|rh_gTKwfsn0~0s_(ZqcZL*(~A`F@D|{GRu#fAgom z`k(&Q|MU0%{{Qo*|C^89@+Du_dMKAK&1;o^4f@eUmKX8Xt@oJqoWABJTixAbzyFh; zeBZpcd_MiZSUUPM@+aR{d7M3eM_XL1`TTW}j>DP{>#gBG>*}HXZqB=3{PO!g9_r%W z>@UCnuA1}WmVkdD`dPD#!!1weaaqQ>F6-g`cw6$HrgNU%s_M8~e);`>{+ehdlkfigzx%I#{ZIerU;X1h`|i*G+kg10fBwJx z`9J!1-~H@XO(z_7DHzum9P< z`|i*Ghkx?xfBrxI`k(*f?|%I+{_M~H$)Ejl;Oiysy7Bn=ci`XrS+(}v-}p=rRU z-e+~X-rkDm6Z}E*um6jGb*udIfADXA^)LUg?{3YvnO_didd>TI`uTU&x=zc_K``m+ zr5t~@O+TCCx;x_YXYn+F%MZhT_UXI(VEcTHzyJB)`n!J-Dc^$aC*QaE`7Mr?bgri_ z+qdkuUiu*vfAz2b^{@ZUpMCeMfApun{-^)?SO4q3{kE!q@u#{$;qyNV zVqXwejq_^!(T|dn8@qA-O7!B}>kG}kQ0@=KS-nhM{I#_>}_j(ta&gzE5EJ%|3oS(B)fld_z^3_`t;1^f~>V1OF!d zcHF-~+i%_he-LGNSs1>c_8YJsb+%S_fgrvxw=S#o>-tZ={PfKNihNMy4=j9>{xvP2 z$Zsv6$Zsvc6!f{@f4GYu7_aEB%LH^gZL;ucp?wjA*`7zx8 zz|QZc!GE}&d&Y0=+&6#n73*DmPx$%w?f9kWTiX6XtnPJwe8tyqi_T-^l z{Z=oBt?TXp{o3bUw7;tR^3xwe^-kh=7>D|vuHB}VKbD_A!rUKEx*tFE9PLNk{r8rU zuL6E2U7A;8m)*_8ZR#s&=3DJC&h3|LZhi4`H!0ti@$KxtUHymzUz__(ce?(?+U~_y zb(hWg@Ga$j9QLC_e{b}Ukn+cd|86$^i28N@RrWPk3R!npdhXkV z4s!eo@({Yuq^wGNkIB#s)%tFWQKJb1w$pn0jPQN4*snEc`qOh*pRbK9GOR>#{Dab%SZ{UyesgrIUH@c??zM^_Wo@LE^UFn4m<2HpK4|{`qZe9aANc&Y;V6{N)9^wbE zKN4ftJ{|-^pc@4tw1cvA)qtI!kwL~%`rdJ>r9Z?p&!Zt>3QN5FLx{Kz7_>&*Pyu&n z_ayH53^;1i<9ZGJ2aVMD^*Tg;b1bGp&~#Phhkn*U6uOpWMxoRKcNl;xM@9>P$wFkqZEbi+D`2wf4Lbz%`pw;W(%C){~UHJS)uJ0M1)G09R90 zvS54okE_%gVLEA}a=TCiWrCcXB`uu3KvGl*hOHpAmmaWHv-PjMe{HUoUSR2eQpS_D zWX&L>ryA#)3%%kBlOd0`D-Jf&B)J*t7rNN5V%{Of?>I%Fv7x|d_A?|PFMPZ+jMH7? zbdieVEpQH*;YVxsgW;GnA?9|g0-EIY(fH7I@a0e|w%@Dw@RERMh83o9W`(a(Q5V(^ z#{Xm;O4?%d9sY@tp%E7yd<)UeirxDb07&D^4#|%d%8k@7(!=95E$q#yi zKcDMKiG9g2;s-*6IhlEzl9h&)V&r2p=9NAm=DmR(zH_gtBfNGq4#4c8SqKumm`KE8 z_kK>;VT89Um!#SrZ+E`jo)%{D@e<0AXaZex+gr!M%c8s0FV6w7<84XNa@6=s+xu(E z5)I=g0||_Uphapq3r+_i7MN$K?jgw|^&=>z7-@*uU^q0hGC7_{h;ZKi>=G)K9LMkm z8dguPEPdwynu>?zq=vHP8hLQ<3wHrf(4GNJ6j|akNUuyemAoW=qtfR}Uio^4NLsvr z1!MuXTlvJm31r$4#>O!oCf74?_{xODB52+|D0wi5fC5>%F-(qEZhuRD#qn@qZk4hu zfANbOi;B9-pY?U)9)*#=&p-(RrYQO*p%je$ zj`EEl`jFs&Hfy5nE62$;6LwV>K)wU1+RN{@IesAJ-CjceYfn}JMT*24!Koobhi3=fn7r3R6DbTEs)*pd{d zuWK-K2WKkz{ce5k4UP)^ChAO8gHe&66GNAZI>ij57P7OHta7~{?lNEbV@X~2B+G>Y zU+p8eLmY!LkuO2ZG7%*YdN|iw&ExozzoCjFr)Q7KoBxs%XSMP@GG9mxDHfJyy4k)C z-kS#ejrbOHvEuXW#E_aDd#qTYY3)>Yld7R?OvgwGkzBk&*Py0$5*qx3z>9?v-=w`B zqQ-L9^F=?=c`94G1E3zYQm%M^F60S3FUjn1IbxS6dYac~e-Pk4!~8zwL5rY%RE*qm z2D(2XB1!ZjY>dB z$+fIEXB$g!_=a^L`MbJZhWgCkSd4#v5fldap+@rsV-3MWE;UptE7Bo z4<|;%R?fUTk{6e6{doo_d~XHT-w1`<#I)XZ@3XEh`?)n@LoLL5u+G^k2p51KNciU<2 z39DQ9(sv*3p{_{lt8bE@3I3EAbRWtK@my7YD{-8xB|sf5X4lqq?`NWS&Uyttc6cUk zte#f4A2$cTe1Q*e4>B|VVzRV-H?z2DA$q4he?1>u4+jq_gPNp>L{v{6HOD+Z&NM4M z3C-084rc_beUu6v-XWG5fw)t5JSeKt@kzoOuF0Lyst^+A zSr!Up=?wppLR>dTI)ihM$fV)25jG&{)jvNtWO*b^@&{)$4w=75Rj)oo^niUbeQ}gL zIURLjSJGY`+Ke4rpx%SjJW;GEc9$*1kgOS(ByJsfeQ>a)qpU>_3gvEXwcw(y+f?4X zsePCYcAMY)5#sVWgpUF|YOCfA9@ z;W%tNXck}4h=PscH27R9MDX4R?5v+YjX!L9ba2-FOdh~9RMYShbPJx1vMe**ueRj$fo8y^DHZv?#I|QV{;$Ygt zv(Bs$p>2YDsDsy|kmIJDEK}lK46vWN;425ra$-dHL7GSe^J$ObpNcCM$BQP|=VhR_s>+VQ7OgW`@ z-3~ke4wSTB_}Vd)9VGLON3Ucaef?m#2XlrkM%1hPMs&g!`ga0kM1k%PuvI@;D?7!i zPO3T)N*QbqT$zrh234VR+ldMr8m)#LN86ImsWN!yE&B2S1Zp%A4;9Jwx(C?f&8}gEOT3RaoveZ^l`Uocz&CB2U+P16bizWRl90i` z9OdWO0iQh?zzYI;1%ur;5%q9YYZ5!Fu-Lhe=8R%b_5#1CnQMUGj67uHr>5Ed8K84H zfK@m=4Q5E@Ccx|k(mwp*Klk`N^B|l$DpnOxlCUb||?8{S;JHQj0%uLpQfr z7mOmV!CFFR=Q8^lqBtUJJP7U>WfNcoEauGs?lRA`3t4dd8ut+Pw6?M$kZqZBmA$O8 zsEA!9s`0^A-5_$a$+Q&Y5Kmz5lLBEG6`<(~K$2{IykaVESc)7hl0M0WN)Xy54n@$V z`Cie~DkKn)6L3|G6eYMZAedvsPY!7xN1{G@M#P?cNCduM*0?cejCA^f?|*1wuYfnU z&8s{;anfQ8;EvLlK6dF#*TeKcs!ByC!Ao(ep^p3pXdGMyl80+^=bj>l?aHoO0aQmw zzL6{It-2R*480t8x16?4raT(?Onpn(ChXEZ;kAYDa;#a%MMj6f(?b=36HbP0o9)|o znok!2V}NQqWjw~}Z>41Ev7xocGoZAYuG-HLyvH70zhebGdCfWXI-$5$w^Ik(7#5Ki3FEj zV7K4LvKMQ3ylK43IK1m@e6;LRJUq2wZ$L5WSP7ez777Y@&S?Hz!N&-|Bl1KM-KUe2 zN8=r?*Mzy|!O))V#P6aPy%P+}Uv6!Q0knrulkX>FFNf(ZYXXLqb%g=8iv&r}m1jud z-jy|8XP6-GYtd19z@F{`O_ud>=zDhSZG=7f8G0NLIoOp*$6Q4Dj|B~3QG0IlvL`=usJ zC@Zx7BrE2X;?NXp#=(+c&@I&NR|AZB)bNh6&Gg!NnbH&L25YFaN{U9-c5$G-H`DZ{ zBEd99;?>&{^j1OVBs6M4t|b0SkxytZgfHZ$=Ltjm;%JwuWeP)@Z)b%SCpbB9od~J7W+KbJo12riHxW zqr00i+0AD=ofD2ib$dzZ-K*Bys=jGQw4_gy>-wh~2G;d~I2PCm6lSt8@g~6(0Rb>Q z>&=r7WQSvd(7d@|cp$+;z8D^n2TsiT9x-084{Vsk6(}6_G}G3C-tg|KubA^}ief4cbg3H98igXx+uf#2N7$Fgi~?fo z1~Qi6YtBf&9(5|d*%N)p0o1Osg>=p1co0axC;M4>i}{iePaC}|t7PA{Bd6|%_%%Ox zJbJ?{Z5vEVgIwiS{jO?>RB~ILJo)zqP~in8=(9H=6BhBFuc@w(lI(Z8tZ9QJBa`EgyPHCf6i8%a zQJL50B82$pId~bxDlOTqTqruCw`%nK(&6p?VL2%5vuzBU$GHk_$FpGVsf@+2?}_uY zM-=UZZbTMpU1yoTuO~9eNXV$6S3g_<(X{~$iBBYe!f2lF;2>Ws2>~pZiD`c{`fD=z z^?KSV0-5wAek|y&_{-8Dvysj|ph9@T11m)I$O>g^@V-&2WgLjx-p-=~O0gHkjnW3` zv1>_7Z;NWX?^nGDmApjn9GDl0jaa{+tZ{i2$f#@%@~mTQEdsEvlBKcSpmu>*oJ+{f zL_9*4mECGuc{+J;YA(-OCF_mP3Gm@Ds=uT-X~J7i?57@ zWj}?FN}1@MJ)};TUU|Hp2r%;~5!GjFbm%1aArrgur(<{asi?*$a$vxV3(9EAXgb&$Z6?b(IGJf!xeHKGslmJXZ@31h(!}i9*^aUDx7?=?w%#*HfUS90o zig|WQn5Y)Cw>B0FF03YCZpXjc@auS7M08$EMPa)>XP~HYuYDTmLSDxxEyQusP$0U< z%ip8N=sXrL8`#Q9sC35^H(y_+8jE~OlIe(Az;1})5IXBaYm-g9bOinEN2{LF6Des` z%Q3>;S&xKZhOGFp6M{{n0iDD#=Sa{MNp;VFlN>>x3t#r!N0av+JRx&UO{K_~IB)V- zD0r9*2JYSBea_dkw{#KJsS?9r4I9KX8h&S!FOA!J;gvkE#SfnKX(*5q1q(I>sevEp z%{UzJEuCp6otTr0q=r*oHZPA?h*G(wCYLf}Y`O=BGX&Z2;U;^zBc5!oY8E#b-5vX* zK_;faC@nqr4!e}FYom{*Y*v;w3L#r6PS|)&_A+ub4s2{x09r0Az#S-C?`2|i)nbk% z-qgE-4h!ws!>Ql3E4m^8^*2yh4Oog>rd8EfM0Oc!M~sofqh6S6?@f8WF>`J7Ud2EB z(0S$02e7`(&n5ArEQZYM5V5VoRZ&h%T2G~g(5o#Go_1SOaJ-I)c7zZ@KQ766B8Ia_ z)x{|XC7I1Oo&c%Nc~m&lTScXa8&+vq8PGqH!Rxe+eYPGXV+^46^g=TmUzfK!8UQc z1Ziq+GX!j;YeID%xK4)LIJMgX$hBKPU?{u!-;j;~Su}6C&En`G(O!1;2;>(HPw5?} z`*28tE&Oh)_mtxHMhQHYxXES;W#U5;SmTNPY4Av;l++YKs%QtFm0`9tYTbZn(BIQa^%6}#;;il#{MN`tz{Sk zq$*D|vm)Rrh`~(ujrT@v?|qkrrW&mDP`&wsLLhl3 zb9a?XCGV`2P|UTQ&kxQ4RK{l`nO6~c9=XmFi5q#))l5FuLm}7^Ue1)$VFgO7-6L0m zNihC&KqhM=W#8ONJY=qmHzqhzQrT!TvsB8hW_VxBp=6x#e^P5r)6*E ziIQ42LGdL$fV*0(;27ytDIkK0>=qX$#Q7w5So$y@`}wx$n7TXF=QPIYI3pmQXnr7XXKxKG-HpUcUbKLFj@LQEWgWFX z<1dCvbmHb|4J+uYn0=ZXQzcnHdrov5 zAM^PUL4?X;zykX~%9)A_*kKtMY;#D^B9{@B5-jF;*bj|3V)do8RV>zX>puZz@PRV-j$J$F*^0 z4@e=d$Vcm8r^dztKhhVV%#E1hiUzBSsf#^mzscEYC`URvZ00I@iI7+%4F>@zpc5{J zRm)Im0!ewRZ4EYI1P&sg^o(>4irPQy&8pd<9DHxZ>>;KFNz(=v)?#PP&yO5^7EZO% zH%#KS zDkq?0IZvrzksu*7S0U`A8f6&e_tDd&mgiX~=O-EKF7e;$LoDusnWH@rO$tykha~jV zqr~5y8Nx3Q(#B)s>nG2pHm5o#Fs+4pGymX+*QvN>O zF$TvpIb&@Gi=t0Rej43p`eZ)`W{Eje#9}t8zIV0#V&ziv3TjcY?=a*$ll34L^;hk! zPnJtUMO4bc3uJLjH|k=0)1d!|MH_nFZ7V`hdOfPr zK(YlH_%&P2@y67pLRJPEFF_m89Ne_WPM&F%YH})@&!u2PR1;8nbQXhv^8j=iHePw3 zG-Pv->Dk+xqb9=LTkYf3`gPda()*;OPd_+7(4#(-y`QrfN`=*-7Ot%Cn~rvDLuS|p zVBoWpN&KVhwmuF;b1eaXi7?Qa5yzqLx}1>{qnGA&a0cpgiut5G`gkI{yX3N*blMC4 zAY}p@>G(Oi5e}05b*1mEKq+{qlWpJ!{Yau()3J~wGGH$<#fOgOC`lSP=A-i`$E*+X zAx(gHSE8FmU+6%aI9RXy=N-@p%eti$*v`swI^Rw7=rV|b@OVGX{#pvHxh@v8OYhNrfeeQ$cGM+R*BWz(;*6*JjioK`wP{RU*8J;Kx&24qgWDfHg!GbN0 z`v>mID|p(>dYTvls9P^rD2f+?zoo>(;V^)Dg28IJCsiCH{lPoFdcLQ8>mGD&cBS6W ztI0$R&=&mp@zDwdKIwV7{VKQSUKkarb=@Yt+a!5AGFhn=qFIeA+_a^^Tz0b(Xkb@2 z<3T%2`^`Hp!#xMWLpwa7;nt@jcOfO%?RgM;_svEP**Vo_xXA-uVpBZf$U&A+NGs_S zO2R8vD65Lyop;p%c3;*SJCDIA-;dz6X84BbV>V8bBsi}we7+&}QRm?{4ZQHN%QcO9 z$I{*|jON3OAJmd>y`~%qYw&^bJ_qEQP-|IovZ~)XqD^?;g^pBw`?U>q=IBG% z_l-&HocW=2b?c<}XjA;i#!U6TTs#`g_Jt44eKR)+_~^@yDpR)OU?8;z!`3aET9#dc z66Z3XkYv;nj6V{`bmGbkgctwh$P2B$ekJk>v6h$U)QrUJ;&MN#!_Flfr8qdW^96L? za9d&GjZ?UzT*O$7UJ#zhuGwdYvaZL;jd5P#w&)Ccb~7u-gXrz3sz*xjaSC%6S3Rmu zj7 zdchN@!%rP_lQ42{QT1?Bh1%lIEjM{CC&3I)FiQ~Y32nwj`xy`@g<9O5M_nNf{D`#* zlf77wAKa?8-J9E&H*q>~B2Ea|J|EP?+6#h5-01)v;!*4?iWc+0TtpNzHN2Z-{IIQc zjy1aNS3#QIFYc+Acs&|1(QYErsEm8GS>n~Rn@&Q_KKoB!^E0(RU;=uEL@c-mp2YHv z!*5rcRc!G~uU4dW4&w}sn_6Dph*-$>fk;rTSd~~l1xf9Ul8y5d)yix3+#p_WDt4m>g0+33`|}#LtbtDs3>P8%GRMYS+k^G+g2$essyvz8r2I@7VU_ zlA_U0<7Q*r^UCXYUu1&EYu(}_d`ibU+Pg(QTzl8NjPOqVZe^2Dm3R`!T092(BBkR} zZChnRn%DCoTcqDT?ZT>yrN=Tk#JoKJP~<*1wcG_30K;i}9Crn3G*}YmqnJD@s+iMB zQ=pd9rmY@k$Zf1aKVF?nZJ3xLp*aFswYh0PP@H0%?gPTIn-#;@cw8?bdn{p2&FWJ> zr_F_0osR^t=*LTo+L9^A%kIaK6Q0%)*UzdtqJuYRZRjisKm;6^@WoYW7y`sd)po%H zoGltETyiNg|DbLKr^DxHB6HcCj>Y2Rfk!oooR5<1mmT=j=Vx9oC*Y$Vkp+W#S)_(g z)uni_I(s$6Ep>Zg(Qt~4Qug6PcBdZH30roN$se6N?bY>Ecvh%w^5L6@PIpM8S0xwD z>10=KG|VG!K>R!Zcn|e)yB(==ggZT2@@*lp#blI>A$*%hYTj9LM_f4CSQ1jX`bJ`? z)S8%?beD+IsuX>75jHup57S-*jp;=u~ zV(RPeNWcDOCOil(S4TSQJabba$9P~xxsH2^unv}Yod_#o^*UZF!&i&;TxF0L@n@QK z5Ad@_LnP}CEplo@Ow;N-qR!x}u+lSo#}uwK;OJ#M`KayA1e$0~X__(kd~&|@jVf98 z^Ne>6d<>kttmDRSd0!<2ydPnv>BKXE)cgpS&v;-8t-aRDhf$$Kw3WfKFe2NF%HD?z zNufbQy#TPjundRYw<^-@wyh)LZkRi5Qs=J9;hKV83jEFYMW$TF4fyT6TmW zItr_aS=jRy>cOV~jy%GIKzUFKz;Jpc8tS+R@^G!?h7B%LwE7%1mFu%|6ySJ!KCkn6A-xXocQsm;fGM|zf#EjJ~D21W3L zKt`!6e2w#VC5_*(8LUQt0Z8TK#m%Oww~Y({=xtxbyfd3#>17CvcVrXXET?sfz{LPQ^pr6F>5vzdxDfpc?G9@yBo z$5v&JT3g?t00o1C(44R;f#b1x1iOdJnLSYYE#GbDWHrSVgd!w-wX3ID(NC*Vik?>a zx>g?v1TKY$VO@n2PY&>L6nK7UmmNG%i)=S*#$3qxdbB>x=}&c>y7Y0k0{QaVE6wX9 z6{uXbho}^Sw+e^W!)4C8!B2^69fo1l*6Re@f9lP91jTJOS_8aeSU^cnl^=l8c<6K- zWETy_lfY=@)nQyluXAuJSN@CS5VkzTzJrU4O* zN^(R}u?o|J1i%ILu*d$gLfTv2@OmN=TMcgyn%s@zDwi(W3W6w$WIsNcTOSuKEQ#iQ zht{#hDPFP$7A~PU^u}3yRjm;c1PO~s*uA(nI=8h+s>WyJ`a86_qQ)=sUg}cw{8njY zfV0M{kKA|6&8dJWGi=GLx#vLc+T!uqZtlYB6*1VoB@s#v?EL2NhTeHKtur}p4t23+9<>)xAVG)@MHkdpm z{E}KvP66Unp&tRa;Pv%%2IrVG)k2)vJJBIHkzU|$du~@_FU5Pb7_3Yd9Nz*v`kv{NG+xFNZ1MDG*%Yk zh-Bodj#^jWoMa%iv7WtW`N;n>G_YyTJj}L8i3KaHi zoMN|1q;#MY37B;vaEAmFc>&cn1bt|zY|}`F(k$BYPNZRJ7W`@Kw%M32T$XHJgi*M1 z>06u0w~#vKnG~R);cc}9y^aE_0ag2OYG^Bj56@Gr3z$=w_MUs=suYxY1H?956Ko>g z8@Io@6+kk5+Br z-dTI|eCy=Ub$LTs@5~5!y4MiV^dLJUS!%B7yT>(?#$aPeVB&Y;zcCe4t6FPk#GTi! z3b?7mviRDS@IEpL1kstx#(5shTryz^pguTx63_zp%@sWfXjnoN1oR3Fu2-j$FtpZt zZHjz~;@gRKgE#CMfq|Xa?%ey`UeE*9K%j_MeROS<>Y&!iTJ?dQADx)E5y|ti8f$z> zgHn7Y%yk|c^ST*X&7HgKlhYPmVOg3HKr?CI-?h@>a(wT^D~&;(Q!WCSg#keJ>m*#N z(ts)A2eB|MXFMVT)w9ZENE=iI0!NSp1Z_pku_#LN z*VA*6jS5k+k+8=K#w6dGE5rki^q@OBgrlh&@$4?WP)b>Q$9f#>zmPkOuq+v7^8kIz z0Z3C4ip6%*U0BS!E`J`M^@e?o*ui8FACE(vgycw>_klh10!4{Ze>Ki%>Zt{(xT9S7 zb15^_c$7f#d0u`8f+Z-E2N#)WEyKwQY4dw83wq;c4%9OvVLtM-*R=Tpnd1G~%oB5_ zn}MKLYaKiI7)=uhpJE^OQq^D2gyQMrJ@NY<{gHD6yk-o zu3ma7%Zzz41A5E{xQkA&jUr8i4M79^0a_wl=KG?V50xRhD2TL z<8>$5`M?+Ufvx9*vs>tyf3o4Cc`|}f%o0VP0s#9BD8U5*ZMGDhsn-GIt7F+HnP=sg z89UcS&1pMs0$_4Ds+ug;(*y-9Z3uNR32)TL$z>E3=9fyQ?2{qP7{43*uui!Z$kH^{ z4l%g4?6SilN=^{5eBjE#I$?) z{!kv5!@$c2#*k-8xu{-pFGX=x&aDq546X{gTTrb4$MuOu>)RD5lElwc(r&-59mx-c zf-kR25o(3AB6`dO?~2nmo%4VrCHybje{CZw~+dPY4Izu7H+9393EIdV+R zG(KUDl1B(;X;M1TxPN`zqkgTdgoLxw&Be*X_zZ|?tDogaL_FcuGnfK*8_g~yqI8<= zW!(CVbT}Ip@X3rdyKsac=*ju_+8d&6o{qTr!{}ItB3J%AXzx{dkJ+ojYFmGF~(goF~b=c7_Q z8dHOwt)PHgTe+(NgNH;^-t(y(V~MyXOHME`bobOlY!&Q}Bq>;tf; zr(4C`(~(7G-FjIl72@!zinWVgnel8Wkou{2GEkYP*7XrCR>+yEr(L-*@TB=LkFZ~`(x(LO(P2m#B4tcj#UFp-%knNq&eFZZbXuy9AGiCAbmQw7F05%` ze3fMoE1*kR_`EdWn}pvlI1~IZ6O281!Cf-gjE&G+*868B`mHQwQzn+>?>-xOBihTk zQ#UzT+ilY_{O$NtQpKQT_UIiSxJLEAbakss7$KNc>0i zl&b!9%QHVbrOH14KjzL`$6>BH!xzMYIhD*&%(-LEIf&xboBRC+Y#26RxN@N_b|oI} zoSAo?7u1lb^p*cNQ>yLXlxp0wS=bi9|9MKaWW*v0zA}v_0}di+wdgv8YEEpk?u8)2 zz7y5>Q41mN{1K=)N!=Y*kLxoHC55dwLCB=q7jx0fFhz02qmGNII0(>uUaJ;<<`Y0O zbclwd%xEw+D+86UH^+_BDvR89aJ@9~E_7e^uq7?fXI*pG!O#!Yk@H4l0_{B!UT3l# zxWT&-)CRzQNe*_90I+zT3TNnM{t)lSBb-rpaZC$jlembx3aE6qnc<36 z@quT^;n|Ho8%XTKnawdUf}ugoDC4$r&&@-u`S(+%e0-cLS^4(&#ciljKWHtd@#Qbb%W@KDH)gN2 zs-oolF?#ysRTqO~Ab=tBghO}YXi+5JlCpm!6q0hWFg} z7>rw@P-vii4;omU$QdoqZ@wpVI&qA@E!~3WHLc*YIq``yd7x?7&F2lz#b@EfswYpH z$68dl>#xkI&=U->=h- zid#tt)_r7C1-ID0Ufm&%Tfea(eX(70V?1W?mUi{!GoVuQ(yn=*J#;Mi5`&%+XV339 z0nWaLKM!9ZPg~c*6)=xt@n%egq(uYtQJdpTqUgEZ5{tX6#=bEs_Ls;D1t#mYrha~x zo~EFMKllU2OE-SQYno*LC&KqP+!k^5{ofb%43)t0w4z!x38ucaI7W)Ez9sn>{bpK- z31+@&`+Nz}w$35Qr=GNZ{4Np8QA^$Zu}J!eZfXe#VqB2CV(JJ=44r#jye@V=vk!SI zx81W+NNxz4^x>9|WNtS5h}dufwF8C)*EUp>%0=-Ba0&77vDMR_iUIEHzRh0f>v&VT z;0^Fs>dS1>SZ68EKSB|Yb?@9S#QrrRWlWk@&Z zB6@C0{)9`Vgs|=lAJ|RupT|5@ZD{x}51DfTQ?NTe#=)~8LDABKG{Mri}Q`lRb` zu+Zt_cva0>8O-SOL2ljMeGqS7f>i7KoBtMf1e5(~3CI4^<2!g84L|DeyT;OhL9XN; zTDxOVe34)Efpn5I7!kImvQ8mT;et0km0<_4zA z){?@Ek$%7&a83n1BddTBSr5L*Uwc<{Y;>JQqXt z8ufAC>t%G}(T{YKkmhT{qZic{v=PR^p;llvV^|e_=JYav$0y!B{F|w zqJFBlV_i!|9xWn1FDmf&i^3kr@RuR)&_&46VI2mvJh=m2muZigSuVj>WmLw-%!+!YeJq0Oz2Ng6s(8?lh3 zm6Yg;CDOITd>>`Mp7|n>LLE|~-KbxX7xj$aSRMb6{DfUlIXM34Ghg~x#X}^-9mur% zozGWn17k2@Df@m+iPq;Wr6jUGG;74-DPn2bBdc$cfw|`T)thL;?CD-71Yco)24Dl< z+*Oj@$8={&QkzG0tj+fVzcQm6dK%2|#KI5+e~s4i(sUo1DT&{H18snw3i_Rtkm}M& z7>K3y8ht{>WJes6W@0K#AuUxcuC3?EIK9_c7J+3-;B`zTw_u6~txoSmZS+UGYlVaX zIfYI(g@=5YiW@#8AloS|^}yF;Gq|q$Pp4EKU)V zLlva#7QdC@wt&P%Gg5j%Z0jX=AJi)D8Ub6eh_e@ZH30G10{8H7>26H)a%S9hyPs%J z$GX|=*W7KItGR}r@1~>JC{u^&`C`G9rE^%`Uu}RplZxQ>O{ATP`rUOgK@ED-Kj|#V z)OA9afgteJqr0FyuQPuW%~X^?)q7i$bCa`+=85;zYWkkgG|l0}!Dxm-WVtZ>y(dow zliR&s@r_@V%x4sdY~#);GmuZ}i=90<`q0S>-n4I=Rl^sUPsO{<-D^&fMsIIbgm+RrW#zTD14zf-InA0noJ3th=LBXs5?jCuA z=}jUP^4RWz-QMTn_fN9Z&zXtPz6ARVXlIf>bFlLa0i ziJs{&`?hqVD)K0_dp>t?V!F2143=S0Log3G%#WnGaprk}{1iQQ*J}(PRJsdAg|5Qe zpi;HZZF}M;IV+)&_VMtG)EOm`9oHtUe=gr;&R1qtn1Rt;*9Pkskh`40yv7Fh9pmC) z9u`};qav%qP?QFJ=<7=1N44GkBYoWAp9yTTr{GSKbfg6b{QG#x!4HI8+lv|iC-AJ{ zVJ69)^IZ92JJ{srQmm~o1h(6(frU*-V7Cv;$>pGvn_73*Ou&=S6YjuH%&bSK$k;8_ zBXvb=tE(i&uS?5dAjW|n4J}UuV4t*Np&c=fTxir0QX5rZ>StKNESrt*)2iX7sSJDj z>=uD>ZYL@4l3BFq5K{)hS)Rl%)xG)GtCi3g)$g3NTJ|PJ`ndjti<_DtIoTb@^npcU z(C7FjiPotJqb#1e=-8fqr0ot{R>{tCzjeu>(51X#S?u6(0)@F*)zD}FHr`;h%i}%q zd)#Q#7jl_uKJyGO0WJ?-P|%imP2us#OjdYl!Zc=Fw7h3dJn-dh$X)5;oTW`xJnC#{ zRH8iqZx7vtxo{#h@l5pY@Ucyd`a9Ao-F-?z88DQU$0tI-y!R7Z5vaLZ=IZrPo!c^4 zOKPmoa6_3dSsTeu0DgDulA|sUN)em6ziPs$`>!nK`CpXhr z#_o?%k~B4GeH3GyU-2y@0^WKE@W_w-XqG+^TvhzY z@Tlgr{k#ZG%5Il_<$FFk2Tqb8RR{K9Nep%;DPjR`{(aZ|-ecv950(Y{sL<_xl(&BV46!H6n;@k0Y zBBn%{!N4TBq+xHz5r96oBZTnXNn#4iLYz}uF>v(m_;vgCBEds?QmlYZZoh{D*&Z~3 zg$qxh{DLm8&U6aH+r5yFkxWTA2qxobW2~oP?gPk-cO3&ev4}*ntA9T9rbk*@-G2L! zDT{i}t1g3TuR@Ho1|GWmeRLwzK+Vfbx3*rl5DXmd!_S(WFyGL=pGFAeWyU_FpVpko zMsF_H&AygnAW5ro)0I=8bHMPzp0@EzoJO-VrJM&RaoAF5Gt8^&cD5o%c-!xYH%icM z8{v97a@oHl{PR_$z-!!;-{ouAGG4c%-17N1F29jA&WI~~i@PFrJ05yds|y|F$@(5X zJW>Iv^?{=+vk)!t=C&w}w_j^h4=7%QAJoMR^CIb>o?ItIygXp{Y_q*fbq!DHu|uB@ zDSZvN?J|u+kpy*vA)zvN#tf~t?t-$?&s&Ic#n1M^rSJoEOu5uDd{4a3+Z)?BU(f`4 zpUofK-=VFUf1lAr7pvq~DhVV%+YDN0Fm8-DLNFc49Pe(SM!=#S7gYBaX34M-pGC4B zkFIBs6Jaxv@H&$y8z+lz;#9&u$+o&uf5x=A3wRXw;8QxE@#-qHPuQS8=_)VSdYr#?^ z>-%e-Oy>h>?56 zXoW?XP+Hk>B`_GrODc!J6Z1YUGkR8g|(|um=i6K;ber^rsd6^8&HC8hv!LM zkAx%_Y~U>|iVl{a_xkYKy@a|a^74)j54%_B_MkG?FYBsFmIhQ>ANKFD%-DUrC4XEe z8@hZ$b==#RFaUBW7mMw!oft^{WLDQhb}V{x?jD#P>zTGH>-A+A-|C=V$i{(!z6g7j zKdP3M;ftl;2DB!6$6K(fzYXe>7qmcF7NW;xbXU(H;du>x`sH|>_ z^&%afA*za92xqQ-PBC<`8@s3lx{)22nhfvHJ>UZe=E~j3X&C#i>!UM!ng}Osr3TX@ z0(HfZU}iQyO8^n)w~bGvd+{bKzFsRRm~cvM7#nd&BbdI)dO&^U2m^a02c}&fE)iTq zGUfd$YWD5BtRfN9IKVxIGgY{cgj9}|J&q|ExW7#TWlk9{mde7+ubWF7og;C$8>m#E z-S=)PF}R>ijGkGs9F9aOpx(O;C{6X3b?__06@=!p3Rd^bO?QA%@+PP*CI&asI9-be z*Oy%4vXB*75?QxEn$8o_R^Go+*S|YuCd_p_UOu(c_*-7B^?xxaEt}S@HUYX*WS@u$ zrgLOVSm}-z-7Z<)8JJIbkrsa&9Y6g1d7yW{_UPKZ0CqAFaDD^~zC2OtzKDs+_W}T; z%DHb7flt|`6}+7~PTg5+MvO9TEc^9Y=IhzUYqmA(*mk@cgD4njlf-ccHZ_@(rGiFP zs({hYDrRC56eea6KZVJdQ8=qmun9t$tH%|3;aLytm#G^n?GoP5Z~ba5JsS}0Z4Jwa zAWFMLa&$m6A`Ds+;$E>UZiU)+pTQcn?EV^K6?DK$o`kGB3_N(OEo7EE6|k~0_Se<- zd7EiXSW40MyVGBWq?;92hxAQcLDHva zF4P`%l+t6-l#h|Jju-%pP~e_$`iu^1adaMu0K?e+X|->k8Ot+(k>m%gwj!|&$+KTp5%h0K{IJ0S2MC0%N>;V;N`XmsVFb>I7=l*CoK6N&|Z?c;(E8PwHoy7e3>f zt#)B7codw%Sa(PT4?M+Wp!kbg5j@cZybwr+oXF*Q!B6(a9Tc=Xc8;G~3jI(4KD^kK zG!z5YeLt`Asl}Oy0dk+eJ}Es@V*FbOWs589;wN?D6QMnPNEF|%J|O_gFes~^+yP=5 z=Rznue!7YOT*D6U@ZnXh%*fj-fggB`;U|J;I(pnMmtpihCeDAr5<}cJT<}M=ivji+5<3Htqi+2pK=yITt2uRiOehz zbQ|0Nf zD0CE`^UafJ>Lwm`SoTG47V4mKb_yqdz;vD6iU9HPd`)v%I#%7+2A8jLd>JDpK9>%d zpNmvrXA6kiuzcNEn_MLexKFcjvFiq-j-t`K*WO8zDIT~y-=qXXv6ohu{gowXdUL)c zKegoZFShxe9t41rvTQ-h9*mRT#(1FdO<&#$C<{`U%=D>JOG#r;iu5Md zF66yQ`v}?UWnS#hT`u@Jy?*%4;+l6a@QyAWxob|&nU9UKI%);^C!dHp_7g7PUkthS zuu`bxXo)yUY(rS&XnqU{DWI^~7Kn~|x;prX4~MZ5E4>V@nIgxRei))YDu#D6pr|Fp zZGrXfEZ8A^@)!nATTzMB(KBy_dF5IR_On&I5D(Je5N#$We#|Bj2<{U`$@F~ckCT5w zrHS;iKm(8xenuaK>M(o#EJyt^cIF1H_RHO1e>HnoS)$*XhJ2W<+Jb!YU?>t9F7PVg z)jlyT@X2>7H=#&pFUCt2+(PrrL4g)zuBsz7UTk;GFb;jQxHHpRvc2e1Y$uZ*94DyH zUE$x9E9PuqyYTr-P~9@w+;TR~92fucyNu9gr}c7kFt-O9(Rx|%80dWS)((2Eq;{P( z$A(ro|BR{a7W7F*89jV;FdbwQb1GuP=~Pk(rKqVZ=+0$Tp&!bcF*gNPBxwuvs(PL2 zoAA@&hQfP9B)T0d zTGi~&PHzA?OAP4mn)r|{5wk5}T&|vogGO{Gz2T0>#BugefhejCcsdw$X>YfpU^j>( zoBjjQt^8FFl*YiYl$o%)6kxIXWB+OpoMqW>?);j2xBflL(h)QU+{fq3EtqQ5FbmU) z`;&>UDRg2RNs7y@&9OjdYE8Luq4=1ScdPcn_W+~mNd`CnT)IeF*>EG}7DBBlpqhjq zN6*_&Ei--2X*OMe0tl*!q$IHR;7Cxiu(8AuRU)tNqApDyz#{&6af%)}`L@{5hY#@X z;(yjcdaDahkv!;VBEe+Yv+Wq!TQMwS*%hNYgGP0xMJ(I5Pf*63)Ke6AA}7^|fnw5X zJ8id7X8y7t0CkcwHX>4Y`pG!~oID6_Edh$pAh-`-@(bJObgh`MXvN_=@~6mO5Kwv7`EIny`>OVf?s$1fWsM;-W`JS)I-sxV$WHwU9G5vWMnS`R1y zm}$~ju0L(R%o4Q(x;(4?W_AjO)mf`N^uukLaVqnR7T;B})|r>{v^IS6`*v0f2h2C; z%__g*lC4Qc$mcGl!wz#};JjCPs)wbuMa>W3aB8LOw^PT(2zt}v9ZQN-g3LV>3w{Tc zB|E;g&e(acBWnj@_)TAF)*_x0Vx$X`0#v*a^bQwL&I~o-Z(&_P)Df2#%*e1w{BL94 zG>})|^xjWGTwf$8?nOeOz{^Bq%v9!|Uo{kNz`Ebhx5lMiu0WmG34z}2FlVui&B@vR z4buV%kSZ~Z_Y&PNR)de%*^4toWpT>o@D>Dhn%K5E87&=(xOZq*^8gd=2F8~z5r++0 zMSMPm9osg5QzYYNxIV=$ErK!KqQBXG5Q2su24P6vDa^z?(u-K6#Gx94TTLBcfUll? zTok^QyB-brc2#SoeQjqPMwiNBTtUN)1p3KYL0&&{@AE=#WBJGm$!CKv^-FR;B8k)G)Rc+AkpWltra)$-u}_d-Oy6p1 z(Y!_1jXD=E?KL&z!(0Nr(-87K9BsuLFC;1q`~hQ zQeoElD&e2PAqz13E?83Tg2x=4!QG+(WxQ>hcIZq~GGdst8!vq3%BX;y9tlh(4IcB}FkpjO zWnx-;SGwB|VU)u>oiQ5c2zRzUDvmg}PioPKyNJo01JjSE|FOT8(?BWtcuN{)8|lgP zbwq$#RFoY-AWX#7AF@LPm-jjB#u3g`Wx_NQP4!WX@hYY+2xim!HA5_8 zreTC$|Ivm|ADS=ZekJ0e*POPd&;rf3y@vteyrIangMFBw(>Yk6lThZtXHi9?q~_!G zxr-3`TE9Li%d=<@w7@~QYgkon_tc!=96=Gku{w<}*Z9qTUbByy866OMcwo#vYeq?` z+s??bVUNp`W2r)`mrc-!01_*&P4a8taOZOEdLhs{ejemfwU7M$5W^ymUS)dnxqMw= z4QTLCadWcOt*%H4i%f^m;!s0LbE z^|hUkbvtMYyXH3HS=-AGg zOfHn)ph#OpL=?>!0|5$Q4!?1Rse~{WW%S!7<8PYTs+PE++ zEneu3wsxsHwQ;Huek-Ec5~&{SjZ>p7G%2F_f>$z@l8=6iXmirwHB>*iq^2Pr7;-Ud z_+U|LK6&Koi2QqiM+P#juuMH)+|j^)w_2dmUCQics>}m86`oi6`@?HKG#UXYecJ zMTrS!4XeeuGdU=1+9TvGq(f3i<%;SzgWz0442T8w`yif zWZWl$58nf`D5NF11V~a*`it*hp2JS4n&jr1-P_W-?@h@9mK+jF{w^3;NeeH&nUwX!)>2pZe2@l# zJ@%ewaw~Ba4Fq2&=1jIS7~f;DLA!kY4cqHsa$^d}pzbV!C9e-1*wiW>tQc6kF8)eks`(i;X?OQKlqsS|bnN>PJuKD{8>NnqU z0~xEwMj0VepYP{)f0n~MtTL4$Ah)grs7A)goRbl;ZfDuq)po43$=~x)>Wn}>Rs&%9 z_TzKVdS1t28zv9y;Xt{f5yQ zl_6s6p>8$PcY%fb*YldC#mMxbHkkK>rW8wkNnRWX@n4y^>cr(9P9&f8ZPQp)Y-KX`1Ct3rAWNekNQVs~b6#4K zfC{QzG93$vlql6);%@?rsvX2SsR6-wjI8olxFP+?m%mc)$%YYOWCIv8c`T2#k90bg z*ys2r#xhJumjgfsu3ZN<0&QsT0)!~9xsFvclx0Fzww^5|JS5WH8*zH$7(KN{V7rcL zEl)?qooE(*H&kARuDib3lE5M<_{0+loeQQHUt2oU0sJduqnfiXdw=X)aqzjf?UU%~ z-W}5+TF4wjz=uI)oaBm*5q0k60Gc$qsG8srodBXr-B>Q+AFKj%|KYN)LHOL_^13m; zMTJ-CHGCu29f8Lm&MYFUh*Z1$wKpf!I+XPxP@05ArN;Y+RJ8eD`)@z(Qh3^+UVE1C z6s1i>a6r*G>6psLP9?}HI;Tj9$&{eg^er2l#kv~ZkK2^FHolsR@N3c4ZEVQ^KrkDb zVRTINcr`AX8lYDQF-wYG?a^9}Z3w=|#qiM+o#G9T8JWxwAd$3XSE~(lTvEcpQnhAT zU=+ZhAJn^vF3GtBykJ}@n9P-@7E|Ql{ajk?U|-tJ4~Wz}!~ir$;;4nfhtOPtk&8Pd z*}r>r%1tohT*YQCQ>NwR88upuFv<=%kK=kTkG!YcGc}s20UQ%cH!4Mw)F-ku_tV-0 zn>KSVfUgNfE|4hAh4sZSE38a5tEqvwV{hQA6!6R-y<$)yC`ihU#QU?Ci&z_C6WRtP zE|wwcUEi5t^ve4y=>nVdjO5ks`kS5QJj&3JQ4<`3iXOUtz{P{u)(Y9+od{0_*#%S*RAA< zSBv7MbT)K(ox1fBOmu)e1XUN^utn7b&er+vJH;%LQOFqmve<0EI5KiGBP|x4m01a; zwh=NB0Q?Q%qA32_T?OvXys$jfxC<4WH(+&&uS#8-gwJ)}^%G4A%1vBwr%fgv}} z2+1itrWEYRLmtG^(!>lqDKMXbgNQhXDH?%HdCz&04$sOdNULpipYp0rZxp*(a+|G}%fkm%D zcsaVPO%eVrSb23Q<+V8Z3~t^e6a}9HlQ})i@6IO_?nq*vOnt)APsI-Dsxk;fm1-EN zBI4#RvCLe9rE<9!R26v0Vp2BuRT1Jn-rWK8ieZU2V<2f6z)S&hf^^r}d4)aEdUf}> z*;ROM{v_-}(Ksg0ozCdwS)k`3Na`AK`XEU`*;MD%^5nT8qy2*JV^S5(7~tNyWZb1C zVZLzmXjXv=(NBYA>cE%xSOd9i&Ud(ov$yzDr*eu?HYa@4HJ)QZkk8~tY6hmfT;uca2J9+(2xjOe{! zfxJS$Hm)NuJd@;k$J=8yD)SaML9pNgxNwe^^e;r7Dv+P9ikILye(>0PK8#(r;bI|C z3h=%nyhRT9j|Zl`eUSXQ8RT|U?9mUPram7q%@VEykd`W>PotnmY(5U2A&8*fiGX4@ z8HfCiC13n*UgS|lOPKmEmK7I#L{&y7Vl{uEEr7qz%1#)@n^15y6GiWe^ny58@&f+H zYB9Mcyn1YJ;5>TjHr~5Z2WL~5zDTd(DWh#6aDW|0-K+iLJfI{LBkRcH{nu#mLQ#KX zz_OR>1c~EIG*GNNiR~!INT!uRB2J^|KhfWvAfmTwO!@F>#)-bd1L7V8I zQ59Gfjj_$Scd+S{F8uqZ=}kgOmlk1@%# zYFDX5)ZqN6h56kQ>na;IXz>M6jxq*Ef;s&wd%(_?4scIB;`3=Eist*Oa3<&m$KUVd zrwH7s(-9)03#1Z!gG^=|s zV(X;NZssF42%ETP1>K8kNeZO+b#l=iob&YtmBzsX9fT5?Yj8`QC9?S9x!GE>M>+x3 z+seFWVf>sjD;PC7Eaf?5<^i9np|L(vw1yx1Qgx#b8n&UgWc$~o2p~gE^!-G^>Ob|R zJALVxK{v?!8gc1jhEW%;jx8aUe zjI=zRMjE8O2pKVY0nDlgzvxz zF`%R;*~wQ8*7Q4hP$7_e>L=LWqj<38 zT)LW8;+48CoE@E)2BqvZLV5@ExY_(Ojg@g*X(222*Y!9(a&S8#!Vtj%8!ZSVVfPwg(@0FQL48RYFwN2+lFV){YaA4Tq$Y0i;Uw8>yHA8Fejk>shm?&ada+^e7 z-ld{|gsnbH3FV+lMFQ={34=FlQWp*9M$(Mx6<=aZ7EBH%v-7C*ir1w+%HiT<-z&`o zmbFJT)D_{!5~i9{_#SVn6V0^59W?7t%1Sz$@wMS&d-g*9rl8f|`F?7wEJ#49f zyWR7*CfYqQ{aoP}j$N>-nypc5`Zar#ZA{|Pdp>BsiItAG6BYYI5eB4@>0&Qmq8~+{@8S0+01PUk8Azdh4J~n z5qLHj!jUD)LSKHmX}p5Uu)h}jdsq?rI?^s;{KA|L#2`n@N?vIsy~g%q^g#)auxeT5Gzbbt6%TK zmH?c~&1Tm&X16%h!Cx+=PV30F@;kZ8FnqiIz<6JN`>AOw3fjnu2s|#m0Oqdz5?${3 zzprE+WKHo^?0MR|>}pfI)2QTzO`QAlT0IZqj4T98xiGT_fcH1*>8(7zBbQNxg{ORy zOlfghaC7(jWyj6~U5#fIS+w`n^8A2WnC)R`5YpSh(3fk&8K{ohH-1xfPlKSC{!;Tx z;POKL70tFx`VnE$Qy92&P==(__KOCnHKbxy0hLZyaE@YvPJ{!$++Yhanh+LY9kJ)O z9A$@_14nV&&}Tx-+`K2LZ9|6mH!*G(eQCy6NZ8%k(!1;iQBFG)3~FB0g97(voKD1j z_Yrq)9pu6EDMrCE{IvdO7&~&rPi^$v&x8Ag44 z|K_q@(C2j_QME7NvLgM*`}6j@V84Hcx*69GOh?1HSW*7#R67l!|Kn8qfBWQR8u`~$ zJB|G3sdf~((f@}t?f*PM6R#$}GNB;4B3jBg+Q%GPJVDWCTDG0l%FXm#e?U;Bkaqx?oEO%`W{@DIqKoq&O> z>l8ad(ij& z%ALhtVor4EbA$UliX49k*RO4S7G-btFjjQ&%ewBOtD=%NAH4M$(_0Wx{~^|BMTiyX8(xh;t&UWl3+lv5Fx8aEw87LtGB>%+VdV9kYeEK zmQO5a_C2ufEqyI(MPy{vE5Yzgrg=}|SF?&zLZm-UzmIb$7oR=tms^~&G=iI7vwVm* z!V4GSb8NR}JS=uK}LJcj?F6wrKT!FHq5|iW1AZZT&E8<1zQctpMUF-6TwW z0S<4DfZCOa%cwf}igP!D(Wmc1w@L{*B*<2^{fZZNF6~_g7%|myAi>AP&(5-GxK%uJ zG~6X0hBCs_wtgn`hm?%`)p-dxN=jyxSO)}%kf3k2%vhyY?x`wPCZg-nV>nIkqfzMa z?MLd5O8JjdJRG7xRg<<_{J@omCPfP%l=hpF;Ir(}G_d_f5B2MtD21_rR8Q%iJ)gI| zeF9XrqPG=ljNF`sU1nm9Fut#AhBg6ctnU0zP>UPukjoDh7U_Z|%QliEI{>Z(IG7G_ zY()wI0E_6ezWiy~PSLpj5gDx>;}2AUP+bH*-m^RBgch*u1{5{endcB$BRm|ylA$m> zo;17I=0@^~Pp+Ty>=B${4#NIk1NuPDaJ^38)!cNH33}K&^}C1xSGcUPEGbKj8?R`^ zVj1oz8#Mf6NoU0_n6-iZHV=kLA=UdKV69f$L|U$G^Mkwu&JIbM1NZLP2p$|7SGDD_ z8O@+Y+QJ8#gyZ*ocJuK(G^VGfa-0JsCXhxJWPdt$W64rxJEIT80Plu)ckpm9Gdu_H-P4QuuO^DP z3Mn+wpdvatx|&1g&i$=b1)1`i)O)mD;#QciuY}ZNoe{3V8+toK420i(*2XX1RXU6< z&^IFK$54bHBZj;TFP&i_Qlhl4C8MyJ6m`Qa*h)OKyq-&vvQqrfzu08@u;`qia$7ul zP+uLF+arVkcO zk`y=nm#2spvH~ep;FTL52WK@fUMw##^u&&K+CPGcmv(gUe7wBJCq|EPw5e70CUkcu zmaL8H`#qU^J6d1(0Pzi8ZdV?2E|X9;+5D@5pWQkPRXspy4*}5|-vI13$I-rv$KD`X zmf%r|CL#f;P`C|`n}y7MpN$MeUCuDqL1DlF|?V(?@q`p^uX7g*%( zSa_9ep3zX?_g6z8Up4{Ur0;S+c1Y>?_+Ng>@ZpA0Di;8qh0_^e5V1&2DaBlf%>Yzo zPsROI5VSQJ^5Y~bejzrL^QrJo1rLzTn8iiR7?lIaaYAuI`W*^@xdMG{wiXqh6!0>Z^pX0WWzfl$x zMwDKYcY=4>CP*LsmluTFqyi9}fMG&tU2J1tCVy%Bx-Xvon$@&m2ma8~AQhi>) z`jGnd!fG)w?bj(y^jf@6)F!iZ2&cRrt$yonVQ~2o_(>WEE{+jDwD!8>d2#zHz2dF9a&F7UmS1 zPvz(R?4)ipGvA5ZUI?@+HjU`dvtO=W>UvTllsdxMNPn&uop| z$(oHrZlYUh)NUjw^mZXvA_rO@RrE_-Rc%hgDrK6&x{?#~B=y#emebDa^8^pBbVrac zZ~!nY@(`w_nrFIvW><|K-A1Au;#Rx=<>y%EKSp_Sjkdn&M2ht4urf)iw#fONR*81U z;}JDQnKFFIY2aH=aU(81g|GY)&;0_XjQA5y<8uav;+2Kjt{d>BoKKFI1KX2q-%1;&I)VinTkDXa!r8%qVZ~+1r|SvYhR&!Z!Yi@6o2cA7l;h+=L-T z%_IqQsEOYoXvl^&>>cN5#KlTVej8c4upSrA-NyGYD(*Q{?jR!Esj*vg? zy+zglX`JJK`OZPY+9_PVX;7CC&)2njt}|6!AsFyLey(ZO@SrR|v7~|G@;e4kw(gYE zbx)g&i@8Bk2C`_AsAVbsBz+^TgYSEd_`O!>Tqr6v;k}+5L$#~$F$Ihp$t2%CaQ9m# z)v<{4jSa6{jL9L%(1!ydx8Www13FGX5v;%3dj98T4aUecBx%?Kq zK$F7-Lt$hrXp(hdtm9@)P#b%P)qDyqw?f5q;@LdM} zE1yQoz3V(Ju$O34pgJ^-+N>;`5^0*V@JkJ6rE>02d8cuacy|ZWqJk`{gk8b`wKZEU z?=HB*MVu?*39Uric0QPF8X#x2P{mb3%aCXc68XDQqNWyDEvE@D;`z#LTEM6^%&z8r zRSo2&qc7Z9%!v`b1un7XevY-KJ4_VRO4S~;MfeQU)|P4M zU|$WEbJ{e3hGSR~@j7(JoV*+BA>wkE+^MXNh3_gfr-=ssKJ#zmelI-sOA58SDVlWu z9ebB8y4o#G>gW-t&gl~fp>byga-dWbXcuxb!So!jV<+VdkMR>|C~5^p`y&+omqY8s zouXtr$iYc1K}jgypPa_Gdj{(c^oWsY_J%~vn2u(zZYG-wsKM-Mc9K3q9GHZr9zOX7 zl01yA3?MKs6;p6P6Lj)fu7+QH*Akk}X2xStU);E_%)?}=Iv7aOfJc2Wj(#fA5 zy5SXJyFA)3`U?1Ehd71yKchccz@wYqqNqiGE{-@VSn~6~9%H?@3UA%2p}f^*8d$xe z@c5`&=t#Of<^te_-R5#kEg}38Gq%kOh@;#&ofNwYmdth7cX$N{=Qa>*!FcRj_!K4v z-?SGWt&a>X`u95{btZoRFcfC^{iZ0wu6JaOgB79?i}@Ai(sFl% za|`ldEqwqy(b9;J{qtVAf7Zr~M@L5`tbS}6^QHN0TtdpN?B*_`wf6_&$=8UsdeZZJ z;}R`Z=_Ca^6C=7s4#I!;Avc2m$v@4fRoxyNA7rwKnqXsR^*4G{-HqsW3h$tHT26I7 zB5Z)pNsw*}dcNLN+^xIVj>rq^Qdz8xOnMJo$~RSZL*ZgR9CO04#J|mFR@&6j+^_NP zt=6cO94a>T3uZXfL~D%d>cJ9A%~Eu9;M*a=4muuC@i+<)c7>AkUG1HtK&+@0hZ#$n zE`u}{-TR{qt^E>>2_xp)Q^fR|o#u29c`=BlX57I0z8bzu#MK$IV3aZL4}52vOaHmt zZD3VuP?Y9VQh`)EIwMOu+mXqoYVOtBZ?x-8@?j)cz{z{eaHht*TczoEnsLdF8k%fE3~-vVscw``>veB1Ox~~%F6>impbRui z!=vyrv^u{=n4`&a>-n#Nj6sKj>*lxRn0T#^Gn3C~GJ>QZXwA51Knd4}&(CD#~wRQ+%7Mo;$L>p&}%)-)|?w z!}EiG5?&|JAJulBhQFAC?Ne}jhVjR*6mrZ?ITa1g249Y=>8Vy2H3-qeg+Fy*(C*Cv zcg2_e19n$OMLu5@ka$ly1gE02lW=@8xUVOw`RVQUAaOSzeqRjel*P4gpK)iZD11XQ zt7k}V?qHyqZq|I!yb@q^krlM-UJ9Ze3b&rdVDFN$9o)#?E+;~IXcoRKF<#0Wqs?Bl zW>QD#Q$#W)H@rZg4K=>2huUO2gw+Mq_LLa7|7{d3_>C2Yd zF!~k(&%r{vYv2;YPG_?`vlxSiP*HFj-fu1>-QRoKiVM)u^<*ZAK)Ur|qnt?>@&Z!n zp95yQp(>V63x_pVlDD~O3tnvntG$cA>EJK(X;89ku6?#ZR1rP zK{kg3ezz0XF@{enpcPrUa9Nc;82}~*hY3NfzykzWk+6-L9Qem)e%!{N8v*1BO4CL7 znaXA7VPHFzegO?PT=2M< zISqTT300khOlNI@H>-3--+~(-yP1GMQ+azsEPIE74d1hB*>Uhc5Az&P|C^m%FyeQ8 zSe~aueAxA{&ovCb;6z?2b4Nj5qJ0!EDEJ zaXLRQU8T&+vnAaTkdt(5pJW@VQ)7WU?DqTb^-}(r4sI4fMtC`TE<(fKf3N{&OSMFpCa)mn zFSq{(pw!zI<&v%<#SqH+rRU#@@iYReL*KWi8dmR(!?qm zg6`*9B`aBW1UK+kqp&;`Z1J` z4-Z~LYgzCPFSs2oN>giGAc#!M9m2Bke%U~;RCN>SK{k9i08YZ);))@I? zuT$O?`Y_`hAiV2`sYt|(33klp`P4-dRODW1SY%bX@3K>QKlNv5m5trfcAl7ZD1B9J z7(gJ8v!CBxep7Icn(W&S5~nkd-PLr8YBM;#kl&wUt-nv$Qx-|Pb%YbVO(cbrdbPGb zFMZ1|`n7OSwCN`o#zQQMm+un7--39Pe%YmMZCi1ho}?gsYD*hx0RPTL^ZHS?hBt1g z$-2#;2Z@+~m9%_3_m^&120Bo+QV1`$`Z`F6kRam?K{M}1eRD0@_hpiJmJZq6!;rfc ze^>nZ-p+Bn8P-ES(*N!B!0=s#I3vE!q#suD?XloUWb-U z&-EGW2-CsSpjZxX@vMO#y}Zm*20?25ouMU0HuKN_D`h1Ro1_jnmroQ}R+o{PU&^Gq z`;Rm6blsL$X|*sTI5HX8x4APGS{A{=K>0e+p#Y*(lG6EoV`LMw(e0(gdMy>|mS89? z6ca_33@M{1bKCLJZe=SqfBE!&bNpVUE)i7oVN4ihA~G59%`-S_%VR=pP)VU^J@ieeBzT{Jq@q4dYm9_aRK>j{Jiw^Z;&ZB8GB7($)fV)S?C(E{LW{% zhoLD29VJg)5rrys@nm&$>c2C5YWMHm8FGATDL!_v$8ilU%{8RzDzCM+sQU^icXM^5 zq_2PKS)FLy5x+@~KZ#*2DQN>;-fxA5>wTpw#hH~>LfhS1_7=P?L8)!UnDU8g0m z{%wpfkZ3Faour4^0=<0Id`Xp!oxtjoM1wKcYFU<`sQ!XJ`T4X~3l(R9g)IWq%n!-4 zy4@#&A0;t=9*K0mgsCB&|6s6zK_()lPoVl#Z(AnCfQQ6Y`D#p_w!VEe#uw8i2MGlj zm-F;<^aq;Qbtk5PAJ%#oS@~_QzCpCMyaUq*O}}&1%}HSy?+jV9DKHJu`$(&UC7)il z_tp1%%oe2%;oHu!%w-ok?a2*8 zX=9SEvkMHU5G1O`!U44(Vvd<7mrizcFF*sTDnnD~gG0sZS7!6~<#A-*N}j=X|DMD{ zebd+5jnNP{Tf9!#6;6xR1TIT@{bjFqn2WI6ZE)^9D| z#D+LEoua`@iaYGDHm7-X_%*-}l@Y)b??^x5_n_bTAo_v0xxw54 z3pRiT3m@?zw=!LZMlL&$-%Y_~{+!LfBVCvbz%uI`9@|fj#67aL#H!3(G>Pzyo$`uD zYPOKGM8{qCptI$xqqkb-qdf)K%Z-ZHjPQL0JKqwS0|5}=Yk>=Dz(bG4KLN#jtHNfI z`pbOZ?+>g`>JM3Qhp$iI40Zmn>^CbT7<@Y{$9`(^_Q070A$wV>=nAK~Dk|Y7GIj7B zDDk%YgJnxP!^~HglIJ$tuYWS6V^$6UrJSMw{JsR zxFG&m7yGbKm+RASR{)(l(C&z^mb8fiERGQWJ6{RL7*TlRG|uS6UI}0_tsmluNJ5fr zBe7TOJ5H}0pC6j*e@~X68+@c`I7Qyt(InXY<;=d9-iaWC>n^AI9LWz3qfW79rsVDm@u@87d=`Ca2g2oxe}bm**7yrQ)V}C{rXJas{q)ujmAjs zyeZ+Od;nW4$epk`4V{~iM@73RegOH=z{|oXmW{N;o<*Ri#>=()P0#vTlI=kWWOOlG zjZm}`@hmC0E;okS@rW5(JwHK?&M1ymj9VSTLz1*m8uNpF6b6_Vv;spbmNEYBaRH+V zf7FOkiz2#k4_ceyfYgrROIqpQE1N%2w0xTQ4a!<0np;L$l@7blG1bVIrVPTT4T$-{ ztTjz^N8!*kp$zTjZ@3_CH1Cz}dPPX$vp0t=tbIUy*K-bSl5|eH<21)SL~}Eo`^F$l z8uFM^Z`;bqMTZOyW?h6SlB`fk>_^U0I*J|@ty9Jqg%~VR=F2SVI|I z^={buY;DzddA97KQ=GhaV{rMJ>IA{Gj z&Kkr;T2sP8<0oA3+a-AHq(LPIfPS1L0;Ax|0uwZH(ENtz%Qo9COT-zraB+Ej1heaS z&4J&;i^M65=4o@n2s~YqubcL2aIK^TPN^@^IO?c|C!8DZ%iAMhRFih63;8{|D#VJ8 zxoRv;dCQ!`^a5i$6DJ@9(a-j`D2VXu?*KPI$iKe&Mzap3x^AFXp@3jSH2pcL`eaYo z=&WPpJRK+9{iwrV)7IgcPzw;EfB_8MHxIR77H@VS#F-mo0iC0Moj48aQ#NQWR$VCL zu4#_dm8$x&yuz@c?p2^vKe!(r^5&td7fHB-0;A81G>Dy$a_lfHitB5w-BpI|B46C*bov5nQ0Jc6Q(`YU9q@ANt!m#z1>KT7F`KRBF)3cS zg7Ywtv*F&);{$Fq81pV-X&eBjP;?wp4??nbeMuSfGS-vkT=B2dX~ejhzXHFVbp==J zbwqiA)Gt0&r>Hrz&xCw^(h^L2G2v!Lotv`Pa8u$f z(#1e9R9uMr1Kr~4aG}6S2+gm+2{~B%G;|DL-(Cc7@FsJI43`xAQKG37u)OKmfVufz3MUYRuvhdg{?FLUcNr@Wevy==O~-Av>Yv{rNvaIyifm zR$qv7AI)IH(ZH{5JNK-V{Gmv6GYIwgPHN$u_S`wH2|Gbq8b0K~pBOG!!2DM6%G}bI zC=3e$a8{?E(Z{nNk}O9w@9?h{E&jqEypc7jsN;{$I?$Fr1klIf4O>(Mdo?#FJ}TtO z^46267BoOPI82X2ugsu`ot`9!S5NA(VY4pu*hg7ZWUkw`=C&=lS9 zJanF!HN$=my7s$KBfODjl}N#m(RntG_47BsE_9gN7ao>ALk=;v-rBlkwfTLTIU*}Y z#M6~yJcg6f^tqCsjL%zsY330B-BS<7peKK%Y>wy#TBdY1sE=;S{4Mz0aE&(&0NU?( zP{@&|0FWGm{^duP*B_q`$MR=&f->&Usf8C#oJ&l_fido!IiPFqej;OMoC?sB^noJ6 zc>k`Z6;yZ|Z5jm4Ho-A{h}5HY@>hxhd=YCxIdc=&;N&Ste4fakmFclf0?9i&< zZmmOr0k0q%N)jkM#FG=JWB<5>ZGgM({t*}=9X8eXmU&oankFwCS~fq;9Z6A5q9g+V40QCO7`k{t}BuVZ2HZ4y^1Oi~_AJJ_Gp;{ygtiZQ8QV;CA{ z-@f!V$ITh9(m_hsEW+@TU%V-(bLMTXnhbU}2exv09`w;C+(E zgq1a(w2{DPbr!FO7euZc9qcp61pM^Gs3w}K7!YRva!HA+j#MgR%*Y!iqil-Aywp5`T|Y@V(|i_F zqsc#}1+Y@BfW2yuvsb^3$|Leib_51c(4nmnl)w@Ylj}5qp5Xi(nVQmqPn;7u7g$Kn zpkc*8h80E+7Hyfp14&koc0%BQA+GTPn9eMnGDti~ojxPgjBYjv&YSTvu6Bt0Y7V)A zZrQN?lsSy&No6VZd8vH=CGt|>BSj6Yi7Nqx?ms(h0TkdXF#I>(io$ip)Q#q#3(Llp$iQ*c=xGoaOgQR^A%bGtlR|`IRTa)hGvN*bS7!C8*JCZ_fyH${I zYPZx`(zPzv-nCy8lr|+J#l&YGI!;%=My|QBOTVX|D9(1U8$2 z6fI`-BQC>#&0p^fnp)M+=+WE`X!C0W`TRar(_01`?aglxH=nof_7Yme zO(DPVQ{gbMMWRJ1!p?Z~ug?+zgw4s-DM;s9`O|#Pa~u>V-3W89_3+-h9zxFV6h1qN zZH4|BDm}9bn!?Z17QOy%I~x2MSd&zk6E!Kyx5gusw_bnO=96YqJ%M;+{Z#AcfkU|) zC9R2Ihw#e|PR4^Vr=w-X7OSjs0&)`*up2uU;hKd4JB?Y&*7SAijIs|51}B+!!Oh2L z`dwbugmHOMTSx{DNd{I@6-fZjivIw@ama%aFd~ z75hpqwsE^0SkRs5Za^qNi7_7xmE&@>y8-rk&0spY6V>_xK#N8v`yG`!sFh>of_)*yaN8~B)>F$67y#_N3l4O`6~R^6%%}QnOG9$np)S$Sb_k;Z6GK7AOK%C{Z4)=MaE=%<%#4H1JgS}vs}Le_W>y1uGj&|| z!)N$=oP>ygjQp+13WmYR5%82WQiw__tES6B%0j`~pPO7U)w~Xxc!*AgbFf{A#si_; zf(N4H;@%BE6lq-|^0#X@lavtUk3sjDzIO&a`j$N-`xCd^IvEMJ2E!ea74qV%16yVY zs|O}BSRDtl(9bfGR7eC(4F=Qg#at49^z3(&pB0Wnc&s@{TU6@1Vav3sF=(NOP5dnM zgFuh5f*JbMg*`8TVN+YaXAz%1A_uh;A+{1D*yc`og)GO21&9PzVYiH zXgTWiZ0K9Cf<(Cl<$+Rak#s9aO=36}&N7{eqb%mJ#EB^N!1xOYW6+;|d_3qZZSC2OX(y zKFKEnfzRh?>JqIScPV1{bGt;FfW+;JJ*$!&rt&r!!Iwe2nGvPvb6xGEX&_Qsl;F{%^42#)l{$QCQJp*&iQ8E>m}_(`Jl z4ZEUL!RH*o{B%Gql)5y-&IzkRL7L8>ExiHiJ`*)C|I2IO!Scfu)kiZXj(m1x@;>kgqK zm&e>i=o_o>4W1sVxR~dNaNdnjk7QX;k4U%~AslU8fkKPo6yr^VeBbA+9L@Wnyyal=8Ki@VsPN|qYL(k^bB5>bAri>7Lr%{ce z#a1UU+#*GDrM=5j4^I!rNS(l8EW}pW06gGO zTfi`|)IXpsHVY+1lXXe%LwUa zqW&$2zB?4?{&rzba|Le#4SdIMdp&1ldS23I88@TMN+i6d0SCseSfpovx5tL)wNxd5 zU9kNCGMCxZIZ6+?4*AY?g$W$=m>j~%(aDPaz2rtUtud9uj#*nW zeKqo_c{M{>N4F(W5qPQAZjmzFqB6Id^HOHoocwcxYt8V#jQKoM?%1UwaLe@51I)8Z z9UMHa1Ium-eKB7+&0qEs?5^e1acKjKUuHhb1TE|&b1myeSEij*7shy$?4Z_KhAF{E{>Yjrj8>lY!I(la`^co zcPFcQl;y5{VU8Ll#!N2!h)pG{im5F7;1ilHgk!6R2`Hzv!SFuduOB3!@ zXI%l_F~eO^D%gZcW6aB1B0Nq5EeV8L(%)KXTAV_5mrc*Eu)9v=p@sxLDk9Uv&r69L zor7UafF<7DZ_c%g(|IeoE@LAg{%(1tY_jkwLnwiK<4vIJ@=pt;7gd+Yd5as=(@TNUb}EA9ZNt9us*Y`sk;Ey!vog5&M$hU+^8~I`Gut%y$yErbKF@ zv1X0|f*Yw*d#+xgt7J#B`p^s0C$HjXJsQdlBa;~&;Z`I@^Sl0}a*dr2+pQ$~!!j|x z-kzOA#mQe2$ozeloYCwj1Q;k64A4!hjK<`wCV^sdRPS&5*!-iEVE@;v=<%nFmMaO1 z?Sg2+n#1?28d>2W>S1I(@{^MHWb!%8NpYzX@nif? zY~i?BStr5L-~NpY9fFkNJnlhh^o`r(*D(~r{o3jk?B!xSV3Rw~LA4-Z2HkbCQoe!X ztiZzU4Y6uYIpUYKD8F=uNp&P)ShEL$zGksYYR-#z29zY)0NFrXP5gzqB%SO2I(X%x zJss}K=q%p8X)nyZQyFK%YemXo!vjCQV)*jd48JKUMpY$LKTItNiC8dyDVvlIQk%Oo za2JdUBl6J8K*4$hk7T(o66?FUNtx9KM@p%>kK}KO?s+n%u@T!}^oUDp;($}Y?5Wxqbh3iXR zKA4VxsR&cT_jL+I6y84T@w|3JeRqK^R+@!pQoqr+>Vp5!yrr5g70M*OOLUA2%bZ}p zh_(W~iv<|$09_z;cmXY};$9A7Gjj?n@<^LuwnQN2=fYBg{c#OqIGnEhd!OqI+maEDO&L){nRg*i z=S?b{BKG8VAXLK_H@Kp%Vu=7qTu4fcM+(J7=@IR!-2W88!^@x9doBDc-|QOii_JO~ zl(hT_O0&@e_}6<4F%DXIju_8lj^MFqFFNQ?lM@n_ z%E}_`r9E)cU)@?W%OWnQLCTT=aHBoH=E5PW-)3FXFsi3cDKcA^mv)h%>x1I&QN4~K zoi3m=RPTj`f4wJ?KSA(i4{*G?xE#69^njnSZp>&E>H~~+9~Y&fa{L5j%jSq@${^bO z_-n=7t4sIs;UhFET;=VNplN~R(JyCCmo)i!-%_&HNUABAHppR{b~s}TE1wRF3<;|lS?|rDqcji}J+po(11>)SUcw4l+De#a{ zBAu^ZqfMw|*&lD>(0FobqEIQIFAG(}g)FgEX#k+K^7rOAh^}24=`aB0&$|YPHThnq zU~2u`?nygrQ7JKdjWY~_ykkcJSOfSG_w=F{O8 z9Du5yqxqP6YoA91^mG}wdq?EX{Q0m*Y06i0%RELV_G?5N$aB7#pi3Tmtug%A68)B+ zZ1~N{rg{&kVU3LY3oE#sRQYTbV~ujvLt``_9!P-hn9hn#gzE449W-t8_txIUYK1x& z;ti@Vl9V_{A-QG!qto)Ip2|+54}Fo~GfSBD5v%MsI7nJWlvPhU zl~}(7TThk95T9NWT_yGoDICJ$!+ceTW?QT!DQMS+>ks*k3g_GM7;gx0t@STM#8;hq zI9yW&wgtmg*vbb=qdC5za6WtB8K}h~EbKe56;W>Na!^`!qu9@&2rl@*Zvzi&HhrH5 zXUHH?Yw}dW56D0SxD4{1m$>R(-?AWrS@i-wO@q!H%@*{qh&e~258c-Ok@pyY0vHiL z)-1>jz?h+Yon`0%o|oRq^zf-REC-)LnaJr9?)2LXp7t ziHe)8)@02=Su3ke1Xy*CUflHHqkAytQtk1jRLp+qcUQT*#TWhIE>oqyYx0rT6664l zeP8uB6YEV^tnHiJ23Xt!2gX*2=^mUm_-mw4k|Y``Hjo;xWa~Qe`KG?u6oRs#S@3z= z41$2)`2rf6TVQ`T?2Q9KkNDSIxKE6&WDAJZf+G#B-dGF+KB{DI)cu=3Z zB%sddrLShmNbpd9I+uh6%AlMGKP>FMV&FGSpe16h;Y$a4%MmGiB!%JLZh}~)Dt=GP z;`Ng6E8l;s`1ghfbE4?)&Z9Pk{+*F@=^*Cf&h-pU0)U0(w3snm}ENH%7_U4(~<0glQEo&9DVVDA{kG(YbkxuGStWrpcu zs+>%^;w7_MbeAbWFQ?sNe!Ka_>l?q#yP>^1hJrRJI74;hH>dz$wK@-_iRA5a zW$s`*rl@~Le5$Q~Z}0vMeNLj+C)=jx&cCqqTQg`jGiwWX{sA*lK^<)~pki;rG3QxvWo>E`|58(34 z$b-A00wrSb#@J#jS9`>Eg*!I-nW_7HK%W{=4x572uT$Hh$bC+Hyq*x`aKyXZBf)Gk z_jCvNtsyirdH+I@VWe=CY0r(1E2ZsKt8_aF;>wo?#~dPt;_kS2R@n~}KOK^EOEJY> zMA;Ql6sKVeY|pxN_KUe5ho$H{K(L6~e482o`Mt|uP=+rk<%y5#+NeQ>?H7gz$7F#= zxvG)ZACGMoV)o>RbO1pG;o`y?t){=jg@SFhmiV2~i5#O|d-1Y*0Y-ALA$yHGCEvnV=1|nk zM1u-c#QqG$IBS;4Gg2^BE2{K+;@v8xAK%C(gouX}g6uSZA;;k!3-9_4)KhjDKz(?U z5A0}l<^ns%Lh~>>wSV%l6}+$o0%( zGT?z_8;kiS>nja6V@ScCpHZd}f}Z_>%&?8H5kp(&Q{2O=(HsA(N3JmITwsYyO;c$= zh=UHlWSjYFL7jius4jJbPOOA@YD#-7>KFdrs@FnP;|*q4d>d|`DZ*>`H0>`lGZa+4 zz_)sx^9ryj|31#Uc|@1l+9W7xYCfpLxpifw@-_*-a3aO5c3H}R%|Rn4R$~#fxb9HZ zy%{E?{>dUqh82+Ja@`c(O#d0_<={LKeCD|Qg*%9a3b7!0=;i67hIt=Ls%K15XZTu1 zRPEnXCC;)KnEYuyW?Xq`g7o%uE0BXKQQY(6{X~c8@kFmjO>f9-?P8JYE|X`i(`qmh zp11IoH?XBF(_02lvXkAfLM~D+NnCmIDgAU&@=^08$Y-e+)B)D^$swQ>oalz+2O_zO z6#TMxM`Rel6Mnd&(Rf14&xiVH3V3&ALhMw+52eNt_IW2=_z>F~5A_`xRwS2VJ5|uB zDQ~o&OJ(#hnk!F*4e5w_;M0Umc0NrDzExk#NxBgb&K(prp zjOByZ^p@*|qXPI@dKi%sH_>r%#Kx->@bVKqObZUpXB|B|j+>2~mVQsKWFmI8=KHIX z@jBg^iolUzin3Cm@ew^s{U=iybo&bL&r!(ftx|`*vJ-TdGG2XjFF!~1( zKzfiZ%Efanp*HR91&&_pJrT11b%-fI5^Xh20is?y;rN!&nrG!@3= zQ)IEf^St?ZPbfrtpUH0h?MbRL>}hC)$zWMx?7V)8wZVq!Gn8Yuut3xH%6Ue`25IhO zDx^)5N7r_p*h0MZ)sKFZ2XGIu2X}Z!$@4UWsZAs9Lv@LCrL$pj4uzch10W`%60(a2H!FMy7?|V zZ@n~HD?*Q@vkkXN0x_m7o81q17N0~zwj6Z!DmS;=bR*gS$VxfDROO;H9ih-NrP^CH zYgFOrNgB1|7%QTeAF$&IM&&j-ZFy1K!pjsX@hbxEfD!bz>;23A7wpwjQ9|rUO1^!l z!`Sk@Pn~Cls!*Ug#ytuf$;MsfDcOu(#ShKcSS%5SBF3Hw6)|b5aA=%?N*~ zZwDjOy@plq_QQON<3(J4ll#n1uWJFuql89?v=w4zZeLVTTrLCjv!p`?&Q9ivBAgSdQnZh`?w2t+P--UJ+>$;%2*dCKWncq5fhSRG2GWA7s zsB%KV-_p7#E?@Ny{M3q7smBT;=W`9jMi6!6Od~P#N=3pj$D~BV-V%#xQ+gUd zmBhp5%iYf%vc~M>M;X8~8d%-;oSvlUl-pfy%5%WEzt;58kcTr1DEXh z_H@}KD)-jSow!V5(){eG0Se{`DfTBQx3TLHTo6kXQTrxFn)T%mlb!I!P6q@x+*>EI@| zpj9OxOfN6s(S)Od3<8MevF@|)SD>7A;7QilBnwb=Ap+<6wVROZSe z`s+u7N0>m_MO!Q66_@#kQo)g~kO=wrdz@!#G+s--+`CsPmgjTH1$b%06tA58n`fPK zTf9mVzWO`ti!`q`au>X;q$E)6fKLV?n(qPv*Eg+M;lXei$d(UaQ+OH+I|gnv{`VU1 z>BfEhx{7Pc(6?03km-!-Lk;W)#!V-^w!Ue%VXhy6PetM9X1S5IJyw0X{*9V zQX$EDxxQ~Q(;ety%2NYmZTg%N~)xD9I{S*@;}8FkTHB= z$A15vI+O3QSBCupFr&QE?N~BI8!4%MoyZsKi6&O9xTbN0BgPIZQlqXEKN$f?RL<(j zuCBV*l;1*d0Wrk8WAD|~?~yKXU%XC!eOY2zG=DrnNRd7>HC&b-(n%egCps-Dg?eCJ z&8yF56Pe#;F3q=V<mMgr)hygiLpg?c70}eYT7a_Ys{c1Ge#=lt7A<0 zdTK(FbFiWjJ6V^Bip!50&E-2vA+Q`c|FH0_X-0sSkZ#%N`jn?VqvmVPc07l&1q)FC z*Q^PgZI>G97}I$ViqeQv3B!OsM;nJsVp^O4YVEgiuF~>=5pZ2&45%au=-S%X8J^M)U>00IwZzdCG>Aeh|7DCS~mN`Zg} z9@oiY%^e_{tUrEZfjf%v_{h}*Z(qbgKqnc2nC3n*uz89 zii5S_Z&{T67OkEmZEB2=?!eHixv&z0*8%-de>;GX;uYj`6>{tt0WI^lKp9CMJ`oKW{4g=e zJ+J&H)uiCV2jIX6s(!!XgbP9rbP4>(L+k&3*}O%u*U@U}%1L=f-n$xAgM^#uho_ES zPbB2{d1t(pTj*xAP;jXaC+Z>yJ_lV^l zoBrVY-{b%PdkjCSGG5*5Z*W-%__;(Mw@~LD5Y__wqh3>CLX=SIPd=s^* z@)rDNzN}Vom;lJnT9@33XRTJ0p#Hcz@2v_pg2zx>Q|cx11tzpenvHP(olRXY`5GZV zvzzC|EhF8}))FDS!BforH;&rRi*De!cb~Z9GLE=(9JYWz1>>wC>v0Nyeah=|7^{%> zfiLmbv{KboJViokolTwZIJM1#{x>r#oL0X`hHE1I7e_J1g2?{6o2XS*$l~)QF|HK0 zY)5eZ&Z1fA_V`HAe83S!573!?9>U_+r){Wp_-px0@l}hGg3u^f0&6-}`Y@#1m&A&` zLC;Fdzzl&mjSheUkAm1+Ky?r(+2{HfXR@ZjEw+yk%LPS)n$hL^DpQ$TEupx;4bA5{b@i*)@(z+T%ULXSU!WB5Vfz%}JmGuzt z?TT1xf`x?$C3(%BH{x_n$$J9rg$izh%b&VodND|z`JyLCGPypO!o$RG`F+xSZ!a8F z=F`6EWe+j#`ORfUA8CKD)%4oC(w;Zr*aD)>1NU}a;2|o!gisl7D>QsPKLw6T*p)Sm z7Gn|o8wY*>-}-1Mi4hGPk`!n`kp3INcs+!lP5zdvPJf7d-hb%kojTL-D-49 zUCqD+MuqwXk%a!i;4Arvce0H^u6plWB`96C%}c%gFh0}A`ejE1g0##GLv35|zD<I7XR2(K`lEiFBNgeXGl@JKq$fk}NE(D>1YY z7#H9GmHzby4%8-OmL2|?oGZ({`p}5AbBYbhf9K5A3RgM7(s@eNrTv#w+baGg=tDB| zLLt=7>yhsvXXKW(IljUj3<0V9Kum=sdY4Tw&BRavY;C4}2pv7HGv)%`{5C+yz-GZg zoq8JB~GE9ph!oX>xvXi;nU|m&By}Lu#6$5KL?ERvs9awnt{BO45m5R}wCs9Q<4jzvtJd zs30Nwg6#M*gwJ0RA&18QVPZ)BeC)OI$0WlY^Mny;$-DHu{{1a87j)2jzKR|q#9)wa zYPSfzQ@I1MvbN4s2hhW=XK1rg1}^yv+-xuNM*EFGPrtDNa?yA5AQolH>lYqJiQ9YzPA*MN&gP32D!%vZXx_Y#_MO*#+e)z3Eo-`2y%cmZWj%6e#d$O`PO@ZPxPu z`E_PzQDyg!!ci2=$k(4zi4y^(jJx9KbMDR`Dve(2ON4z(mIe{}>Z=h-kU3bQqdQxE zedH}`<21!Sd~&#d@VrWO{_PuTetbqK-}gW1vzG%>V-#|dmR z`&xR(Jw#8_@_JvKjNQ;cuV@y`X$MSI(`_>|B8=nrTKOdDdTSM@ci= zVR}ABRnI;E*eTDne-G7IHE(g6YxO3wssF{8=WKG>v-nwU_mqi-!QQ0{5lPj0G`7

    qDy>J*8Sx~oM@7L-_tx#1|T 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 Kopq9WNCyCDYmc`8 literal 0 HcmV?d00001

    3f%zMg3;z3UedqKtp${=%a!+?SRrO zH#@5y!+3e#$mrO}eyncT^!3$i1wD@G#my6+5LrroIVMuA?KmGnsHXjjc|`rceW^~l zJx>CT4wZi_%dxc-zA4Q~uvRM8;)8)^gw~^dGiae0mdn?J@~dqNr&o>!cFq8IfG*Ih zQ4mZ*AIU)8;{#Fr1-RNn?$?PcXCUk9a3OM=L=xVE*}X{`{h?CBGWtpz9V0qgW&<4o z9bVom$oM1gDIo==9$1GGI_IAe5c|^xg8^&r7HMc+!EwO%%dRP`9Kc$kS^9jU)1Ef~ zLt?M}+Cq(sITzGL8Ezg^X6;j@PX`7a-G=KvuhLJppQ8m~;EEWSp{*{P<^aT*Z)ZOS z8nH_m84Vv$#nd$2`@ypBACjgjSdwaqCHUP@=z{m)5g%)|A|B-WOArsh1l zkOH+XbaWCKFv&v$YRt-#^LpeYB?tZoW#G{E8gWC9AM|y@xyRX)(H{k`e5Bb$oi30oM{a8cAFR~;fji(9oL|8?Y#O$+76!)r(k;2a=&by6@q`}QVZtJkcTw9 ztyOnlYA)Cpuv~fj)YQAVFbV!_+nW!1%6PD6+I&*avh5q?du)b7P4a^7!h-CDQr{O5 zs}oPrY22<(gL8bWN{kOhsg4TWV1{m4RTB@lIIH{t@RRDFl=BCb`Q=5(Nkk9zMX~+G z@wZrC3N459A&_GgcT($RoD!MNvJ=TaH9pOUC)+vGdW?HLo1Rr^wnioDuFGJ8+wu1z zwHfer+Ej(b+_|Kt;xXa(l&vER%g+@#K8T6+!8OW^UR(K;L0^f9@eGTz#P2Fq57z-L z;q7jo&U(~$uX6i;UfsyX#(xUh!9gm@LVClY6NKvXf+rwXrJ%QA{3{^R2n2=@WQ(U-KTpxE;$y`Rtz2%RnJ)rc5V5}BL#QH@sjW78%)yaDz&=ipZrw?g@y4a G96$gy92n97 literal 0 HcmV?d00001 diff --git a/infrastructure/internal/src/main/resources/static/assets/img/screenshots/pc_3.webp b/infrastructure/internal/src/main/resources/static/assets/img/screenshots/pc_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..62a764ffb3eeb0565ca36d41f2bcbb136ad6f4dc GIT binary patch literal 12492 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 literal 0 HcmV?d00001 diff --git a/infrastructure/internal/src/main/resources/static/assets/js/bs-init.js b/infrastructure/internal/src/main/resources/static/assets/js/bs-init.js new file mode 100644 index 0000000..fc46900 --- /dev/null +++ b/infrastructure/internal/src/main/resources/static/assets/js/bs-init.js @@ -0,0 +1,46 @@ + +if (window.innerWidth < 768) { + [].slice.call(document.querySelectorAll('[data-bss-disabled-mobile]')).forEach(function (elem) { + elem.classList.remove('animated'); + elem.removeAttribute('data-bss-hover-animate'); + elem.removeAttribute('data-aos'); + elem.removeAttribute('data-bss-parallax-bg'); + elem.removeAttribute('data-bss-scroll-zoom'); + }); +} + +document.addEventListener('DOMContentLoaded', function() { + + var hoverAnimationTriggerList = [].slice.call(document.querySelectorAll('[data-bss-hover-animate]')); + var hoverAnimationList = hoverAnimationTriggerList.forEach(function (hoverAnimationEl) { + hoverAnimationEl.addEventListener('mouseenter', function(e){ e.target.classList.add('animated', e.target.dataset.bssHoverAnimate) }); + hoverAnimationEl.addEventListener('mouseleave', function(e){ e.target.classList.remove('animated', e.target.dataset.bssHoverAnimate) }); + }); + + var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bss-tooltip]')); + var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }) + + var toastTriggers = document.querySelectorAll('[data-bs-toggle="toast"]'); + + for (let toastTrigger of toastTriggers) { + toastTrigger.addEventListener('click', function () { + var toastSelector = toastTrigger.getAttribute('data-bs-target'); + + if (!toastSelector) return; + + try { + var toastEl = document.querySelector(toastSelector); + + if (!toastEl) return; + + var toast = new bootstrap.Toast(toastEl); + toast.show(); + } + catch(e) { + console.error(e); + } + }) + } +}, false); \ No newline at end of file diff --git a/infrastructure/internal/src/main/resources/static/assets/js/cmmn/algolia.mjs b/infrastructure/internal/src/main/resources/static/assets/js/cmmn/algolia.mjs new file mode 100644 index 0000000..a8a3bbe --- /dev/null +++ b/infrastructure/internal/src/main/resources/static/assets/js/cmmn/algolia.mjs @@ -0,0 +1,83 @@ +const algoliasearch = window['algoliasearch']; +const { autocomplete, getAlgoliaResults } = window["@algolia/autocomplete-js"]; + +const appId = 'DZSY6U0S0J'; +const apiKey = '6558cbc4f72828fe1cdad3d2a87264cb'; +const searchClient = algoliasearch(appId, apiKey); + +document.body.setAttribute('data-theme', document.documentElement.getAttribute('data-bs-theme')); + +function debouncePromise(fn, time) { + let timerId = undefined; + + return function debounced(...args) { + if (timerId) { + clearTimeout(timerId); + } + + return new Promise((resolve) => { + timerId = setTimeout(() => resolve(fn(...args)), time); + }); + }; +} + +const debounced = debouncePromise((items) => Promise.resolve(items), 250); + + +$(autocomplete({ + container: '#autocomplete', + placeholder: '그릇, 가방...', + openOnFocus: false, + getSources({ query }) { + return debounced([ + { + getItems() { + return getAlgoliaResults({ + searchClient, + queries: [ + { + indexName: 'waste_collection', + query, + params: { + hitsPerPage: 5 + } + } + ] + }); + }, + getItemUrl({ item }) { + return "dictionary/" + item.dicNo; + }, + templates: { + detachedCancelButtonText: "asd", + item({ item, components, html }) { + return html` + +