From 242fad1691917c4fd82c7f04b6190a7113628e93 Mon Sep 17 00:00:00 2001 From: wayne <wayne8692wayne8692@gmail.com> Date: 星期五, 11 三月 2022 15:31:04 +0800 Subject: [PATCH] Merge branch 'pollex-dev' into sit --- pamapi/src/main/resources/i18n/messages.properties | 2 pamapi/src/test/java/com/pollex/pam/web/rest/PublicUserResourceIT.java | 6 pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java | 28 + PAMapp/pages/agentInfo/edit/_agentNo.vue | 42 ++ pamapi/src/main/java/com/pollex/pam/service/OtpUtilService.java | 17 pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantLoginValidateResource.java | 8 pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java | 8 pamapi/src/main/java/com/pollex/pam/aop/logging/LoggingAspect.java | 2 pamapi/src/main/java/com/pollex/pam/web/rest/InterviewRecordResource.java | 18 pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java | 123 ------ pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java | 8 pamapi/src/main/resources/templates/mail/appointmentPendingNotifyEmail.html | 2 pamapi/src/doc/顧問API/編輯修改顧問資料.txt | 3 pamapi/src/main/resources/config/application-dev.yml | 2 pamapi/src/main/java/com/pollex/pam/config/WebsocketConfiguration.java | 2 PAMapp/pages/questionnaire/_agentNo.vue | 18 pamapi/src/test/java/com/pollex/pam/web/rest/UserJWTControllerIT.java | 6 PAMapp/components/AddAndReservedBtns.vue | 11 pamapi/src/test/java/com/pollex/pam/config/NoOpMailConfiguration.java | 2 pamapi/src/main/java/com/pollex/pam/web/rest/errors/ExceptionTranslator.java | 9 pamapi/src/main/resources/config/application-pollex.yml | 2 PAMapp/pages/agentInfo/_agentNo.vue | 36 +- pamapi/src/main/java/com/pollex/pam/web/rest/PersonalNotificationResource.java | 27 pamapi/src/main/resources/i18n/messages_zh_TW.properties | 2 pamapi/src/main/java/com/pollex/pam/config/CacheConfiguration.java | 10 PAMapp/components/Client/ClientCard.vue | 4 PAMapp/shared/services/query-consultant.service.ts | 12 PAMapp/store/localStorage.ts | 3 pamapi/src/main/java/com/pollex/pam/web/rest/UserResource.java | 20 pamapi/src/main/java/com/pollex/pam/web/rest/CustomerInfoResource.java | 6 PAMapp/shared/const/quickFilter-questionList.ts | 12 pamapi/src/doc/sql/20220221_w.sql | 21 + pamapi/src/main/java/com/pollex/pam/security/provider/CustomAuthenticationProvider.java | 2 pamapi/src/main/java/com/pollex/pam/security/token/OtpAuthenticationToken.java | 5 pamapi/src/main/java/com/pollex/pam/security/provider/OtpAuthenticationProvider.java | 12 pamapi/src/main/resources/config/application-prod.yml | 3 pamapi/src/main/java/com/pollex/pam/config/DatabaseConfiguration.java | 6 pamapi/src/main/java/com/pollex/pam/config/WebsocketSecurityConfiguration.java | 2 pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentMemoResource.java | 21 PAMapp/store/index.ts | 8 pamapi/src/doc/sql/20220217_w.sql | 2 pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java | 2 pamapi/src/main/resources/config/application-sit.yml | 2 pamapi/src/main/java/com/pollex/pam/service/CustomerService.java | 22 pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java | 21 pamapi/src/main/java/com/pollex/pam/security/SpringSecurityAuditorAware.java | 4 PAMapp/shared/models/account.model.ts | 5 pamapi/pom.xml | 9 PAMapp/nuxt.config.js | 1 PAMapp/shared/const/hide-reviews.ts | 2 pamapi/src/test/java/com/pollex/pam/web/rest/AccountResourceIT.java | 21 PAMapp/pages/appointment/_appointmentId/index.vue | 6 pamapi/src/doc/顧問API/指定顧問詳細資訊.txt | 4 pamapi/src/main/java/com/pollex/pam/web/rest/UserJWTController.java | 2 pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java | 34 +- pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java | 7 pamapi/src/test/java/com/pollex/pam/web/rest/UserResourceIT.java | 14 pamapi/src/main/java/com/pollex/pam/security/DomainUserDetailsService.java | 4 pamapi/src/main/java/com/pollex/pam/web/rest/AccountResource.java | 33 - pamapi/src/main/java/com/pollex/pam/web/rest/EServiceResource.java | 14 PAMapp/pages/appointment/_appointmentId/close/index.vue | 8 /dev/null | 66 --- pamapi/src/main/java/com/pollex/pam/config/SecurityConfiguration.java | 2 pamapi/src/test/java/com/pollex/pam/ArchTest.java | 4 PAMapp/components/Interview/InterviewMsg.vue | 17 pamapi/src/main/resources/config/application-uat.yml | 2 pamapi/src/doc/顧問API/將顧問加入客戶的清單.txt | 13 pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java | 96 ---- pamapi/src/main/java/com/pollex/pam/web/rest/NoticeResource.java | 22 pamapi/src/main/java/com/pollex/pam/web/rest/SatisfactionResource.java | 18 pamapi/src/main/java/com/pollex/pam/web/rest/PublicUserResource.java | 4 71 files changed, 447 insertions(+), 545 deletions(-) diff --git a/PAMapp/components/AddAndReservedBtns.vue b/PAMapp/components/AddAndReservedBtns.vue index f2f3177..14d3cfb 100644 --- a/PAMapp/components/AddAndReservedBtns.vue +++ b/PAMapp/components/AddAndReservedBtns.vue @@ -14,6 +14,8 @@ import { Vue, Component, Prop, Emit, Action, State, namespace } from 'nuxt-property-decorator'; import { Consultant } from '~/shared/models/consultant.model'; +const roleStorage = namespace('localStorage'); + @Component export default class AddAndReservedBtns extends Vue { @@ -29,6 +31,9 @@ @Prop() cusClass!: string; + @roleStorage.Getter + isUserLogin!: boolean; + isVisiblePopUp = false; ////////////////////////////////////////////////////////////////////// @@ -41,6 +46,12 @@ ////////////////////////////////////////////////////////////////////// addConsultant(item: Consultant): void { + if (!this.isUserLogin) { + item = { + ...item, + updateTime: new Date().toISOString() + }; + } this.addToMyConsultantList(item).then(addOk => { addOk && this.openPopUp(); }); diff --git a/PAMapp/components/Client/ClientCard.vue b/PAMapp/components/Client/ClientCard.vue index 7cbde5d..9f11d09 100644 --- a/PAMapp/components/Client/ClientCard.vue +++ b/PAMapp/components/Client/ClientCard.vue @@ -77,12 +77,12 @@ v-else-if="client.communicateStatus === contactStatus.CONTACTED"> 蝯�� </div> - <div + <!-- <div class="invite-msg smTxt_bold" @click.stop="inviteReview" v-else-if="!client.satisfactionScore"> ��遛��漲 - </div> + </div> --> <div class="date xsTxt text--black" diff --git a/PAMapp/components/Interview/InterviewMsg.vue b/PAMapp/components/Interview/InterviewMsg.vue index bc76c75..61aaa8d 100644 --- a/PAMapp/components/Interview/InterviewMsg.vue +++ b/PAMapp/components/Interview/InterviewMsg.vue @@ -102,11 +102,12 @@ } addInterview() { + const message = this.getMessage(); const appointmentInformation: ToInformAppointment = { appointmentId: this.client.id, email : this.client?.email, interviewDate: this.interviewTime, - message : this.interviewTxt, + message, phone : this.client?.phone, }; appointmentService.informAppointment(appointmentInformation).then((_) => { @@ -121,6 +122,20 @@ this.getMyAppointmentList(); } + private getMessage(): string { + const targetDate = new Date(this.interviewTime); + const interviewTime = `${targetDate.getFullYear()}撟�${targetDate.getMonth() + 1}���${targetDate.getDate()}� ${targetDate.getHours()}���${targetDate.getMinutes()}��; + let result = ''; + if(this.loginConsultant.phoneNumber && this.loginConsultant.email) { + result = "�憟踝��靽���像����憿批��" + this.loginConsultant.name + "嚗�����������銝膩������蝜�"+"\n" + interviewTime + "\n" +"隞乩����閰梯�Ⅳ/Email嚗�"+"\n" + this.loginConsultant.phoneNumber + "\n" + this.loginConsultant.email + "\n"+"�甇斗���靘選����蝜恬�����"} + else if (!this.loginConsultant.phoneNumber && this.loginConsultant.email) { + result = "�憟踝��靽���像����憿批��" + this.loginConsultant.name + "嚗�����������銝膩������蝜�"+"\n" + interviewTime + "\n" +"隞乩����mail嚗�"+"\n" + this.loginConsultant.email + "\n"+"�甇斗���靘選����蝜恬�����" + } else { + result = "�憟踝��靽���像����憿批��" + this.loginConsultant.name + "嚗�����������銝膩������蝜�"+"\n" + interviewTime + "\n" +"隞乩����閰梯�Ⅳ嚗�"+"\n" + this.loginConsultant.phoneNumber + "\n"+"�甇斗���靘選����蝜恬�����" + } + return result; + } + get isBtnDisabled() :Boolean { const isFormValid = this.client.phone ? this.interviewTxt && this.interviewTime :this.interviewTxt return !isFormValid diff --git a/PAMapp/nuxt.config.js b/PAMapp/nuxt.config.js index 73033a1..ea5ad7f 100644 --- a/PAMapp/nuxt.config.js +++ b/PAMapp/nuxt.config.js @@ -72,6 +72,7 @@ }, router: { base: process.env.ENV === 'uat' ? '/pam/' : '', + mode: 'hash', middleware: ['getUrlQuery', 'errorRoute'] } } diff --git a/PAMapp/pages/agentInfo/_agentNo.vue b/PAMapp/pages/agentInfo/_agentNo.vue index 9313a1a..972609c 100644 --- a/PAMapp/pages/agentInfo/_agentNo.vue +++ b/PAMapp/pages/agentInfo/_agentNo.vue @@ -1,5 +1,5 @@ <template> - <div> + <div v-if="!!agentInfo"> <el-row type="flex" justify="center"> @@ -32,6 +32,15 @@ class="pam-paragraph"> <UiField :span="12" icon="phone" label="����Ⅳ"> {{ agentInfo.phoneNumber }} + </UiField> + </el-row> + + <el-row + v-if="currentRole === role.ADMIN" + type="flex" + class="pam-paragraph"> + <UiField :span="12" icon="comment" label="靽∠拳"> + {{ agentInfo.email }} </UiField> </el-row> @@ -104,22 +113,9 @@ <el-row type="flex" class="pam-paragraph"> - <el-col :span="24" class="pam-field"> - <div class="pam-field__label pam-progress__label"> - <div> - <div class="pam-field__title"> - <i class="pam-icon icon-thumbs-up" - ></i>隢株岷摨西”� <i class="pl-5 text--primary icon-information" @click="alertFieldInfo('evaluation')"></i> - </div> - </div> - <div class="xsTxt"> - {{ agentInfo.evaluation }}/50 (餈����/蝝航��) - </div> - </div> - <div class="pam-field__content pam-field-evaluation pt-10"> - <el-progress :show-text="false" :stroke-width="15" :percentage="agentInfo.evaluation * 2"></el-progress> - </div> - </el-col> + <UiField icon="thumbs-up" label="隢株岷摨西”�"> + {{ agentInfo.nearlyMonthAppointmentCount || 0 }} / {{ agentInfo.allAppointmentCount || 0 }} (餈����/蝝航��) + </UiField> </el-row> <div class="consultant-edit-btn"> @@ -264,11 +260,13 @@ } get agentName(): string { - return `${this.agentInfo.name}(${this.agentInfo.role})`; + if (!this.agentInfo) return ''; + return `${this.agentInfo?.name}(${this.agentInfo?.role})`; } get displayCommunicationStyleList(): string[] { - return this.agentInfo.communicationStyle.split('��').filter((item) => item); + if (!this.agentInfo) return []; + return this.agentInfo?.communicationStyle.split('��').filter((item) => item); } } diff --git a/PAMapp/pages/agentInfo/edit/_agentNo.vue b/PAMapp/pages/agentInfo/edit/_agentNo.vue index ae47457..0d961b4 100644 --- a/PAMapp/pages/agentInfo/edit/_agentNo.vue +++ b/PAMapp/pages/agentInfo/edit/_agentNo.vue @@ -1,5 +1,5 @@ <template> - <div class="edit-agent-info-page"> + <div class="edit-agent-info-page" v-if="!!agentInfo"> <el-row type="flex" @@ -64,6 +64,27 @@ :class="{'is-invalid': !phoneValid}" maxlength="10" minlength="10"></el-input> + </div> + </el-col> + </el-row> + + <el-row + type="flex" + class="pam-paragraph"> + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title mb-10"> + <i class="pam-icon icon-comment" + ></i>靽∠拳 + <span class="hint text--bold" v-show="!emailValid">靽∠拳�撘�炊</span> + <span class="hint text--bold" v-show="editInfoValue.email.length === 0">靽∠拳�敹‵</span> + </div> + </div> + <el-input + v-model="editInfoValue.email" + :class="{'is-invalid': !emailValid}" + ></el-input> </div> </el-col> </el-row> @@ -294,7 +315,8 @@ awards : '', communicationStyle: [] as string[], photoBase64 : '', - phoneNumber : '' + phoneNumber : '', + email : '', }; communicationStyleList: string[] = agentCommunicationStyleList; @@ -375,7 +397,8 @@ experiences : agentInfo.experiences || '', awards : agentInfo.awards || '', communicationStyle: agentInfo.communicationStyle || '', - photoBase64 : '' + photoBase64 : '', + email : agentInfo.email || '' }; this.editInfoValue = { @@ -386,14 +409,17 @@ } } + ////////////////////////////////////////////////////////////////////// editAgentInfoSetting(): void { + console.log('???', this.editInfoValue) const editSettingInfo: any = { ...this.editInfoValue, communicationStyle: this.editInfoValue.communicationStyle.join('��'), serveArea: this.editInfoValue.serveArea.join('��'), - } + }; + console.log('!!!', editSettingInfo); accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => { this.isInfoUpdate = true; this.updateConsultantDetail(editSettingInfo.agentNo); @@ -437,6 +463,11 @@ : true; } + get emailValid() { + const rule = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; + return this.editInfoValue.email ? rule.test(this.editInfoValue.email) : true; + } + get isSubmitBtnDisabled(): boolean { const isFormValid = this.editInfoValue.name && this.editInfoValue.title @@ -447,7 +478,8 @@ && this.editInfoValue.phoneNumber.length && this.editInfoValue.seniorityYear && this.editInfoValue.expertise.length - && this.editInfoValue.communicationStyle.length; + && this.editInfoValue.communicationStyle.length + && this.editInfoValue.email.length; return !isFormValid } } diff --git a/PAMapp/pages/appointment/_appointmentId/close/index.vue b/PAMapp/pages/appointment/_appointmentId/close/index.vue index 3fe2dae..222f6b3 100644 --- a/PAMapp/pages/appointment/_appointmentId/close/index.vue +++ b/PAMapp/pages/appointment/_appointmentId/close/index.vue @@ -17,7 +17,7 @@ class="pam-paragraph" style="flex-direction: column"> <UiField label="頨怠�����/撅�����" :labelSize="20" class="required"> <input - class="appointment-client-detail-close__input" + class="appointment-client-detail-close__input mt-10" :class="{'is-invalid':!identityIdValid}" v-model="appointmentCloseInfo.policyholderIdentityId" placeholder="隢撓�" @@ -33,7 +33,7 @@ class="pam-paragraph"> <UiField label="���誨蝣噗lan Code" :labelSize="20" class="required"> <input - class="appointment-client-detail-close__input" + class="appointment-client-detail-close__input mt-10" v-model="appointmentCloseInfo.planCode" placeholder="隢撓�" type="text"> @@ -46,6 +46,7 @@ <UiField label="�脖辣����" :labelSize="20" class="required"> <DateTimePicker :defaultValue="appointmentCloseInfo.policyEntryDate" + class="mt-10" @changeDateTime="appointmentCloseDate = $event"></DateTimePicker> </UiField> </el-row> @@ -56,7 +57,7 @@ class="pam-paragraph"> <UiField label="���漱����" :labelSize="20" class="required"> <UiSelect :closeReason.sync="appointmentCloseInfo.closedReason" - :options="appointmentFailReason"/> + :options="appointmentFailReason" class="mt-10"/> </UiField> <input v-if="appointmentCloseInfo.closedReason === 'other' @@ -73,6 +74,7 @@ class="pam-paragraph"> <UiField label="��酉" :labelSize="20"> <el-input + class="mt-10" type="textarea" :rows="3" placeholder="隢撓�" diff --git a/PAMapp/pages/appointment/_appointmentId/index.vue b/PAMapp/pages/appointment/_appointmentId/index.vue index ec303f0..7b49df1 100644 --- a/PAMapp/pages/appointment/_appointmentId/index.vue +++ b/PAMapp/pages/appointment/_appointmentId/index.vue @@ -1,5 +1,5 @@ <template> - <div class="appointment-client-detail-page"> + <div class="appointment-client-detail-page" v-if="!!appointmentDetail"> <div class="date-detail"> <div>{{ appointmentDetail.appointmentDate | formatDate }}����</div> <div>{{ appointmentDetail.consultantReadTime | formatDate }} @@ -55,9 +55,9 @@ </div> </div> - <div class=" btn-center" v-if="showWhenAppointmentHasClosed"> + <!-- <div class=" btn-center" v-if="showWhenAppointmentHasClosed"> <el-button @click="inviteReview">��遛��漲</el-button> - </div> + </div> --> <div class="client-detail-action" v-if="showWhenAppointmentHasContacted"> <el-button @click="closeAppointment" class="desktop-client-detail-action-btn" >蝯��</el-button> diff --git a/PAMapp/pages/communication/consult.vue b/PAMapp/pages/communication/consult.vue deleted file mode 100644 index 409fe02..0000000 --- a/PAMapp/pages/communication/consult.vue +++ /dev/null @@ -1,3 +0,0 @@ -<template> - <div>隢株岷</div> -</template> \ No newline at end of file diff --git a/PAMapp/pages/communication/index.vue b/PAMapp/pages/communication/index.vue deleted file mode 100644 index becae6b..0000000 --- a/PAMapp/pages/communication/index.vue +++ /dev/null @@ -1,3 +0,0 @@ -<template> - <div>���隢株岷</div> -</template> \ No newline at end of file diff --git a/PAMapp/pages/communication/myDemand.vue b/PAMapp/pages/communication/myDemand.vue deleted file mode 100644 index a7f5774..0000000 --- a/PAMapp/pages/communication/myDemand.vue +++ /dev/null @@ -1,3 +0,0 @@ -<template> - <div>隢株岷��撓���鞈��</div> -</template> \ No newline at end of file diff --git a/PAMapp/pages/questionnaire/_agentNo.vue b/PAMapp/pages/questionnaire/_agentNo.vue index 213a636..bf703e4 100644 --- a/PAMapp/pages/questionnaire/_agentNo.vue +++ b/PAMapp/pages/questionnaire/_agentNo.vue @@ -336,7 +336,6 @@ private setMyRequest(): void { const storageMyRequest = getRequestsFromStorage(); const storageMyRequirement = this.recommendConsultantItem ? JSON.parse(this.recommendConsultantItem).requirements:[]; - const contactTypePromise = accountSettingService.getUserAccountSetting(); if (storageMyRequest) { this.myRequest = { @@ -358,12 +357,15 @@ removeRequestQuestionFromStorage(); } - contactTypePromise.then((contactTypeDetail) => { - this.myRequest = { - ...this.myRequest, - ...contactTypeDetail - } - }) + if (authService.isUserLogin()) { + accountSettingService.getUserAccountSetting().then((contactTypeDetail) => { + this.myRequest = { + ...this.myRequest, + ...contactTypeDetail + } + }) + } + } @@ -433,7 +435,7 @@ if (this.isEditBtn) { this.editAppointmentDemand(); } else { - queryConsultantService.addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand()); + queryConsultantService.addFavoriteConsultant([{ agentNo: this.$route.params.agentNo, createdTime: new Date().toISOString()}]).then(res => this.sentAppointmentDemand()); } const editSettingInfo: UserSetting = { name: this.myRequest.name, diff --git a/PAMapp/pages/recommendConsultant/criteria.vue b/PAMapp/pages/recommendConsultant/criteria.vue deleted file mode 100644 index 039388e..0000000 --- a/PAMapp/pages/recommendConsultant/criteria.vue +++ /dev/null @@ -1,3 +0,0 @@ -<template> - <div>������(����)</div> -</template> \ No newline at end of file diff --git a/PAMapp/shared/const/hide-reviews.ts b/PAMapp/shared/const/hide-reviews.ts index 35d2e34..0961710 100644 --- a/PAMapp/shared/const/hide-reviews.ts +++ b/PAMapp/shared/const/hide-reviews.ts @@ -1 +1 @@ -export const hideReviews = false; +export const hideReviews = true; diff --git a/PAMapp/shared/const/quickFilter-questionList.ts b/PAMapp/shared/const/quickFilter-questionList.ts index 3539755..b00bd67 100644 --- a/PAMapp/shared/const/quickFilter-questionList.ts +++ b/PAMapp/shared/const/quickFilter-questionList.ts @@ -12,12 +12,12 @@ ], type: 'radio' }, - { - name: 'avgScore', - title: '憿批�遛��漲', - detail: [], - type: '' - }, + // { + // name: 'avgScore', + // title: '憿批�遛��漲', + // detail: [], + // type: '' + // }, { name: 'communicationStyles', title: '皞�◢�', diff --git a/PAMapp/shared/models/account.model.ts b/PAMapp/shared/models/account.model.ts index f2e0e03..f433c6c 100644 --- a/PAMapp/shared/models/account.model.ts +++ b/PAMapp/shared/models/account.model.ts @@ -17,8 +17,9 @@ seniorityYear : number; seniorityMonth : number; concept : string; - experiences : string; - awards : string; + experiences : string; + awards : string; communicationStyle: string; photoBase64 : string; + email : string; } diff --git a/PAMapp/shared/services/query-consultant.service.ts b/PAMapp/shared/services/query-consultant.service.ts index 8a5a139..fdc5507 100644 --- a/PAMapp/shared/services/query-consultant.service.ts +++ b/PAMapp/shared/services/query-consultant.service.ts @@ -23,8 +23,11 @@ } // ��憿批�� - async addFavoriteConsultant(agentNoList: string[]) { - return http.post('/consultant/favorite', { agentNoList }); + async addFavoriteConsultant(addFavoriteConsultantList: AddFavoriteConsultantItem[]) { + const payload = { + consultantList: addFavoriteConsultantList + }; + return http.post('/consultant/favorite', payload); } // ����岷��� @@ -35,3 +38,8 @@ } export default new QueryConsultantService(); + +export interface AddFavoriteConsultantItem { + agentNo : string; + createdTime: string; +} diff --git a/PAMapp/store/index.ts b/PAMapp/store/index.ts index b4cd250..9dd6256 100644 --- a/PAMapp/store/index.ts +++ b/PAMapp/store/index.ts @@ -1,7 +1,7 @@ import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' import myConsultantService from '~/shared/services/my-consultant.service'; -import queryConsultantService from '~/shared/services/query-consultant.service'; +import queryConsultantService, { AddFavoriteConsultantItem } from '~/shared/services/query-consultant.service'; import reviewsService from '~/shared/services/reviews.service'; import { Consultant } from '~/shared/models/consultant.model'; import { getFavoriteFromStorage, setFavoriteToStorage } from '~/shared/storageConsultant'; @@ -78,8 +78,8 @@ if (localData?.length) { - const agentNoList = localData.map(i => i.agentNo) - await queryConsultantService.addFavoriteConsultant(agentNoList).then(res => { + const addFavoriteAgentList: AddFavoriteConsultantItem[] = localData.map(i => ({ agentNo: i.agentNo, createdTime: i.updateTime})); + await queryConsultantService.addFavoriteConsultant(addFavoriteAgentList).then(res => { localStorage.removeItem('favoriteConsultant') }) } @@ -114,7 +114,7 @@ if (!found) { const newData = [consultantToAdd].concat(this.myConsultantList); if (this.isUserLogin) { - await queryConsultantService.addFavoriteConsultant([consultantToAdd.agentNo]) + await queryConsultantService.addFavoriteConsultant([{ agentNo: consultantToAdd.agentNo, createdTime: consultantToAdd.updateTime }]) } else { setFavoriteToStorage(newData); } diff --git a/PAMapp/store/localStorage.ts b/PAMapp/store/localStorage.ts index 6fd79e3..d1fd32c 100644 --- a/PAMapp/store/localStorage.ts +++ b/PAMapp/store/localStorage.ts @@ -110,6 +110,9 @@ localStorage.removeItem('consultant_id'); localStorage.removeItem('appointment'); localStorage.removeItem('login_consultant'); + localStorage.removeItem('notContactAppointmentIdFromMsg'); + localStorage.removeItem('satisfactionIdFromMsg'); + localStorage.removeItem('appointmentIdFromMsg'); this.id_token = localStorage.getItem('id_token'); this.current_role = localStorage.getItem('current_role'); this.consultant_id = localStorage.getItem('consultant_id'); diff --git a/pamapi/pom.xml b/pamapi/pom.xml index a070277..500eb4e 100644 --- a/pamapi/pom.xml +++ b/pamapi/pom.xml @@ -101,6 +101,11 @@ <dependencies> <dependency> + <groupId>com.pollex.pam.business</groupId> + <artifactId>PamBusiness</artifactId> + <version>1.0-SNAPSHOT</version> + </dependency> + <dependency> <groupId>tech.jhipster</groupId> <artifactId>jhipster-framework</artifactId> </dependency> @@ -344,6 +349,10 @@ <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + </dependency> <!-- diff --git a/pamapi/src/doc/sql/20220217_w.sql b/pamapi/src/doc/sql/20220217_w.sql new file mode 100644 index 0000000..f084b18 --- /dev/null +++ b/pamapi/src/doc/sql/20220217_w.sql @@ -0,0 +1,2 @@ +ALTER TABLE public.consultant ADD status varchar NULL; +UPDATE public.consultant SET status = 'AVAILABLE'; diff --git a/pamapi/src/doc/sql/20220221_w.sql b/pamapi/src/doc/sql/20220221_w.sql new file mode 100644 index 0000000..2e24808 --- /dev/null +++ b/pamapi/src/doc/sql/20220221_w.sql @@ -0,0 +1,21 @@ +CREATE TABLE public.audit_logging ( + id bigserial NOT NULL, + functional_type varchar NULL, + "content" varchar NULL, + created_by varchar NULL, + created_date timestamp NULL, + CONSTRAINT audit_logging_pk PRIMARY KEY (id) +); + +ALTER TABLE public.consultant ADD latest_login_time timestamp NULL; + +update consultant set latest_login_time = (select login_date from login_record where account = 'A183619275' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'A183619275'; +update consultant set latest_login_time = (select login_date from login_record where account = 'AGAM11249699' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'AGAM11249699'; +update consultant set latest_login_time = (select login_date from login_record where account = 'Z152717443' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'Z152717443'; +update consultant set latest_login_time = (select login_date from login_record where account = 'D265260662' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'D265260662'; +update consultant set latest_login_time = (select login_date from login_record where account = 'AG0109051204' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'AG0109051204'; +update consultant set latest_login_time = (select login_date from login_record where account = 'B282677963' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'B282677963'; +update consultant set latest_login_time = (select login_date from login_record where account = 'AG0101234567' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'AG0101234567'; +update consultant set latest_login_time = (select login_date from login_record where account = 'X147309614' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'X147309614'; +update consultant set latest_login_time = (select login_date from login_record where account = 'J149388015' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'J149388015'; +update consultant set latest_login_time = (select login_date from login_record where account = 'R221444250' and login_method = 'E_SERVICE' and result = 'SUCCESS' order by login_date desc limit 1) where agent_no = 'R221444250'; diff --git "a/pamapi/src/doc/\351\241\247\345\225\217API/\345\260\207\351\241\247\345\225\217\345\212\240\345\205\245\345\256\242\346\210\266\347\232\204\346\270\205\345\226\256.txt" "b/pamapi/src/doc/\351\241\247\345\225\217API/\345\260\207\351\241\247\345\225\217\345\212\240\345\205\245\345\256\242\346\210\266\347\232\204\346\270\205\345\226\256.txt" index eb5a825..13c32b7 100644 --- "a/pamapi/src/doc/\351\241\247\345\225\217API/\345\260\207\351\241\247\345\225\217\345\212\240\345\205\245\345\256\242\346\210\266\347\232\204\346\270\205\345\226\256.txt" +++ "b/pamapi/src/doc/\351\241\247\345\225\217API/\345\260\207\351\241\247\345\225\217\345\212\240\345\205\245\345\256\242\346\210\266\347\232\204\346\270\205\345\226\256.txt" @@ -2,7 +2,16 @@ request body: { - "agentNoList": ["12345"] + "consultantList": [ + { + "agentNo": "Z152717443", + "createdTime": "2020-05-18T03:24:40Z" // ��null����垢���葆���� + }, + { + "agentNo": "AGAM11249699", + "createdTime": "2020-05-18T03:24:42Z" + } + ... + ] } - response body: �嚗�ttp status 202 diff --git "a/pamapi/src/doc/\351\241\247\345\225\217API/\346\214\207\345\256\232\351\241\247\345\225\217\350\251\263\347\264\260\350\263\207\350\250\212.txt" "b/pamapi/src/doc/\351\241\247\345\225\217API/\346\214\207\345\256\232\351\241\247\345\225\217\350\251\263\347\264\260\350\263\207\350\250\212.txt" index 9e345bd..9b6530d 100644 --- "a/pamapi/src/doc/\351\241\247\345\225\217API/\346\214\207\345\256\232\351\241\247\345\225\217\350\251\263\347\264\260\350\263\207\350\250\212.txt" +++ "b/pamapi/src/doc/\351\241\247\345\225\217API/\346\214\207\345\256\232\351\241\247\345\225\217\350\251\263\347\264\260\350\263\207\350\250\212.txt" @@ -8,11 +8,13 @@ "avgScore" : 3.1, "title" : "�����(DM)", "phoneNumber" : "0987168787", + "email": "wayne@pollex.com.tw", "serveArea" : "���腦������蝮�", "companyAddress" : "��蝮����銝剜迤頝�30���9璅�", "latestLoginTime" : "2021-12-24T08:48:21.497Z", "seniority" : "38 撟� ", - "evaluation" : 50, + "nearlyMonthAppointmentCount" : 30, 餈����������隢株岷摨� + "allAppointmentCount" : 50, �����������隢株岷摨� "expertise" : [ "�摨瑁����", "摮戊��", "鞈閬��", "璅暑��隡�", "靽�瑼�/閬��", "����" ], "concept" : "瘥遢靽閬������\r\n�敹�敹�票敹����恥�\r\n\r\n����之靽∪艙\r\n��� 擃p�� ���祥�����r\n��� 蝪∪��� ��������r\n��� 摰Zˊ��� �銝�隞賡������r\n\r\n���������風�������犖", "experiences" : "暻餌��極摮賊������飛蝟�,�憭余MBA,銝剖�之摮貉瓷��頂,鈭箄澈靽霅,鞎∠靽霅,�����霅,憭馳�隞�霅,��隡��移蝞葦霅,��靽鴽方�犖��岫霅,蝢�ˊ�蝞∴坐撣怨�,蝢�ˊ�鴽方�葦霅,蝢�瓷������靽葦霅", diff --git "a/pamapi/src/doc/\351\241\247\345\225\217API/\347\267\250\350\274\257\344\277\256\346\224\271\351\241\247\345\225\217\350\263\207\346\226\231.txt" "b/pamapi/src/doc/\351\241\247\345\225\217API/\347\267\250\350\274\257\344\277\256\346\224\271\351\241\247\345\225\217\350\263\207\346\226\231.txt" index aa25bc6..8d44d73 100644 --- "a/pamapi/src/doc/\351\241\247\345\225\217API/\347\267\250\350\274\257\344\277\256\346\224\271\351\241\247\345\225\217\350\263\207\346\226\231.txt" +++ "b/pamapi/src/doc/\351\241\247\345\225\217API/\347\267\250\350\274\257\344\277\256\346\224\271\351\241\247\345\225\217\350\263\207\346\226\231.txt" @@ -15,6 +15,7 @@ "serveArea":"������蝮�", "gender":"male", "phoneNumber":"09123456789", + "email": "wayne@pollex.com.tw", "companyAddress":"摰蝮�鈭����楝3���3璅�", "seniorityYear":40, "seniorityMonth":10, @@ -23,4 +24,4 @@ "awards":"26甈∪��匱蝥���(IQA)", "communicationStyle":"����", "photoBase64":"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" -} \ No newline at end of file +} diff --git a/pamapi/src/main/java/com/pollex/pam/aop/logging/LoggingAspect.java b/pamapi/src/main/java/com/pollex/pam/aop/logging/LoggingAspect.java index 19b207e..50e5c0e 100644 --- a/pamapi/src/main/java/com/pollex/pam/aop/logging/LoggingAspect.java +++ b/pamapi/src/main/java/com/pollex/pam/aop/logging/LoggingAspect.java @@ -42,7 +42,7 @@ /** * Pointcut that matches all Spring beans in the application's main packages. */ - @Pointcut("within(com.pollex.pam.repository..*)" + " || within(com.pollex.pam.service..*)" + " || within(com.pollex.pam.web.rest..*)") + @Pointcut("within(com.pollex.pam.business.repository..*)" + " || within(com.pollex.pam.business.service..*)" + " || within(com.pollex.pam.web.rest..*)") public void applicationPackagePointcut() { // Method is empty as this is just a Pointcut, the implementations are in the advices. } diff --git a/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcess.java b/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcess.java deleted file mode 100644 index 846287c..0000000 --- a/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcess.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pollex.pam.appointment.process; - -import java.time.Instant; -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.repository.AppointmentClosedInfoRepository; -import com.pollex.pam.repository.AppointmentRepository; -import com.pollex.pam.service.AppointmentClosedInfoService; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.dto.AbstractAppointmentProcessDTO; -import com.pollex.pam.service.dto.DoneProcessDTO; - -@Service -public class AppointmentProcess{ - - @Autowired - List<AppointmentProcessInterface> processList; - - @Autowired - AppointmentService appointmentService; - - @Autowired - AppointmentRepository appointmentRepository; - - @Autowired - AppointmentClosedInfoRepository appointmentClosedInfoRepository; - - public void process(AbstractAppointmentProcessDTO dto) { - - processList.stream().forEach(process ->{ - if(process.getProcessType() == dto.getContactStatus()) { - Optional<AppointmentClosedInfo> closedInfoOP = appointmentClosedInfoRepository.findByAppointmentId(dto.getAppointmentId()); - if(closedInfoOP.isPresent()) { - process.editClosedInfo(dto, closedInfoOP.get()); - }else { - process.create(dto); - } - } - }); - - changeAppointmentCommunicateStatus(dto.getAppointmentId(), dto.getContactStatus()); - } - - private void changeAppointmentCommunicateStatus(Long appointmentId, ContactStatusEnum contactStatus) { - Appointment appointment = appointmentService.findById(appointmentId); - appointment.setCommunicateStatus(contactStatus); - appointmentRepository.save(appointment); - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcessInterface.java b/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcessInterface.java deleted file mode 100644 index ee63d5a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/appointment/process/AppointmentProcessInterface.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pollex.pam.appointment.process; - -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.service.dto.AbstractAppointmentProcessDTO; - -public interface AppointmentProcessInterface { - - AppointmentClosedInfo create(AbstractAppointmentProcessDTO dto); - AppointmentClosedInfo editClosedInfo(AbstractAppointmentProcessDTO dto - , AppointmentClosedInfo closedInfo); - ContactStatusEnum getProcessType(); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/appointment/process/ClosedProcess.java b/pamapi/src/main/java/com/pollex/pam/appointment/process/ClosedProcess.java deleted file mode 100644 index 69dbd24..0000000 --- a/pamapi/src/main/java/com/pollex/pam/appointment/process/ClosedProcess.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.pollex.pam.appointment.process; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.repository.AppointmentClosedInfoRepository; -import com.pollex.pam.service.AppointmentClosedInfoService; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.SatisfactionService; -import com.pollex.pam.service.dto.AbstractAppointmentProcessDTO; -import com.pollex.pam.service.dto.ClosedProcessDTO; - -@Service -@Transactional -public class ClosedProcess implements AppointmentProcessInterface{ - - @Autowired - AppointmentClosedInfoRepository appointmentClosedInfoRepository; - - @Autowired - AppointmentService appointmentService; - - @Autowired - AppointmentClosedInfoService appointmentClosedInfoService; - - @Autowired - SatisfactionService satisfactionService; - - @Override - public AppointmentClosedInfo create(AbstractAppointmentProcessDTO processDTO) { - ClosedProcessDTO closeProcess = toClosedProcessDTO(processDTO); - AppointmentClosedInfo closedInfo = new AppointmentClosedInfo(); - BeanUtils.copyProperties(closeProcess, closedInfo); - Appointment appointment = appointmentService.findById(processDTO.getAppointmentId()); - satisfactionService.createAppointmentSatisfaction(appointment); - return appointmentClosedInfoRepository.save(closedInfo); - } - - private ClosedProcessDTO toClosedProcessDTO(AbstractAppointmentProcessDTO processDTO) { - ClosedProcessDTO closeProcess = (ClosedProcessDTO)processDTO; - BeanUtils.copyProperties(processDTO, closeProcess); - return closeProcess; - } - - @Override - public ContactStatusEnum getProcessType() { - return ContactStatusEnum.CLOSED; - } - - @Override - public AppointmentClosedInfo editClosedInfo( - AbstractAppointmentProcessDTO abstractDTO - , AppointmentClosedInfo closedInfo) { - ClosedProcessDTO closeProcess = toClosedProcessDTO(abstractDTO); - BeanUtils.copyProperties(closeProcess, closedInfo); - return appointmentClosedInfoRepository.save(closedInfo); - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/appointment/process/DoneProcess.java b/pamapi/src/main/java/com/pollex/pam/appointment/process/DoneProcess.java deleted file mode 100644 index f42257e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/appointment/process/DoneProcess.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.pollex.pam.appointment.process; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.repository.AppointmentClosedInfoRepository; -import com.pollex.pam.service.AppointmentClosedInfoService; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.SatisfactionService; -import com.pollex.pam.service.dto.AbstractAppointmentProcessDTO; -import com.pollex.pam.service.dto.DoneProcessDTO; - -@Service -@Transactional -public class DoneProcess implements AppointmentProcessInterface{ - - @Autowired - AppointmentClosedInfoRepository appointmentClosedInfoRepository; - - @Autowired - AppointmentClosedInfoService appointmentClosedInfoService; - - @Autowired - SatisfactionService satisfactionService; - - @Autowired - AppointmentService appointmentService; - - @Override - public AppointmentClosedInfo create(AbstractAppointmentProcessDTO processDTO) { - DoneProcessDTO doneProcess = toDoneProcessDTO(processDTO); - AppointmentClosedInfo closedInfo = new AppointmentClosedInfo(); - BeanUtils.copyProperties(doneProcess, closedInfo); - Appointment appointment = appointmentService.findById(processDTO.getAppointmentId()); - satisfactionService.createAppointmentSatisfaction(appointment); - return appointmentClosedInfoRepository.save(closedInfo); - } - - @Override - public ContactStatusEnum getProcessType() { - return ContactStatusEnum.DONE; - } - - @Override - public AppointmentClosedInfo editClosedInfo( - AbstractAppointmentProcessDTO abstractDTO - , AppointmentClosedInfo closedInfo) { - DoneProcessDTO doneProcess = toDoneProcessDTO(abstractDTO); - BeanUtils.copyProperties(doneProcess, closedInfo); - return appointmentClosedInfoRepository.save(closedInfo); - } - - private DoneProcessDTO toDoneProcessDTO(AbstractAppointmentProcessDTO abstractDTO) { - DoneProcessDTO doneProcess = (DoneProcessDTO)abstractDTO; - BeanUtils.copyProperties(abstractDTO, doneProcess); - return doneProcess; - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java index 60b33ca..d692e29 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java +++ b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java @@ -1,6 +1,9 @@ package com.pollex.pam.config; -import com.pollex.pam.enums.SendEmailMsgMethod; +import com.pollex.pam.business.config.AppProperties; +import com.pollex.pam.business.config.SendEmailProperties; +import com.pollex.pam.business.config.SendSMSProperties; +import com.pollex.pam.business.enums.SendEmailMsgMethod; import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -10,7 +13,7 @@ * See {@link tech.jhipster.config.JHipsterProperties} for a good example. */ @ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) -public class ApplicationProperties { +public class ApplicationProperties implements AppProperties { private boolean mockLogin; private String otpWebServiceUrl; @@ -20,8 +23,8 @@ private String eServiceLoginFunc; private String eServiceLoginSys; private String frontEndDomain; - private SMS sms; - private Email email; + private SendSMSProperties sms; + private SendEmailProperties email; private String fileFolderPath; public boolean isMockLogin() { @@ -88,126 +91,22 @@ this.frontEndDomain = frontEndDomain; } - public SMS getSms() { + public SendSMSProperties getSms() { return sms; } - public void setSms(SMS sms) { + public void setSms(SendSMSProperties sms) { this.sms = sms; } - public Email getEmail() { + public SendEmailProperties getEmail() { return email; } - public void setEmail(Email email) { + public void setEmail(SendEmailProperties email) { this.email = email; } - public static class SMS { - private String url; - private String sourceCode; - private String sender; - private String smsType; - private String subject; - private boolean sendNotifyMsg; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getSourceCode() { - return sourceCode; - } - - public void setSourceCode(String sourceCode) { - this.sourceCode = sourceCode; - } - - public String getSender() { - return sender; - } - - public void setSender(String sender) { - this.sender = sender; - } - - public String getSmsType() { - return smsType; - } - - public void setSmsType(String smsType) { - this.smsType = smsType; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public boolean isSendNotifyMsg() { - return sendNotifyMsg; - } - - public void setSendNotifyMsg(boolean sendNotifyMsg) { - this.sendNotifyMsg = sendNotifyMsg; - } - } - - public static class Email { - private String url; - private String functionId; - private String senderEmail; - private boolean sendNotifyMsg; - private SendEmailMsgMethod method; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getFunctionId() { - return functionId; - } - - public void setFunctionId(String functionId) { - this.functionId = functionId; - } - - public String getSenderEmail() { - return senderEmail; - } - - public void setSenderEmail(String senderEmail) { - this.senderEmail = senderEmail; - } - - public boolean isSendNotifyMsg() { - return sendNotifyMsg; - } - - public void setSendNotifyMsg(boolean sendNotifyMsg) { - this.sendNotifyMsg = sendNotifyMsg; - } - - public SendEmailMsgMethod getMethod() { - return method; - } - - public void setMethod(SendEmailMsgMethod method) { - this.method = method; - } - } public String getFileFolderPath() { return fileFolderPath; } diff --git a/pamapi/src/main/java/com/pollex/pam/config/CacheConfiguration.java b/pamapi/src/main/java/com/pollex/pam/config/CacheConfiguration.java index 980373c..12bbec4 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/CacheConfiguration.java +++ b/pamapi/src/main/java/com/pollex/pam/config/CacheConfiguration.java @@ -43,11 +43,11 @@ @Bean public JCacheManagerCustomizer cacheManagerCustomizer() { return cm -> { - createCache(cm, com.pollex.pam.repository.UserRepository.USERS_BY_LOGIN_CACHE); - createCache(cm, com.pollex.pam.repository.UserRepository.USERS_BY_EMAIL_CACHE); - createCache(cm, com.pollex.pam.domain.User.class.getName()); - createCache(cm, com.pollex.pam.domain.Authority.class.getName()); - createCache(cm, com.pollex.pam.domain.User.class.getName() + ".authorities"); + createCache(cm, com.pollex.pam.business.repository.UserRepository.USERS_BY_LOGIN_CACHE); + createCache(cm, com.pollex.pam.business.repository.UserRepository.USERS_BY_EMAIL_CACHE); + createCache(cm, com.pollex.pam.business.domain.User.class.getName()); + createCache(cm, com.pollex.pam.business.domain.Authority.class.getName()); + createCache(cm, com.pollex.pam.business.domain.User.class.getName() + ".authorities"); // jhipster-needle-ehcache-add-entry }; } diff --git a/pamapi/src/main/java/com/pollex/pam/config/Constants.java b/pamapi/src/main/java/com/pollex/pam/config/Constants.java deleted file mode 100644 index 87dd25b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/config/Constants.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.pollex.pam.config; - -/** - * Application constants. - */ -public final class Constants { - - // Regex for acceptable logins - public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; - - public static final String SYSTEM = "system"; - public static final String DEFAULT_LANGUAGE = "zh-tw"; - - /** - * �閰勗�mail�撱箇���(T)敺�憭抵������� - * �����摰2 - */ - public static final int APPOINTMENT_PENDING_PHONE_INTERVAL = 2; - public static final int APPOINTMENT_PENDING_EMAIL_INTERVAL = 2; - - /** - * �閰勗�mail�撱箇���(T)敺�憭拇�◤閬������嚗憭拇甈⊥����策憿批�� - * �敺�憭�(T+N+1)嚗停���甈∠策摰X�� 閰脤“���敹�瘜������閬��� - */ - public static final int APPOINTMENT_EXPIRING_PHONE_INTERVAL = APPOINTMENT_PENDING_PHONE_INTERVAL + 1; - public static final int APPOINTMENT_EXPIRING_EMAIL_INTERVAL = APPOINTMENT_PENDING_EMAIL_INTERVAL + 1; - - /** - * �摰X��活��� - */ - public static final int SEND_EXPIRING_NOTIFY_LIMIT = 1; - - public static final String SPRING_PROFILE_POLLEX_DEVELOPMENT = "pollex"; - - private Constants() {} -} diff --git a/pamapi/src/main/java/com/pollex/pam/config/DatabaseConfiguration.java b/pamapi/src/main/java/com/pollex/pam/config/DatabaseConfiguration.java index 02439f2..5746359 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/DatabaseConfiguration.java +++ b/pamapi/src/main/java/com/pollex/pam/config/DatabaseConfiguration.java @@ -1,16 +1,12 @@ package com.pollex.pam.config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; -import tech.jhipster.config.JHipsterConstants; @Configuration -@EnableJpaRepositories({ "com.pollex.pam.repository" }) +@EnableJpaRepositories({"com.pollex.pam.business.repository"}) @EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") @EnableTransactionManagement public class DatabaseConfiguration {} diff --git a/pamapi/src/main/java/com/pollex/pam/config/SecurityConfiguration.java b/pamapi/src/main/java/com/pollex/pam/config/SecurityConfiguration.java index 0b995e0..a8ee0cf 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/SecurityConfiguration.java +++ b/pamapi/src/main/java/com/pollex/pam/config/SecurityConfiguration.java @@ -1,6 +1,6 @@ package com.pollex.pam.config; -import com.pollex.pam.security.*; +import com.pollex.pam.business.security.AuthoritiesConstants; import com.pollex.pam.security.jwt.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; diff --git a/pamapi/src/main/java/com/pollex/pam/config/WebsocketConfiguration.java b/pamapi/src/main/java/com/pollex/pam/config/WebsocketConfiguration.java index 45e29b6..871056d 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/WebsocketConfiguration.java +++ b/pamapi/src/main/java/com/pollex/pam/config/WebsocketConfiguration.java @@ -1,6 +1,6 @@ package com.pollex.pam.config; -import com.pollex.pam.security.AuthoritiesConstants; +import com.pollex.pam.business.security.AuthoritiesConstants; import java.security.Principal; import java.util.*; import org.springframework.context.annotation.Bean; diff --git a/pamapi/src/main/java/com/pollex/pam/config/WebsocketSecurityConfiguration.java b/pamapi/src/main/java/com/pollex/pam/config/WebsocketSecurityConfiguration.java index 30afbb2..0ccc2f4 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/WebsocketSecurityConfiguration.java +++ b/pamapi/src/main/java/com/pollex/pam/config/WebsocketSecurityConfiguration.java @@ -1,6 +1,6 @@ package com.pollex.pam.config; -import com.pollex.pam.security.AuthoritiesConstants; +import com.pollex.pam.business.security.AuthoritiesConstants; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.SimpMessageType; import org.springframework.security.config.annotation.web.messaging.MessageSecurityMetadataSourceRegistry; diff --git a/pamapi/src/main/java/com/pollex/pam/consts/SeniorityQueryConst.java b/pamapi/src/main/java/com/pollex/pam/consts/SeniorityQueryConst.java deleted file mode 100644 index fc57ae7..0000000 --- a/pamapi/src/main/java/com/pollex/pam/consts/SeniorityQueryConst.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pollex.pam.consts; - -public class SeniorityQueryConst { - public static final String SENIOR = "SENIOR"; - public static final String YOUNG = "YOUNG"; - public static final String UNLIMITED = "UNLIMITED"; - - private SeniorityQueryConst() {} -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AbstractAuditingEntity.java b/pamapi/src/main/java/com/pollex/pam/domain/AbstractAuditingEntity.java deleted file mode 100644 index c89d1d2..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AbstractAuditingEntity.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.pollex.pam.domain; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import java.io.Serializable; -import java.time.Instant; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -/** - * Base abstract class for entities which will hold definitions for created, last modified, created by, - * last modified by attributes. - */ -@MappedSuperclass -@EntityListeners(AuditingEntityListener.class) -public abstract class AbstractAuditingEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedBy - @Column(name = "created_by", nullable = false, length = 50, updatable = false) - @JsonIgnore - private String createdBy; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - @LastModifiedBy - @Column(name = "last_modified_by", length = 50) - @JsonIgnore - private String lastModifiedBy; - - @LastModifiedDate - @Column(name = "last_modified_date") - @JsonIgnore - private Instant lastModifiedDate = Instant.now(); - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getLastModifiedBy() { - return lastModifiedBy; - } - - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java b/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java deleted file mode 100644 index 76d30ca..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java +++ /dev/null @@ -1,285 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; -import java.util.List; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import com.pollex.pam.enums.AppointmentStatusEnum; -import com.pollex.pam.enums.ContactStatusEnum; - -@EntityListeners(AuditingEntityListener.class) -@Entity -@Table(name = "appointment") -public class Appointment implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "phone") - private String phone; - - @Column(name = "email") - private String email; - - @Column(name = "contact_type") - private String contactType; - - @Column(name = "gender") - private String gender; - - @Column(name = "age") - private String age; - - @Column(name = "job") - private String job; - - @Column(name = "requirement") - private String requirement; - - @Enumerated(EnumType.STRING) - @Column(name = "communicate_status") - private ContactStatusEnum communicateStatus; - - @Column(name = "hope_contact_time") - private String hopeContactTime; - - @Column(name = "other_requirement") - private String otherRequirement; - - @CreatedDate - @Column(name = "appointment_date", updatable = false) - private Instant appointmentDate = Instant.now(); - - @Column(name = "last_modified_date") - @LastModifiedDate - private Instant lastModifiedDate = Instant.now(); - - @Column(name = "agent_no") - private String agentNo; - - @Column(name = "customer_id") - private Long customerId; - - @Column(name = "consultant_view_time") - private Instant consultantViewTime; - - @Column(name = "consultant_read_time") - private Instant consultantReadTime; - - @Column(name = "contact_time") - private Instant contactTime; - - @Enumerated(value = EnumType.STRING) - @Column(name = "status") - private AppointmentStatusEnum status; - - @JoinColumn(name = "appointment_id") - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) - private List<AppointmentMemo> appointmentMemoList; - -// @OneToOne(cascade = CascadeType.REMOVE,fetch=FetchType.EAGER) -//// @JoinColumn(name = "form_authority_id", referencedColumnName = "id") -// @JoinColumn(name = "appointment_id", referencedColumnName = "id") -// private AppointmentClosedInfo closedInfo; - -// @OneToOne(cascade = CascadeType.REMOVE -// , mappedBy = "appointment", fetch=FetchType.LAZY) -// private AppointmentClosedInfo closedInfo; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getContactType() { - return contactType; - } - - public void setContactType(String contactType) { - this.contactType = contactType; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - public String getAge() { - return age; - } - - public void setAge(String age) { - this.age = age; - } - - public String getJob() { - return job; - } - - public void setJob(String job) { - this.job = job; - } - - public String getRequirement() { - return requirement; - } - - public void setRequirement(String requirement) { - this.requirement = requirement; - } - - public String getHopeContactTime() { - return hopeContactTime; - } - - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - - public String getOtherRequirement() { - return otherRequirement; - } - - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - - public Instant getAppointmentDate() { - return appointmentDate; - } - - public void setAppointmentDate(Instant appointmentDate) { - this.appointmentDate = appointmentDate; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public ContactStatusEnum getCommunicateStatus() { - return communicateStatus; - } - - public void setCommunicateStatus(ContactStatusEnum communicateStatus) { - this.communicateStatus = communicateStatus; - } - - public Long getCustomerId() { - return customerId; - } - - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - - public Instant getConsultantViewTime() { - return consultantViewTime; - } - - public void setConsultantViewTime(Instant consultantViewTime) { - this.consultantViewTime = consultantViewTime; - } - - public Instant getConsultantReadTime() { - return consultantReadTime; - } - - public void setConsultantReadTime(Instant consultantReadTime) { - this.consultantReadTime = consultantReadTime; - } - - public Instant getContactTime() { - return contactTime; - } - - public void setContactTime(Instant markCommunicateTime) { - this.contactTime = markCommunicateTime; - } - - public AppointmentStatusEnum getStatus() { - return status; - } - - public void setStatus(AppointmentStatusEnum status) { - this.status = status; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public List<AppointmentMemo> getAppointmentMemoList() { - return appointmentMemoList; - } - - public void setAppointmentMemoList(List<AppointmentMemo> appointmentMemoList) { - this.appointmentMemoList = appointmentMemoList; - } - -// public AppointmentClosedInfo getClosedInfo() { -// return closedInfo; -// } -// -// public void setClosedInfo(AppointmentClosedInfo closedInfo) { -// this.closedInfo = closedInfo; -// } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentClosedInfo.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentClosedInfo.java deleted file mode 100644 index bc16a7a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentClosedInfo.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "appointment_closed_info") -public class AppointmentClosedInfo implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "policyholder_identity_id") - private String policyholderIdentityId; - - @Column(name = "plan_code") - private String planCode; - - @Column(name = "policy_entry_date") - private Date policyEntryDate; - - @Column(name = "remark") - private String remark; - - @Column(name = "closed_reason") - private String closedReason; - - @Column(name = "closed_other_reason") - private String closedOtherReason; - - @Column(name = "appointment_id") - private Long appointmentId; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPolicyholderIdentityId() { - return policyholderIdentityId; - } - - public void setPolicyholderIdentityId(String policyholderIdentityId) { - this.policyholderIdentityId = policyholderIdentityId; - } - - public String getPlanCode() { - return planCode; - } - - public void setPlanCode(String planCode) { - this.planCode = planCode; - } - - public Date getPolicyEntryDate() { - return policyEntryDate; - } - - public void setPolicyEntryDate(Date policyEntryDate) { - this.policyEntryDate = policyEntryDate; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public String getClosedReason() { - return closedReason; - } - - public void setClosedReason(String closedReason) { - this.closedReason = closedReason; - } - - public String getClosedOtherReason() { - return closedOtherReason; - } - - public void setClosedOtherReason(String closedOtherReason) { - this.closedOtherReason = closedOtherReason; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java deleted file mode 100644 index bb2a477..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java +++ /dev/null @@ -1,265 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; -import java.util.List; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import com.pollex.pam.enums.AppointmentStatusEnum; -import com.pollex.pam.enums.ContactStatusEnum; - -@Entity -@Table(name = "appointment_customer_view") -public class AppointmentCustomerView implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Column(name = "appointment_id") - @Id - private Long id; - - @Column(name = "phone") - private String phone; - - @Column(name = "email") - private String email; - - @Column(name = "contact_type") - private String contactType; - - @Column(name = "gender") - private String gender; - - @Column(name = "age") - private String age; - - @Column(name = "job") - private String job; - - @Column(name = "requirement") - private String requirement; - - @Enumerated(EnumType.STRING) - @Column(name = "communicate_status") - private ContactStatusEnum communicateStatus; - - @Column(name = "hope_contact_time") - private String hopeContactTime; - - @Column(name = "other_requirement") - private String otherRequirement; - - @Column(name = "appointment_date") - private Instant appointmentDate; - - @Column(name = "agent_no") - private String agentNo; - - @Column(name = "customer_id") - private Long customerId; - - @Column(name = "consultant_view_time") - private Instant consultantViewTime; - - @Column(name = "consultant_read_time") - private Instant consultantReadTime; - - @Column(name = "contact_time") - private Instant contactTime; - - @Column(name = "last_modified_date") - private Instant lastModifiedDate; - - @Column(name = "name") - private String name; - - @Enumerated(value = EnumType.STRING) - @Column(name = "status") - private AppointmentStatusEnum status; - - @JoinColumn(name = "appointment_id") - @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) - private List<AppointmentMemo> appointmentMemoList; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getContactType() { - return contactType; - } - - public void setContactType(String contactType) { - this.contactType = contactType; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - public String getAge() { - return age; - } - - public void setAge(String age) { - this.age = age; - } - - public String getJob() { - return job; - } - - public void setJob(String job) { - this.job = job; - } - - public String getRequirement() { - return requirement; - } - - public void setRequirement(String requirement) { - this.requirement = requirement; - } - - public ContactStatusEnum getCommunicateStatus() { - return communicateStatus; - } - - public void setCommunicateStatus(ContactStatusEnum communicateStatus) { - this.communicateStatus = communicateStatus; - } - - public String getHopeContactTime() { - return hopeContactTime; - } - - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - - public String getOtherRequirement() { - return otherRequirement; - } - - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - - public Instant getAppointmentDate() { - return appointmentDate; - } - - public void setAppointmentDate(Instant appointmentDate) { - this.appointmentDate = appointmentDate; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public Long getCustomerId() { - return customerId; - } - - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - - public Instant getConsultantViewTime() { - return consultantViewTime; - } - - public void setConsultantViewTime(Instant consultantViewTime) { - this.consultantViewTime = consultantViewTime; - } - - public Instant getConsultantReadTime() { - return consultantReadTime; - } - - public void setConsultantReadTime(Instant consultantReadTime) { - this.consultantReadTime = consultantReadTime; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Instant getContactTime() { - return contactTime; - } - - public void setContactTime(Instant markCommunicateTime) { - this.contactTime = markCommunicateTime; - } - public AppointmentStatusEnum getStatus() { - return status; - } - - public void setStatus(AppointmentStatusEnum status) { - this.status = status; - } - - public List<AppointmentMemo> getAppointmentMemoList() { - return appointmentMemoList; - } - - public void setAppointmentMemoList(List<AppointmentMemo> appointmentMemoList) { - this.appointmentMemoList = appointmentMemoList; - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentExpiringNotifyRecord.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentExpiringNotifyRecord.java deleted file mode 100644 index 5f2f8f6..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentExpiringNotifyRecord.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pollex.pam.domain; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.Instant; - -@Entity -@Table(name = "appointment_expiring_notify_record") -public class AppointmentExpiringNotifyRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "appointment_id") - private Long appointmentId; - - @Column(name = "send_time") - private Instant sendTime; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - public Instant getSendTime() { - return sendTime; - } - - public void setSendTime(Instant sendTime) { - this.sendTime = sendTime; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentMemo.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentMemo.java deleted file mode 100644 index 1b6299a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentMemo.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "appointment_memo") -public class AppointmentMemo extends AbstractAuditingEntity implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "content") - private String content; - - @Column(name = "appointment_id") - private Long appointmentId; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentNoticeLog.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentNoticeLog.java deleted file mode 100644 index 10c6173..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentNoticeLog.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -@Entity -@Table(name = "appointment_notice_log") -public class AppointmentNoticeLog implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "phone") - private String phone; - - @Column(name = "email") - private String email; - - @Column(name = "appointment_id") - private Long appointmentId; - -// @Column(name = "type") -// private String type; - - @Column(name = "content") - private String content; - -// @CreatedBy -// @Column(name = "created_by", nullable = false, length = 50, updatable = false) -// @JsonIgnore -// private String createdBy; - - @CreatedDate - @Column(name = "created_date", updatable = false) - private Instant createdDate = Instant.now(); - - @Column(name = "interview_date") - private Date interviewDate; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - -// public String getType() { -// return type; -// } -// -// public void setType(String type) { -// this.type = type; -// } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - -// public String getCreatedBy() { -// return createdBy; -// } -// -// public void setCreatedBy(String createdBy) { -// this.createdBy = createdBy; -// } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public Date getInterviewDate() { - return interviewDate; - } - - public void setInterviewDate(Date interviewDate) { - this.interviewDate = interviewDate; - } - - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Authority.java b/pamapi/src/main/java/com/pollex/pam/domain/Authority.java deleted file mode 100644 index c393e2b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/Authority.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; - -/** - * An authority (a security role) used by Spring Security. - */ -@Entity -@Table(name = "jhi_authority") -@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class Authority implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - @Size(max = 50) - @Id - @Column(length = 50) - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Authority)) { - return false; - } - return Objects.equals(name, ((Authority) o).name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name); - } - - // prettier-ignore - @Override - public String toString() { - return "Authority{" + - "name='" + name + '\'' + - "}"; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java b/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java deleted file mode 100644 index 942a2e7..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java +++ /dev/null @@ -1,269 +0,0 @@ -package com.pollex.pam.domain; - -import com.pollex.pam.enums.GenderEnum; - -import javax.persistence.*; -import java.io.Serializable; - -@Entity -@Table(name = "consultant") -public class Consultant extends AbstractAuditingEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator") - private Long id; - - @Column(name = "agent_no", unique = true) - private String agentNo; - - @Column(name = "name") - private String name; - - @Column(name = "photo_path") - private String photoPath; - - @Column(name = "expertise") - private String expertise; - - @Column(name = "avg_score") - private Float avgScore; - - @Column(name = "title") - private String title; - - @Column(name = "role") - private String role; - - @Column(name = "serve_area") - private String serveArea; - - @Enumerated(value = EnumType.STRING) - @Column(name = "gender") - private GenderEnum gender; - - @Column(name = "phone_number") - private String phoneNumber; - - @Column(name = "company_address") - private String companyAddress; - - @Column(name = "seniority_year") - private Long seniorityYear; - - @Column(name = "seniority_month") - private Long seniorityMonth; - - @Column(name = "concept") - private String concept; - - @Column(name = "experience") - private String experience; - - @Column(name = "award") - private String award; - - @Column(name = "recommend") - private Boolean recommend; - - @Column(name = "communication_style") - private String communicationStyle; - - @Column(name = "email") - private String email; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPhotoPath() { - return photoPath; - } - - public void setPhotoPath(String photoPath) { - this.photoPath = photoPath; - } - - public String getExpertise() { - return expertise; - } - - public void setExpertise(String expertise) { - this.expertise = expertise; - } - - public Float getAvgScore() { - return avgScore; - } - - public void setAvgScore(Float avgScore) { - this.avgScore = avgScore; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getServeArea() { - return serveArea; - } - - public void setServeArea(String serveArea) { - this.serveArea = serveArea; - } - - public GenderEnum getGender() { - return gender; - } - - public void setGender(GenderEnum gender) { - this.gender = gender; - } - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public String getCompanyAddress() { - return companyAddress; - } - - public void setCompanyAddress(String companyAddress) { - this.companyAddress = companyAddress; - } - - public Long getSeniorityYear() { - return seniorityYear; - } - - public void setSeniorityYear(Long seniorityYear) { - this.seniorityYear = seniorityYear; - } - - public Long getSeniorityMonth() { - return seniorityMonth; - } - - public void setSeniorityMonth(Long seniorityMonth) { - this.seniorityMonth = seniorityMonth; - } - - public String getSeniorityDTOString() { - final String seniorityYearString = this.seniorityYear != 0 ? this.seniorityYear + " 撟� " : ""; - final String seniorityMonthString = this.seniorityMonth != 0 ? this.seniorityMonth + " ���" : ""; - - return seniorityYearString + seniorityMonthString; - } - - public String getConcept() { - return concept; - } - - public void setConcept(String concept) { - this.concept = concept; - } - - public String getExperience() { - return experience; - } - - public void setExperience(String experience) { - this.experience = experience; - } - - public String getAward() { - return award; - } - - public void setAward(String award) { - this.award = award; - } - - public Boolean getRecommend() { - return recommend; - } - - public void setRecommend(Boolean recommend) { - this.recommend = recommend; - } - - public String getCommunicationStyle() { - return communicationStyle; - } - - public void setCommunicationStyle(String communicationStyle) { - this.communicationStyle = communicationStyle; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - @Override - public String toString() { - return "Consultant{" + - "id=" + id + - ", agentNo='" + agentNo + '\'' + - ", name='" + name + '\'' + - ", photoPath='" + photoPath + '\'' + - ", expertise='" + expertise + '\'' + - ", avgScore=" + avgScore + - ", title='" + title + '\'' + - ", role='" + role + '\'' + - ", serveArea='" + serveArea + '\'' + - ", gender=" + gender + - ", phoneNumber='" + phoneNumber + '\'' + - ", companyAddress='" + companyAddress + '\'' + - ", seniorityYear=" + seniorityYear + - ", seniorityMonth=" + seniorityMonth + - ", concept='" + concept + '\'' + - ", experience='" + experience + '\'' + - ", award='" + award + '\'' + - ", recommend=" + recommend + - ", communicationStyle='" + communicationStyle + '\'' + - ", email='" + email + '\'' + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Customer.java b/pamapi/src/main/java/com/pollex/pam/domain/Customer.java deleted file mode 100644 index c3055cc..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/Customer.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; -import java.util.Optional; - -import javax.persistence.*; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import org.springframework.util.StringUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.pollex.pam.enums.OtpLoginTypeEnum; - -@EntityListeners(AuditingEntityListener.class) -@Entity -@Table(name = "customer") -public class Customer implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "name") - private String name; - - @Column(name = "phone") - private String phone; - - @Column(name = "email") - private String email; - - @Enumerated(value = EnumType.STRING) - @Column(name = "contact_type") - private OtpLoginTypeEnum contactType; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - @LastModifiedDate - @Column(name = "last_modified_date") - @JsonIgnore - private Instant lastModifiedDate = Instant.now(); - - @CreatedDate - @Column(name = "agree_personal_information_time", updatable = false) - @JsonIgnore - private Instant agreePersonalInformationTime; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public OtpLoginTypeEnum getContactType() { - return contactType; - } - - public void setContactType(OtpLoginTypeEnum contactType) { - this.contactType = contactType; - } - - public Instant getAgreePersonalInformationTime() { - return agreePersonalInformationTime; - } - - public void setAgreePersonalInformationTime(Instant agreePersonalInformationTime) { - this.agreePersonalInformationTime = agreePersonalInformationTime; - } - - public String toAccountString() { - return Optional.ofNullable(getPhone()) - .filter(StringUtils::hasText) - .orElseGet(this::getEmail); - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/CustomerFavoriteConsultant.java b/pamapi/src/main/java/com/pollex/pam/domain/CustomerFavoriteConsultant.java deleted file mode 100644 index ec68439..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/CustomerFavoriteConsultant.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.pollex.pam.domain; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.Instant; - -@EntityListeners(AuditingEntityListener.class) -@Entity -@Table(name = "customer_favorite_consultant") -public class CustomerFavoriteConsultant implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator") - private Long id; - - @ManyToOne - @JoinColumn(name = "consultant_id") - private Consultant consultant; - - @Column(name = "customer_id") - private Long customerId; - - @CreatedBy - @Column(name = "created_by", updatable = false) - @JsonIgnore - private String createdBy; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - @LastModifiedBy - @Column(name = "last_modified_by") - @JsonIgnore - private String lastModifiedBy; - - @Column(name = "last_modified_date") - @JsonIgnore - private Instant lastModifiedDate = Instant.now(); - - @Column(name = "view_time") - private Instant viewTime; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Consultant getConsultant() { - return consultant; - } - - public void setConsultant(Consultant consultant) { - this.consultant = consultant; - } - - public Long getCustomerId() { - return customerId; - } - - public void setCustomerId(Long customId) { - this.customerId = customId; - } - - public Instant getViewTime() { - return viewTime; - } - - public void setViewTime(Instant viewTime) { - this.viewTime = viewTime; - } - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getLastModifiedBy() { - return lastModifiedBy; - } - - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - @Override - public String toString() { - return "CustomerFavoriteConsultant{" + - "id=" + id + - ", consultant=" + consultant + - ", customerId=" + customerId + - ", createdBy='" + createdBy + '\'' + - ", createdDate=" + createdDate + - ", lastModifiedBy='" + lastModifiedBy + '\'' + - ", lastModifiedDate=" + lastModifiedDate + - ", viewTime=" + viewTime + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/InterviewRecord.java b/pamapi/src/main/java/com/pollex/pam/domain/InterviewRecord.java deleted file mode 100644 index c7f02d1..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/InterviewRecord.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.pollex.pam.enums.InterviewRecordStatusEnum; - -@Entity -@Table(name = "interview_record") -public class InterviewRecord extends AbstractAuditingEntity implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "content") - private String content; - - @Column(name = "interview_date") - private Date interviewDate; - - @Column(name = "appointment_id") - private Long appointmentId; - - @Enumerated(EnumType.STRING) - @Column(name = "status") - private InterviewRecordStatusEnum status; - - - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Date getInterviewDate() { - return interviewDate; - } - - public void setInterviewDate(Date interviewDate) { - this.interviewDate = interviewDate; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - public InterviewRecordStatusEnum getStatus() { - return status; - } - - public void setStatus(InterviewRecordStatusEnum status) { - this.status = status; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/LoginRecord.java b/pamapi/src/main/java/com/pollex/pam/domain/LoginRecord.java deleted file mode 100644 index 42bce49..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/LoginRecord.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.pollex.pam.domain; - -import com.pollex.pam.enums.LoginMethod; -import com.pollex.pam.enums.LoginResult; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.Instant; - -@Entity -@Table(name = "login_record") -public class LoginRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "account") - private String account; - - @Enumerated(EnumType.STRING) - @Column(name = "login_method") - private LoginMethod loginMethod; - - @Column(name = "login_date", updatable = false) - private Instant loginDate = Instant.now(); - - @Enumerated(EnumType.STRING) - @Column(name = "result") - private LoginResult result; - - @Column(name = "failed_reason") - private String failedReason; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public LoginMethod getLoginMethod() { - return loginMethod; - } - - public void setLoginMethod(LoginMethod loginMethod) { - this.loginMethod = loginMethod; - } - - public Instant getLoginDate() { - return loginDate; - } - - public void setLoginDate(Instant createdDate) { - this.loginDate = createdDate; - } - - public LoginResult getResult() { - return result; - } - - public void setResult(LoginResult result) { - this.result = result; - } - - public String getFailedReason() { - return failedReason; - } - - public void setFailedReason(String failedReason) { - this.failedReason = failedReason; - } - - @Override - public String toString() { - return "LoginRecord{" + - "id=" + id + - ", account='" + account + '\'' + - ", loginMethod=" + loginMethod + - ", createdDate=" + loginDate + - ", result=" + result + - ", failedReason='" + failedReason + '\'' + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/OtpTmp.java b/pamapi/src/main/java/com/pollex/pam/domain/OtpTmp.java deleted file mode 100644 index 4007d37..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/OtpTmp.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.springframework.data.annotation.CreatedDate; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.pollex.pam.enums.OtpLoginTypeEnum; -import com.pollex.pam.enums.OtpTmpStatusEnum; - -@Entity -@Table(name = "otp_tmp") -public class OtpTmp implements Serializable{ - - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "account") - private String account; - - @Column(name = "index_key") - private String indexKey; - - @Enumerated(value = EnumType.STRING) - @Column(name = "status") - private OtpTmpStatusEnum status; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getIndexKey() { - return indexKey; - } - - public void setIndexKey(String indexKey) { - this.indexKey = indexKey; - } - - public OtpTmpStatusEnum getStatus() { - return status; - } - - public void setStatus(OtpTmpStatusEnum status) { - this.status = status; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/PersonalNotification.java b/pamapi/src/main/java/com/pollex/pam/domain/PersonalNotification.java deleted file mode 100644 index 922994b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/PersonalNotification.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.springframework.data.annotation.CreatedDate; - -import com.pollex.pam.enums.NotificationTypeEnum; -import com.pollex.pam.enums.PersonalNotificationRoleEnum; - -@Entity -@Table(name = "personal_notification") -public class PersonalNotification implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "title") - private String title; - - @Column(name = "content") - private String content; - - @Enumerated(EnumType.STRING) - @Column(name = "notification_type") - private NotificationTypeEnum notificationType; - - @Enumerated(EnumType.STRING) - @Column(name = "owner_role") - private PersonalNotificationRoleEnum ownerRole; - - @Column(name = "owner_id") - private Long ownerId; - - @CreatedDate - @Column(name = "created_date", updatable = false) - private Instant createdDate = Instant.now(); - - @Column(name = "read_date") - private Instant readDate; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public NotificationTypeEnum getNotificationType() { - return notificationType; - } - - public void setNotificationType(NotificationTypeEnum notificationType) { - this.notificationType = notificationType; - } - - public PersonalNotificationRoleEnum getOwnerRole() { - return ownerRole; - } - - public void setOwnerRole(PersonalNotificationRoleEnum ownerRole) { - this.ownerRole = ownerRole; - } - - public Long getOwnerId() { - return ownerId; - } - - public void setOwnerId(Long ownerId) { - this.ownerId = ownerId; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public Instant getReadDate() { - return readDate; - } - - public void setReadDate(Instant readDate) { - this.readDate = readDate; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java b/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java deleted file mode 100644 index 530bc06..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.pollex.pam.domain; - -import java.io.Serializable; -import java.time.Instant; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.pollex.pam.enums.PersonalNotificationRoleEnum; -import com.pollex.pam.enums.SatisfactionTypeEnum; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.pollex.pam.enums.SatisfactionStatusEnum; - -@Entity -@Table(name = "satisfaction") -public class Satisfaction implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - @LastModifiedDate - @Column(name = "last_modified_date") - @JsonIgnore - private Instant lastModifiedDate = Instant.now(); - - @Column(name = "customer_id") - private Long customerId; - - @Column(name = "agent_no") - private String agentNo; - - @Enumerated(EnumType.STRING) - @Column(name = "status") - private SatisfactionStatusEnum status; - - @Column(name = "score") - private Float score; - - @Column(name = "appointment_id") - private Long appointmentId; - - @Enumerated(EnumType.STRING) - @Column(name = "type") - private SatisfactionTypeEnum type; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public Long getCustomerId() { - return customerId; - } - - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public SatisfactionStatusEnum getStatus() { - return status; - } - - public void setStatus(SatisfactionStatusEnum status) { - this.status = status; - } - - public Float getScore() { - return score; - } - - public void setScore(Float score) { - this.score = score; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - public SatisfactionTypeEnum getType() { - return type; - } - - public void setType(SatisfactionTypeEnum type) { - this.type = type; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/User.java b/pamapi/src/main/java/com/pollex/pam/domain/User.java deleted file mode 100644 index 3be5c1d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/User.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.pollex.pam.domain; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.pollex.pam.config.Constants; -import java.io.Serializable; -import java.time.Instant; -import java.util.HashSet; -import java.util.Locale; -import java.util.Set; -import javax.persistence.*; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import org.apache.commons.lang3.StringUtils; -import org.hibernate.annotations.BatchSize; -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; - -/** - * A user. - */ -@Entity -@Table(name = "jhi_user") -@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) -public class User extends AbstractAuditingEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator") - private Long id; - - @NotNull - @Pattern(regexp = Constants.LOGIN_REGEX) - @Size(min = 1, max = 50) - @Column(length = 50, unique = true, nullable = false) - private String login; - - @JsonIgnore - @NotNull - @Size(min = 60, max = 60) - @Column(name = "password_hash", length = 60, nullable = false) - private String password; - - @Size(max = 50) - @Column(name = "first_name", length = 50) - private String firstName; - - @Size(max = 50) - @Column(name = "last_name", length = 50) - private String lastName; - - @Email - @Size(min = 5, max = 254) - @Column(length = 254, unique = true) - private String email; - - @NotNull - @Column(nullable = false) - private boolean activated = false; - - @Size(min = 2, max = 10) - @Column(name = "lang_key", length = 10) - private String langKey; - - @Size(max = 256) - @Column(name = "image_url", length = 256) - private String imageUrl; - - @Size(max = 20) - @Column(name = "activation_key", length = 20) - @JsonIgnore - private String activationKey; - - @Size(max = 20) - @Column(name = "reset_key", length = 20) - @JsonIgnore - private String resetKey; - - @Column(name = "reset_date") - private Instant resetDate = null; - - @JsonIgnore - @ManyToMany - @JoinTable( - name = "jhi_user_authority", - joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, - inverseJoinColumns = { @JoinColumn(name = "authority_name", referencedColumnName = "name") } - ) - @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) - @BatchSize(size = 20) - private Set<Authority> authorities = new HashSet<>(); - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - // Lowercase the login before saving it in database - public void setLogin(String login) { - this.login = StringUtils.lowerCase(login, Locale.ENGLISH); - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public boolean isActivated() { - return activated; - } - - public void setActivated(boolean activated) { - this.activated = activated; - } - - public String getActivationKey() { - return activationKey; - } - - public void setActivationKey(String activationKey) { - this.activationKey = activationKey; - } - - public String getResetKey() { - return resetKey; - } - - public void setResetKey(String resetKey) { - this.resetKey = resetKey; - } - - public Instant getResetDate() { - return resetDate; - } - - public void setResetDate(Instant resetDate) { - this.resetDate = resetDate; - } - - public String getLangKey() { - return langKey; - } - - public void setLangKey(String langKey) { - this.langKey = langKey; - } - - public Set<Authority> getAuthorities() { - return authorities; - } - - public void setAuthorities(Set<Authority> authorities) { - this.authorities = authorities; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof User)) { - return false; - } - return id != null && id.equals(((User) o).id); - } - - @Override - public int hashCode() { - // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ - return getClass().hashCode(); - } - - // prettier-ignore - @Override - public String toString() { - return "User{" + - "login='" + login + '\'' + - ", firstName='" + firstName + '\'' + - ", lastName='" + lastName + '\'' + - ", email='" + email + '\'' + - ", imageUrl='" + imageUrl + '\'' + - ", activated='" + activated + '\'' + - ", langKey='" + langKey + '\'' + - ", activationKey='" + activationKey + '\'' + - "}"; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/domain/package-info.java b/pamapi/src/main/java/com/pollex/pam/domain/package-info.java deleted file mode 100644 index bcfa3f9..0000000 --- a/pamapi/src/main/java/com/pollex/pam/domain/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * JPA domain objects. - */ -package com.pollex.pam.domain; diff --git a/pamapi/src/main/java/com/pollex/pam/enums/AppointmentStatusEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/AppointmentStatusEnum.java deleted file mode 100644 index 55d674c..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/AppointmentStatusEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum AppointmentStatusEnum { - AVAILABLE, - DELETED -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/ConsultantDetailEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/ConsultantDetailEnum.java deleted file mode 100644 index 331dd27..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/ConsultantDetailEnum.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pollex.pam.enums; - -public enum ConsultantDetailEnum { - ID("ConsultantId"), - NAME("ConsultantName"), - AGENT_NO("ConsultantAgentNo"); - - private final String value; - - ConsultantDetailEnum(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/ContactStatusEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/ContactStatusEnum.java deleted file mode 100644 index 934a167..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/ContactStatusEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pollex.pam.enums; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public enum ContactStatusEnum { - @JsonProperty("picked") - PICKED, - - @JsonProperty("reserved") - RESERVED, - - @JsonProperty("contacted") - CONTACTED, - - @JsonProperty("done") - DONE, - - @JsonProperty("closed") - CLOSED, - - @JsonProperty("cancel") - CANCEL -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/CustomerDetailEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/CustomerDetailEnum.java deleted file mode 100644 index aa56703..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/CustomerDetailEnum.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.enums; - -public enum CustomerDetailEnum { - DB_ID("CustomerDBId"); - - private final String value; - - CustomerDetailEnum(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/GenderEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/GenderEnum.java deleted file mode 100644 index 0bcc63f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/GenderEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pollex.pam.enums; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public enum GenderEnum { - - @JsonProperty("male") - MALE, - - @JsonProperty("female") - FEMALE; - - @JsonCreator - public static GenderEnum forName(String name) { - for(GenderEnum c: values()) { - if(c.name().equals(name.toUpperCase())) { - return c; - } - } - - return null; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/InterviewRecordStatusEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/InterviewRecordStatusEnum.java deleted file mode 100644 index 9bc0ee8..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/InterviewRecordStatusEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum InterviewRecordStatusEnum { - AVAILABLE, - DELETED -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/LoginMethod.java b/pamapi/src/main/java/com/pollex/pam/enums/LoginMethod.java deleted file mode 100644 index 836e852..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/LoginMethod.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum LoginMethod { - OTP, - E_SERVICE -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/LoginResult.java b/pamapi/src/main/java/com/pollex/pam/enums/LoginResult.java deleted file mode 100644 index 562700d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/LoginResult.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum LoginResult { - SUCCESS, - FAIL -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/NotificationTypeEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/NotificationTypeEnum.java deleted file mode 100644 index a14a84d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/NotificationTypeEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum NotificationTypeEnum { - SYSTEM, - ACTIVITY -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java deleted file mode 100644 index 43635cd..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/OtpLoginTypeEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum OtpLoginTypeEnum { - SMS, - EMAIL -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/OtpTmpStatusEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/OtpTmpStatusEnum.java deleted file mode 100644 index b48d88e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/OtpTmpStatusEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum OtpTmpStatusEnum { - UNVERIFIED, - VERRIFIED -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/PersonalNotificationRoleEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/PersonalNotificationRoleEnum.java deleted file mode 100644 index 0f063c2..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/PersonalNotificationRoleEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum PersonalNotificationRoleEnum { - CUSTOMER, - CONSULTANT -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionStatusEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionStatusEnum.java deleted file mode 100644 index 0b708e6..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionStatusEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum SatisfactionStatusEnum { - UNFILLED, - FILLED -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionTypeEnum.java b/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionTypeEnum.java deleted file mode 100644 index a15dfc0..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/SatisfactionTypeEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum SatisfactionTypeEnum { - APPOINTMENT, // 撠“�����遛��漲 - SYSTEM // 撠像���遛��漲 -} diff --git a/pamapi/src/main/java/com/pollex/pam/enums/SendEmailMsgMethod.java b/pamapi/src/main/java/com/pollex/pam/enums/SendEmailMsgMethod.java deleted file mode 100644 index 42a10ce..0000000 --- a/pamapi/src/main/java/com/pollex/pam/enums/SendEmailMsgMethod.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pollex.pam.enums; - -public enum SendEmailMsgMethod { - PAM_EMAIL_SERVICE, - POLLEX_GMAIL -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentClosedInfoRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentClosedInfoRepository.java deleted file mode 100644 index b5d23ad..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentClosedInfoRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.AppointmentClosedInfo; - -@Repository -public interface AppointmentClosedInfoRepository extends JpaRepository<AppointmentClosedInfo, Long>{ - - Optional<AppointmentClosedInfo> findByAppointmentId(Long apId); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java deleted file mode 100644 index 61b5a04..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.enums.AppointmentStatusEnum; -import com.pollex.pam.enums.ContactStatusEnum; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.AppointmentCustomerView; - -@Repository -public interface AppointmentCustomerViewRepository extends JpaRepository<AppointmentCustomerView, Long>{ - List<AppointmentCustomerView> findByAgentNo(String agentNo); - List<AppointmentCustomerView> findByAgentNoAndCustomerId(String agentNo, Long customerId); - List<AppointmentCustomerView> findAllByCommunicateStatusAndStatus(ContactStatusEnum contactStatus, AppointmentStatusEnum status); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentExpiringNotifyRecordRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentExpiringNotifyRecordRepository.java deleted file mode 100644 index 61a559a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentExpiringNotifyRecordRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.AppointmentExpiringNotifyRecord; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface AppointmentExpiringNotifyRecordRepository extends JpaRepository<AppointmentExpiringNotifyRecord, Long> { - List<AppointmentExpiringNotifyRecord> findAllByAppointmentId(Long appointmentId); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentMemoRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentMemoRepository.java deleted file mode 100644 index 1b14cc7..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentMemoRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pollex.pam.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.AppointmentMemo; - -@Repository -public interface AppointmentMemoRepository extends JpaRepository<AppointmentMemo, Long>{ - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentNoticeLogRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentNoticeLogRepository.java deleted file mode 100644 index e939258..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentNoticeLogRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.AppointmentNoticeLog; - -@Repository -public interface AppointmentNoticeLogRepository extends JpaRepository<AppointmentNoticeLog, Long>{ - - List<AppointmentNoticeLog> findByAppointmentId(Long appointmentId); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentRepository.java deleted file mode 100644 index fe01955..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; -import java.util.Optional; - -import com.pollex.pam.enums.AppointmentStatusEnum; -import com.pollex.pam.enums.ContactStatusEnum; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.Appointment; - -@Repository -public interface AppointmentRepository extends JpaRepository<Appointment, Long>{ - - List<Appointment> findByAgentNo(String agentNo); - - List<Appointment> findByAgentNoAndCustomerId(String agentNo, Long customerId); - - Optional<Appointment> findTopByAgentNoAndCustomerIdOrderByAppointmentDateDesc(String agentNo, Long customerId); - - List<Appointment> findAllByCommunicateStatusAndStatus(ContactStatusEnum contactStatus, AppointmentStatusEnum status); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AuthorityRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AuthorityRepository.java deleted file mode 100644 index 111c063..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/AuthorityRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.Authority; -import org.springframework.data.jpa.repository.JpaRepository; - -/** - * Spring Data JPA repository for the {@link Authority} entity. - */ -public interface AuthorityRepository extends JpaRepository<Authority, String> {} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/ConsultantRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/ConsultantRepository.java deleted file mode 100644 index af244ab..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/ConsultantRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.Consultant; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface ConsultantRepository extends JpaRepository<Consultant, Long>, JpaSpecificationExecutor<Consultant> { - Optional<Consultant> findOneByAgentNo(String agentNo); - List<Consultant> findAllByRecommendIsTrue(); - List<Consultant> findAllByAgentNoIn(List<String> agentNoList); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/CustomerFavoriteConsultantRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/CustomerFavoriteConsultantRepository.java deleted file mode 100644 index e61c4df..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/CustomerFavoriteConsultantRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.domain.CustomerFavoriteConsultant; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface CustomerFavoriteConsultantRepository extends JpaRepository<CustomerFavoriteConsultant, Long> { - List<CustomerFavoriteConsultant> findAllByCustomerId(Long id); - Optional<CustomerFavoriteConsultant> findOneByCustomerIdAndConsultant(Long customerId, Consultant consultant); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/CustomerRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/CustomerRepository.java deleted file mode 100644 index e4ff8ee..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/CustomerRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pollex.pam.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.Customer; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface CustomerRepository extends JpaRepository<Customer, Long>{ - - default Optional<Customer> findOneByEmailEqualsOrPhoneEquals(String emailOrEmail) { - return this.findOneByEmailEqualsOrPhoneEquals(emailOrEmail, emailOrEmail); - } - - Optional<Customer> findOneByEmailEqualsOrPhoneEquals(String email, String phone); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/InterviewRecordRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/InterviewRecordRepository.java deleted file mode 100644 index 1b2f8d4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/InterviewRecordRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.InterviewRecord; -import com.pollex.pam.enums.InterviewRecordStatusEnum; - -@Repository -public interface InterviewRecordRepository extends JpaRepository<InterviewRecord, Long>{ - - List<InterviewRecord> findByAppointmentId(Long appointmentId); - - List<InterviewRecord> findByAppointmentIdAndStatus(Long appointmentId, InterviewRecordStatusEnum status); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/LoginRecordRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/LoginRecordRepository.java deleted file mode 100644 index 6d8f3ab..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/LoginRecordRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.LoginRecord; -import com.pollex.pam.enums.LoginResult; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface LoginRecordRepository extends JpaRepository<LoginRecord, Long> { - Optional<LoginRecord> findTopByAccountAndResultOrderByLoginDateDesc(String account, LoginResult loginResult); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/OtpTmpRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/OtpTmpRepository.java deleted file mode 100644 index 7b49c10..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/OtpTmpRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.OtpTmp; - -@Repository -public interface OtpTmpRepository extends JpaRepository<OtpTmp, Long>{ - - OtpTmp findByAccountAndIndexKey(String account, String indexKey); - - OtpTmp findByAccount(String account); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/PersonalNotificationRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/PersonalNotificationRepository.java deleted file mode 100644 index e6e4027..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/PersonalNotificationRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.PersonalNotification; -import com.pollex.pam.enums.PersonalNotificationRoleEnum; - -@Repository -public interface PersonalNotificationRepository extends JpaRepository<PersonalNotification, Long>{ - - List<PersonalNotification> findAllByOwnerRoleAndOwnerId(PersonalNotificationRoleEnum role, Long ownerId); - -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java deleted file mode 100644 index fa37237..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pollex.pam.repository; - -import java.util.List; -import java.util.Optional; - -import com.pollex.pam.enums.SatisfactionStatusEnum; -import com.pollex.pam.enums.SatisfactionTypeEnum; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import com.pollex.pam.domain.Satisfaction; - -@Repository -public interface SatisfactionRepository extends JpaRepository<Satisfaction, Long>{ - - List<Satisfaction> findByAgentNoAndType(String agentNo, SatisfactionTypeEnum type); - - List<Satisfaction> findByCustomerId(Long customerId); - - Optional<Satisfaction> findOneByAppointmentIdAndType(Long appointmentId, SatisfactionTypeEnum type); - - List<Satisfaction> findAllByStatusAndType(SatisfactionStatusEnum status, SatisfactionTypeEnum type); - - @Query(value = "SELECT avg(score) FROM satisfaction where type='APPOINTMENT'" - + " and agent_no=:agent_no" - + " and score is not null" - , nativeQuery = true) - Optional<Float> getAgentScoreAvg(@Param("agent_no") String agentNo); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/UserRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/UserRepository.java deleted file mode 100644 index f4407cf..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/UserRepository.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pollex.pam.repository; - -import com.pollex.pam.domain.User; -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Spring Data JPA repository for the {@link User} entity. - */ -@Repository -public interface UserRepository extends JpaRepository<User, Long> { - String USERS_BY_LOGIN_CACHE = "usersByLogin"; - - String USERS_BY_EMAIL_CACHE = "usersByEmail"; - - Optional<User> findOneByActivationKey(String activationKey); - - List<User> findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant dateTime); - - Optional<User> findOneByResetKey(String resetKey); - - Optional<User> findOneByEmailIgnoreCase(String email); - - Optional<User> findOneByLogin(String login); - - @EntityGraph(attributePaths = "authorities") - @Cacheable(cacheNames = USERS_BY_LOGIN_CACHE) - Optional<User> findOneWithAuthoritiesByLogin(String login); - - @EntityGraph(attributePaths = "authorities") - @Cacheable(cacheNames = USERS_BY_EMAIL_CACHE) - Optional<User> findOneWithAuthoritiesByEmailIgnoreCase(String email); - - Page<User> findAllByIdNotNullAndActivatedIsTrue(Pageable pageable); -} diff --git a/pamapi/src/main/java/com/pollex/pam/repository/package-info.java b/pamapi/src/main/java/com/pollex/pam/repository/package-info.java deleted file mode 100644 index 44ecf27..0000000 --- a/pamapi/src/main/java/com/pollex/pam/repository/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring Data JPA repositories. - */ -package com.pollex.pam.repository; diff --git a/pamapi/src/main/java/com/pollex/pam/security/AuthoritiesConstants.java b/pamapi/src/main/java/com/pollex/pam/security/AuthoritiesConstants.java deleted file mode 100644 index b67d92d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/security/AuthoritiesConstants.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.security; - -/** - * Constants for Spring Security authorities. - */ -public final class AuthoritiesConstants { - - public static final String ADMIN = "ROLE_ADMIN"; - - public static final String USER = "ROLE_USER"; - - public static final String ANONYMOUS = "ROLE_ANONYMOUS"; - - private AuthoritiesConstants() {} -} diff --git a/pamapi/src/main/java/com/pollex/pam/security/DomainUserDetailsService.java b/pamapi/src/main/java/com/pollex/pam/security/DomainUserDetailsService.java index e8a35fa..91b4da8 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/DomainUserDetailsService.java +++ b/pamapi/src/main/java/com/pollex/pam/security/DomainUserDetailsService.java @@ -1,7 +1,7 @@ package com.pollex.pam.security; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; import java.util.*; import java.util.stream.Collectors; import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; diff --git a/pamapi/src/main/java/com/pollex/pam/security/SecurityUtils.java b/pamapi/src/main/java/com/pollex/pam/security/SecurityUtils.java deleted file mode 100644 index 787c1f3..0000000 --- a/pamapi/src/main/java/com/pollex/pam/security/SecurityUtils.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.pollex.pam.security; - -import java.util.Arrays; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Stream; - -import com.pollex.pam.enums.ConsultantDetailEnum; -import com.pollex.pam.enums.CustomerDetailEnum; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; - -/** - * Utility class for Spring Security. - */ -public final class SecurityUtils { - - private SecurityUtils() {} - - /** - * Get the login of the current user. - * - * @return the login of the current user. - */ - public static Optional<String> getCurrentUserLogin() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication())); - } - - private static String extractPrincipal(Authentication authentication) { - if (authentication == null) { - return null; - } else if (authentication.getPrincipal() instanceof UserDetails) { - UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); - return springSecurityUser.getUsername(); - } else if (authentication.getPrincipal() instanceof String) { - return (String) authentication.getPrincipal(); - } - return null; - } - - /** - * Get the JWT of the current user. - * - * @return the JWT of the current user. - */ - public static Optional<String> getCurrentUserJWT() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional - .ofNullable(securityContext.getAuthentication()) - .filter(authentication -> authentication.getCredentials() instanceof String) - .map(authentication -> (String) authentication.getCredentials()); - } - - /** - * Check if a user is authenticated. - * - * @return true if the user is authenticated, false otherwise. - */ - public static boolean isAuthenticated() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - return authentication != null && getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals); - } - - /** - * Checks if the current user has any of the authorities. - * - * @param authorities the authorities to check. - * @return true if the current user has any of the authorities, false otherwise. - */ - public static boolean hasCurrentUserAnyOfAuthorities(String... authorities) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - return ( - authentication != null && getAuthorities(authentication).anyMatch(authority -> Arrays.asList(authorities).contains(authority)) - ); - } - - /** - * Checks if the current user has none of the authorities. - * - * @param authorities the authorities to check. - * @return true if the current user has none of the authorities, false otherwise. - */ - public static boolean hasCurrentUserNoneOfAuthorities(String... authorities) { - return !hasCurrentUserAnyOfAuthorities(authorities); - } - - /** - * Checks if the current user has a specific authority. - * - * @param authority the authority to check. - * @return true if the current user has the authority, false otherwise. - */ - public static boolean hasCurrentUserThisAuthority(String authority) { - return hasCurrentUserAnyOfAuthorities(authority); - } - - private static Stream<String> getAuthorities(Authentication authentication) { - return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority); - } - - public static String getAgentNo() { - Map<String, String> userDetails = getCurrentUserDetails(); - return userDetails.get(ConsultantDetailEnum.AGENT_NO.getValue()); - } - - public static Long getCustomerDBId() { - Map<String, String> userDetails = getCurrentUserDetails(); - return Long.parseLong(userDetails.get(CustomerDetailEnum.DB_ID.getValue())); - } - - public static Map<String, String> getCurrentUserDetails() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - if(securityContext.getAuthentication()==null || - securityContext.getAuthentication().getDetails() ==null) { - return null; - } - return (Map<String, String>) securityContext.getAuthentication().getDetails(); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/security/SpringSecurityAuditorAware.java b/pamapi/src/main/java/com/pollex/pam/security/SpringSecurityAuditorAware.java index bd4efb7..66c8c8b 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/SpringSecurityAuditorAware.java +++ b/pamapi/src/main/java/com/pollex/pam/security/SpringSecurityAuditorAware.java @@ -1,7 +1,9 @@ package com.pollex.pam.security; -import com.pollex.pam.config.Constants; +import com.pollex.pam.business.config.Constants; import java.util.Optional; + +import com.pollex.pam.business.security.SecurityUtils; import org.springframework.data.domain.AuditorAware; import org.springframework.stereotype.Component; diff --git a/pamapi/src/main/java/com/pollex/pam/security/provider/CustomAuthenticationProvider.java b/pamapi/src/main/java/com/pollex/pam/security/provider/CustomAuthenticationProvider.java index 079a473..4bbdd6b 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/provider/CustomAuthenticationProvider.java +++ b/pamapi/src/main/java/com/pollex/pam/security/provider/CustomAuthenticationProvider.java @@ -1,7 +1,7 @@ package com.pollex.pam.security.provider; import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.security.token.EServiceAuthenticationToken; +import com.pollex.pam.business.security.token.EServiceAuthenticationToken; import com.pollex.pam.security.token.OtpAuthenticationToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AbstractAuthenticationToken; diff --git a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java index 54391f0..f157b02 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java +++ b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java @@ -1,26 +1,19 @@ package com.pollex.pam.security.provider; -import com.fasterxml.jackson.core.JsonProcessingException; +import com.pollex.pam.business.domain.Consultant; +import com.pollex.pam.business.enums.ConsultantDetailEnum; +import com.pollex.pam.business.repository.ConsultantRepository; +import com.pollex.pam.business.service.EServiceConnectService; +import com.pollex.pam.business.service.dto.EServiceResponse; +import com.pollex.pam.business.web.errors.ConsultantDisableException; +import com.pollex.pam.business.config.AppProperties; +import com.pollex.pam.business.security.token.EServiceAuthenticationToken; +import com.pollex.pam.business.web.errors.EServiceErrorException; import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.enums.ConsultantDetailEnum; -import com.pollex.pam.repository.ConsultantRepository; -import com.pollex.pam.security.token.EServiceAuthenticationToken; -import com.pollex.pam.service.LoginRecordService; -import com.pollex.pam.service.dto.EServiceResponse; -import com.pollex.pam.web.rest.errors.EServiceErrorException; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -28,15 +21,8 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; -import javax.net.ssl.SSLContext; import java.security.GeneralSecurityException; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.X509Certificate; import java.util.*; @Component @@ -46,48 +32,43 @@ private static final Logger log = LoggerFactory.getLogger(EServiceAuthenticationProvider.class); @Autowired - ApplicationProperties applicationProperty; + ApplicationProperties applicationProperties; @Autowired ConsultantRepository consultantRepository; @Autowired - LoginRecordService loginRecordService; + EServiceConnectService eServiceConnectService; public Authentication authenticate(EServiceAuthenticationToken authenticationToken) throws AuthenticationException { String account = authenticationToken.getPrincipal(); String credentials = authenticationToken.getCredentials(); - if(applicationProperty.isMockLogin()){ - loginRecordService.saveEServiceLoginSuccessRecord(account); - return getConsultantToken(account, credentials); + if(applicationProperties.isMockLogin()){ + return getConsultantTokenAndRecordLoginTime(account, credentials); } try { - ResponseEntity<EServiceResponse> responseEntity = loginByEService(account, credentials); + ResponseEntity<EServiceResponse> responseEntity = eServiceConnectService.loginByEService(account, credentials); if(HttpStatus.OK.equals(responseEntity.getStatusCode())) { EServiceResponse eServiceResponse = responseEntity.getBody(); log.debug("eService response = {}", eServiceResponse); if(E_SERVICE_LOGIN_SUCCESS_CODE.equals(eServiceResponse.getIssuccess())){ - loginRecordService.saveEServiceLoginSuccessRecord(account); - return getConsultantToken(account, credentials); + return getConsultantTokenAndRecordLoginTime(account, credentials); } else { - loginRecordService.saveEServiceLoginFailRecord(account, eServiceResponse.getMsg()); throw new EServiceErrorException(eServiceResponse.getMsg()); } } throw new RuntimeException("eService http error!, response http status code = " + responseEntity.getStatusCode()); - } catch (JsonProcessingException e) { - throw new RuntimeException("convert to json processing error!"); } catch (GeneralSecurityException e) { throw new RuntimeException("General Security SSL error!"); } } - private UsernamePasswordAuthenticationToken getConsultantToken(String account, String credential) { + private UsernamePasswordAuthenticationToken getConsultantTokenAndRecordLoginTime(String account, String credential) throws ConsultantDisableException { Consultant consultant = consultantRepository.findOneByAgentNo(account).orElseThrow(() -> new UsernameNotFoundException("閰脤“����蒂銝��慦�像�蝟餌絞銝�")); List<GrantedAuthority> grantedAuths = Arrays.asList(new SimpleGrantedAuthority("ROLE_USER")); @@ -100,50 +81,5 @@ authenticationToken.setDetails(details); return authenticationToken; - } - - private ResponseEntity<EServiceResponse> loginByEService(String account, String paxxword) throws JsonProcessingException, GeneralSecurityException { - RestTemplate restTemplate = getTrustAllRestTemplate(); - settingMessageConvertersToSpecifyType(restTemplate, MediaType.ALL); - - String urlTemplate = UriComponentsBuilder.fromHttpUrl(applicationProperty.geteServiceLoginUrl()) - .queryParam("func", applicationProperty.geteServiceLoginFunc()) - .queryParam("id", account) - .queryParam("pin", paxxword) - .queryParam("pwd", paxxword) - .queryParam("sys", applicationProperty.geteServiceLoginSys()) - .queryParam("transactionId", UUID.randomUUID().toString()) - .encode().toUriString(); - - log.debug("http get loginByEService, url = {}", urlTemplate); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<String> entity = new HttpEntity<>(headers); - return restTemplate.exchange(urlTemplate, HttpMethod.GET, entity, EServiceResponse.class); - } - - private RestTemplate getTrustAllRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - SSLContext sslContext = SSLContexts.custom() - .loadTrustMaterial(null, (X509Certificate[] x509Certs, String s) -> true) - .build(); - SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); - CloseableHttpClient httpClient = HttpClients.custom() - .setSSLSocketFactory(csf) - .build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); - requestFactory.setHttpClient(httpClient); - requestFactory.setConnectTimeout(300000); - requestFactory.setReadTimeout(300000); - return new RestTemplate(requestFactory); - } - - private void settingMessageConvertersToSpecifyType(RestTemplate restTemplate, MediaType mediaType) { - List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); - converter.setSupportedMediaTypes(Collections.singletonList(mediaType)); - messageConverters.add(converter); - restTemplate.setMessageConverters(messageConverters); } } diff --git a/pamapi/src/main/java/com/pollex/pam/security/provider/OtpAuthenticationProvider.java b/pamapi/src/main/java/com/pollex/pam/security/provider/OtpAuthenticationProvider.java index 3802087..c76937e 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/provider/OtpAuthenticationProvider.java +++ b/pamapi/src/main/java/com/pollex/pam/security/provider/OtpAuthenticationProvider.java @@ -1,6 +1,7 @@ package com.pollex.pam.security.provider; -import com.pollex.pam.web.rest.errors.CustomerNotRegisteredException; +import com.pollex.pam.business.web.errors.CustomerNotRegisteredException; +import com.pollex.pam.security.token.OtpAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -8,13 +9,12 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.stereotype.Component; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.repository.CustomerRepository; -import com.pollex.pam.security.token.OtpAuthenticationToken; +import com.pollex.pam.business.domain.Customer; +import com.pollex.pam.business.repository.CustomerRepository; import com.pollex.pam.service.CustomerAuthService; -import com.pollex.pam.service.OtpTmpService; +import com.pollex.pam.business.service.OtpTmpService; import com.pollex.pam.service.OtpUtilService; -import com.pollex.pam.web.rest.vm.OtpAccount; +import com.pollex.pam.business.web.vm.OtpAccount; @Component public class OtpAuthenticationProvider { diff --git a/pamapi/src/main/java/com/pollex/pam/security/token/EServiceAuthenticationToken.java b/pamapi/src/main/java/com/pollex/pam/security/token/EServiceAuthenticationToken.java deleted file mode 100644 index 6bc8410..0000000 --- a/pamapi/src/main/java/com/pollex/pam/security/token/EServiceAuthenticationToken.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pollex.pam.security.token; - -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.SpringSecurityCoreVersion; -import org.springframework.util.Assert; - -import java.util.Collection; - -public class EServiceAuthenticationToken extends AbstractAuthenticationToken { - - private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; - - private final String principle; - private String credentials; - - public EServiceAuthenticationToken(String principle, String credentials) { - super(null); - this.principle = principle; - this.credentials = credentials; - setAuthenticated(false); - } - - public EServiceAuthenticationToken(String principle, String credentials, Collection<? extends GrantedAuthority> authorities) { - super(authorities); - this.principle = principle; - this.credentials = credentials; - setAuthenticated(true); - } - - @Override - public String getCredentials() { - return credentials; - } - - @Override - public String getPrincipal() { - return principle; - } - - @Override - public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { - Assert.isTrue(!isAuthenticated, - "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); - super.setAuthenticated(false); - } - - @Override - public void eraseCredentials() { - super.eraseCredentials(); - this.credentials = null; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/security/token/OtpAuthenticationToken.java b/pamapi/src/main/java/com/pollex/pam/security/token/OtpAuthenticationToken.java index 9652e9c..a4c450c 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/token/OtpAuthenticationToken.java +++ b/pamapi/src/main/java/com/pollex/pam/security/token/OtpAuthenticationToken.java @@ -1,12 +1,9 @@ package com.pollex.pam.security.token; -import com.pollex.pam.web.rest.vm.OtpAccount; +import com.pollex.pam.business.web.vm.OtpAccount; import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.SpringSecurityCoreVersion; import org.springframework.util.Assert; - -import java.util.Collection; public class OtpAuthenticationToken extends AbstractAuthenticationToken { diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentClosedInfoService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentClosedInfoService.java deleted file mode 100644 index 9931a44..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentClosedInfoService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pollex.pam.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.repository.AppointmentClosedInfoRepository; -import com.pollex.pam.web.rest.errors.AppointmentClosedInfoNotFoundException; - -@Service -@Transactional -public class AppointmentClosedInfoService { - - @Autowired - AppointmentClosedInfoRepository appointmentClosedInfoRepository; - - public AppointmentClosedInfo findByAppointmentId(Long apId) { - return appointmentClosedInfoRepository.findByAppointmentId(apId) - .orElseThrow(AppointmentClosedInfoNotFoundException::new); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentMemoService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentMemoService.java deleted file mode 100644 index 6fdd613..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentMemoService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.pollex.pam.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentMemo; -import com.pollex.pam.repository.AppointmentMemoRepository; -import com.pollex.pam.repository.AppointmentRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.AppointmentMemoCreateDTO; -import com.pollex.pam.service.dto.AppointmentMemoUpdateDTO; -import com.pollex.pam.service.mapper.AppointmentMemoMapper; -import com.pollex.pam.web.rest.errors.AppointmentMemoNotFoundException; -import com.pollex.pam.web.rest.errors.AppointmentNotFoundException; - -@Service -@Transactional -public class AppointmentMemoService { - - @Autowired - AppointmentMemoRepository appointmentMemoRepository; - - @Autowired - AppointmentMemoMapper appointmentMemoMapper; - - @Autowired - AppointmentRepository appointmentRepository; - - public AppointmentMemo create(AppointmentMemoCreateDTO memoDTO) { - AppointmentMemo memo = appointmentMemoMapper.toAppointmentMemo(memoDTO); - return appointmentMemoRepository.save(memo); - } - - public void checkPermission(Long appointmentId) { - Appointment appointment = appointmentRepository.findById(appointmentId) - .orElseThrow(AppointmentNotFoundException::new); - if(!appointment.getAgentNo().equals(SecurityUtils.getAgentNo())) { - throw new IllegalAccessError("not have permission"); - } - } - - public AppointmentMemo update(AppointmentMemoUpdateDTO memoDTO) { - AppointmentMemo memo = appointmentMemoRepository - .findById(memoDTO.getId()) - .orElseThrow(AppointmentMemoNotFoundException::new); - checkPermission(memo.getAppointmentId()); - appointmentMemoMapper.copyToAppointmentMemo(memoDTO, memo); - return appointmentMemoRepository.save(memo); - } - - public void delete(Long memoId) { - AppointmentMemo memo = appointmentMemoRepository - .findById(memoId) - .orElseThrow(AppointmentMemoNotFoundException::new); - checkPermission(memo.getAppointmentId()); - appointmentMemoRepository.delete(memo); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentNoticeLogService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentNoticeLogService.java deleted file mode 100644 index bfb0134..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentNoticeLogService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pollex.pam.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.repository.AppointmentNoticeLogRepository; -import com.pollex.pam.service.dto.AppointmentNoticeSendDTO; -import com.pollex.pam.service.mapper.AppointmentNoticeSendMapper; - -@Service -@Transactional -public class AppointmentNoticeLogService { - - @Autowired - AppointmentNoticeLogRepository appointmentNoticeLogRepository; - - @Autowired - AppointmentNoticeSendMapper appointmentNoticeSendMapper; - - public AppointmentNoticeLog create(AppointmentNoticeSendDTO noticeSendDTO) { - AppointmentNoticeLog appointmentNoticeLog = - appointmentNoticeSendMapper.toAppointmentNoticeLog(noticeSendDTO); - return appointmentNoticeLogRepository.save(appointmentNoticeLog); - } - - public List<AppointmentNoticeLog> findByAppointmentId(Long appointmentId){ - return appointmentNoticeLogRepository.findByAppointmentId(appointmentId); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java deleted file mode 100644 index fe55f38..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java +++ /dev/null @@ -1,319 +0,0 @@ -package com.pollex.pam.service; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import com.pollex.pam.appointment.process.AppointmentProcess; -import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.config.Constants; -import com.pollex.pam.enums.SatisfactionTypeEnum; -import com.pollex.pam.service.dto.*; -import com.pollex.pam.web.rest.errors.SendEmailFailException; -import com.pollex.pam.web.rest.errors.SendSMSFailException; -import io.jsonwebtoken.lang.Assert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentCustomerView; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.enums.InterviewRecordStatusEnum; -import com.pollex.pam.repository.AppointmentCustomerViewRepository; -import com.pollex.pam.repository.AppointmentRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.mapper.AppointmentCustomerViewMapper; -import com.pollex.pam.service.mapper.AppointmentDTOMapper; -import com.pollex.pam.web.rest.errors.AppointmentNotFoundException; -import org.springframework.util.StringUtils; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.SpringTemplateEngine; - -import static com.pollex.pam.enums.AppointmentStatusEnum.AVAILABLE; -import static com.pollex.pam.enums.AppointmentStatusEnum.DELETED; - -@Service -@Transactional -public class AppointmentService { - - private static final Logger log = LoggerFactory.getLogger(AppointmentService.class); - - private static final String NOTIFY_EMAIL_SUBJECT = "靽���像�蝟餌絞�嚗���"; - - @Autowired - AppointmentRepository appointmentRepository; - - @Autowired - AppointmentDTOMapper appointmentDTOMapper; - - @Autowired - ConsultantService consultantService; - - @Autowired - AppointmentCustomerViewMapper appointmentCustomerViewMapper; - - @Autowired - AppointmentCustomerViewRepository appointmentCustomerViewRepository; - - @Autowired - SatisfactionService satisfactionService; - - @Autowired - SendMsgService sendMsgService; - - @Autowired - ApplicationProperties applicationProperties; - - @Autowired - SpringTemplateEngine springTemplateEngine; - - @Autowired - InterviewRecordService interviewRecordService; - - @Autowired - AppointmentProcess abstractAppointmentProcess; - - @Autowired - PersonalNotificationService personalNotificationService; - - public Appointment customerCreateAppointment(AppointmentCreateDTO appointmentCreateDTO) { - Appointment appointment = appointmentDTOMapper.toAppointment(appointmentCreateDTO); - appointment.setStatus(AVAILABLE); - appointment.setCustomerId(SecurityUtils.getCustomerDBId()); - appointment.setCommunicateStatus(ContactStatusEnum.RESERVED); - return appointmentRepository.save(appointment); - } - - public Appointment updateAppointment(AppointmentUpdateDTO updateAppointmentDTO) { - Appointment appointment = appointmentRepository.findById(updateAppointmentDTO.getId()).get(); - BeanUtils.copyProperties(updateAppointmentDTO, appointment); - appointment.setPhone(updateAppointmentDTO.getPhone()); - appointment.setEmail(updateAppointmentDTO.getEmail()); - appointment.setContactType(updateAppointmentDTO.getContactType()); - appointment.setGender(updateAppointmentDTO.getGender()); - appointment.setAge(updateAppointmentDTO.getAge()); - appointment.setJob(updateAppointmentDTO.getJob()); - appointment.setRequirement(updateAppointmentDTO.getRequirement()); - appointment.setHopeContactTime(updateAppointmentDTO.getHopeContactTime()); - appointment.setOtherRequirement(updateAppointmentDTO.getOtherRequirement()); - appointment.setLastModifiedDate(Instant.now()); - - return appointmentRepository.save(appointment); - } - - public void markAppointmentDeleted(Long appointmentId) { - Appointment appointment = appointmentRepository.findById(appointmentId).get(); - appointment.setStatus(DELETED); - appointment.setLastModifiedDate(Instant.now()); - appointment.setCommunicateStatus(ContactStatusEnum.CANCEL); - appointmentRepository.save(appointment); - personalNotificationService.createMarkAppointmentDeletedToConsultant(appointment); - - } - - public List<Appointment> findByAgentNo(String agentNo) { - return appointmentRepository.findByAgentNo(agentNo); - } - - public Appointment markAsContacted(Long appointmentId) { - Appointment appointment = appointmentRepository.findById(appointmentId).get(); - appointment.setCommunicateStatus(ContactStatusEnum.CONTACTED); - appointment.setContactTime(Instant.now()); - appointment.setLastModifiedDate(Instant.now()); - return appointmentRepository.save(appointment); - } - - public AppointmentCustomerViewDTO getAppointmentDetail(Long appointmentId) { - AppointmentCustomerView appointment = appointmentCustomerViewRepository.findById(appointmentId) - .orElseThrow(AppointmentNotFoundException::new); - - AppointmentCustomerViewDTO dto = appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointment); - setSatisfactionScore(dto, appointmentId); -// setInterviewRecordDTO(dto); - return dto; - } - - public void setInterviewRecordDTO(AppointmentCustomerViewDTO dto) { - List<InterviewRecordDTO> interviewRecords = interviewRecordService.findByAppointmentIdAndStatus(dto.getId(), InterviewRecordStatusEnum.AVAILABLE); - dto.setInterviewRecordDTOs(interviewRecords); - } - - public List<AppointmentCustomerViewDTO> getConsultantAvailableAppointments(String agentNo) { - return appointmentCustomerViewRepository.findByAgentNo(agentNo).stream() - .filter(appointment -> appointment.getStatus() == AVAILABLE) - .map(appointmentCustomerView -> { - AppointmentCustomerViewDTO dto = appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointmentCustomerView); - setSatisfactionScore(dto, appointmentCustomerView.getId()); - return dto; - }) - .collect(Collectors.toList()); - } - - public void setSatisfactionScore(AppointmentCustomerViewDTO dto, Long appointmentId) { - satisfactionService.getByAppointmentIdAndType(appointmentId, SatisfactionTypeEnum.APPOINTMENT).ifPresent(satisfaction -> { - dto.setSatisfactionScore(satisfaction.getScore()); - }); - } - - public List<AppointmentCustomerView> findAvailableByAgentNoAndCustomerId(String agentNo, Long customerId) { - return appointmentCustomerViewRepository.findByAgentNoAndCustomerId(agentNo, customerId) - .stream() - .filter(appointmentCustomerView -> appointmentCustomerView.getStatus() == AVAILABLE) - .collect(Collectors.toList()); - } - - public Optional<Appointment> findLatestAppointmentByAgentNoAndCustomerId(String agentNo, Long customerId) { - return appointmentRepository.findTopByAgentNoAndCustomerIdOrderByAppointmentDateDesc(agentNo, customerId); - } - - public void recordConsultantReadTime(Long appointmentId) { - Appointment appointment = appointmentRepository.findById(appointmentId).get(); - - if(appointment.getConsultantReadTime() == null) { - appointment.setConsultantReadTime(Instant.now()); - appointmentRepository.save(appointment); - } - else { - log.debug("this appointment was read, read time = {}", appointment.getConsultantReadTime()); - } - } - - public void recordAllAppointmentsView(String agentNo) { - List<Appointment> consultantNotViewAppointments = findByAgentNo(agentNo) - .stream() - .filter(appointment -> Objects.isNull(appointment.getConsultantViewTime())) - .collect(Collectors.toList()); - - consultantNotViewAppointments.forEach(appointment -> appointment.setConsultantViewTime(Instant.now())); - appointmentRepository.saveAll(consultantNotViewAppointments); - } - - public void sendAppointmentNotify(Appointment appointment) { - Assert.notNull(appointment, "appointment entity cannot be null"); - - log.debug("is need send appointment notify msg? sms = {}, email = {}", - applicationProperties.getSms().isSendNotifyMsg(), applicationProperties.getEmail().isSendNotifyMsg()); - - log.debug("sending appointment notify, appointmentId = {}", appointment.getId()); - sendAppointmentNotifyBySMS(appointment); - sendAppointmentNotifyByHtmlEmail(appointment); - } - - private void sendAppointmentNotifyBySMS(Appointment appointment) { - String msg = getAppointmentNotifyWording(appointment); - String consultantMobile = consultantService.findByAgentNo(appointment.getAgentNo()).getPhoneNumber(); - - try { - if(!StringUtils.hasText(consultantMobile)) { - throw new SendSMSFailException("the consultant does not have mobile!"); - } - - sendMsgService.sendMsgBySMS(consultantMobile, msg); - } catch (SendSMSFailException e) { - log.warn("send appointment notify by sms was fail, appointment Id = {}", appointment.getId(), e); - } - } - - private String getAppointmentNotifyWording(Appointment appointment) { - String normalContent; - if(StringUtils.hasText(appointment.getPhone())) { - normalContent = "閬芣��“��憟踝����蝑�靽�犖憯賢��像��������恥�����Ⅳ�" + appointment.getPhone(); - } - else { - normalContent = "閬芣��“��憟踝����蝑�靽�犖憯賢��像������"; - } - - String urlContent = "嚗���雯��嚗�" + getAppointmentDetailUrl(appointment.getId()) + "����蒂摰�蝯∟赤隢�����"; - return normalContent + urlContent; - } - - private void sendAppointmentNotifyByHtmlEmail(Appointment appointment) { - String consultantEmail = consultantService.findByAgentNo(appointment.getAgentNo()).getEmail(); - String customerMobile = appointment.getPhone(); - String normalContent; - - if(StringUtils.hasText(customerMobile)) { - normalContent = "閬芣��“��憟踝����蝑�靽�犖憯賢��像��������恥�����Ⅳ�" + customerMobile + "嚗�"; - } - else { - normalContent = "閬芣��“��憟踝����蝑�靽�犖憯賢��像�������"; - } - - Context context = new Context(); - context.setVariable("content", normalContent); - context.setVariable("urlHint", getAppointmentDetailUrl(appointment.getId())); - String content = springTemplateEngine.process("mail/appointmentNotifyEmail", context); - - try { - if(!StringUtils.hasText(consultantEmail)) { - throw new SendEmailFailException("the consultant does not have email!"); - } - - sendMsgService.sendMsgByEmail(consultantEmail, NOTIFY_EMAIL_SUBJECT, content, true); - } catch (SendEmailFailException e) { - log.warn("send appointment notify by email was fail, appointment Id = {}", appointment.getId(), e); - } - } - - public String getAppointmentDetailUrl(Long appointmentId) { - return applicationProperties.getFrontEndDomain() + "/myAppointmentList/contactedList?appointmentId=" + appointmentId; - } - - public Appointment findById(Long id) { - return appointmentRepository.findById(id) - .orElseThrow(AppointmentNotFoundException::new); - } - - public void closeAppointment(AppointmentCloseDTO closeDTO) { - if(closeDTO.getContactStatus() == ContactStatusEnum.DONE) { - DoneProcessDTO dto = new DoneProcessDTO(); - BeanUtils.copyProperties(closeDTO, dto); - abstractAppointmentProcess.process(dto); - }else if(closeDTO.getContactStatus() == ContactStatusEnum.CLOSED){ - ClosedProcessDTO dto = new ClosedProcessDTO(); - BeanUtils.copyProperties(closeDTO, dto); - abstractAppointmentProcess.process(dto); - } - } - - public Long getConsultantPendingAppointmentSum(String agentNo) { - return appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AVAILABLE) - .stream() - .filter(appointment -> agentNo.equals(appointment.getAgentNo())) - .filter(appointment -> isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_PENDING_PHONE_INTERVAL, Constants.APPOINTMENT_PENDING_EMAIL_INTERVAL)) - .count(); - } - - public AppointmentCustomerViewDTO getCustomerNewestExpiringAppointment(Long customerId) { - return appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AVAILABLE) - .stream() - .filter(appointment -> customerId.equals(appointment.getCustomerId())) - .filter(appointment -> isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_EXPIRING_PHONE_INTERVAL, Constants.APPOINTMENT_EXPIRING_EMAIL_INTERVAL)) - .max(Comparator.comparing(AppointmentCustomerView::getAppointmentDate)) - .map(appointmentCustomerView -> appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointmentCustomerView)) - .orElse(null); - } - - public boolean isAppointmentDateNotInIntervalFromNow(AppointmentCustomerView appointment, int phoneInterval, int emailInterval) { - final boolean isHavePhone = StringUtils.hasText(appointment.getPhone()); - final boolean isHaveEmail = StringUtils.hasText(appointment.getEmail()); - - LocalDate appointmentDate = appointment.getAppointmentDate().atZone(ZoneId.systemDefault()).toLocalDate(); - LocalDate nowDate = Instant.now().atZone(ZoneId.systemDefault()).toLocalDate(); - long intervalDays = nowDate.toEpochDay() - appointmentDate.toEpochDay(); - - final boolean isAppointmentExpiringByPhone = isHavePhone && intervalDays >= phoneInterval; - final boolean isAppointmentExpiringByEmail = isHaveEmail && intervalDays >= emailInterval; - - return isAppointmentExpiringByPhone || isAppointmentExpiringByEmail; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java b/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java deleted file mode 100644 index 8e14d66..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.pollex.pam.service; - -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.service.dto.FastQueryConsultantParam; -import com.pollex.pam.service.dto.StrictQueryConsultantParam; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.jpa.domain.Specification; - -import javax.persistence.criteria.*; -import java.util.*; - -import static com.pollex.pam.consts.SeniorityQueryConst.*; - -public class ConsultantQuerySpec { - private ConsultantQuerySpec() { - } - - public static Specification<Consultant> getFastQuerySpec(FastQueryConsultantParam param) { - return new Specification<Consultant>() { - @SuppressWarnings("FieldNameHidesFieldInSuperclass") - private static final long serialVersionUID = 6644524130903161741L; - - @Override - public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { - Set<Predicate> set = new HashSet<>(); - - param.getCommunicationStyles().forEach((communicationStyle) -> { - set.add(criteriaBuilder.like(root.get("communicationStyle"), "%" + communicationStyle + "%")); - }); - - if(Objects.nonNull(param.getGender())) { - set.add(criteriaBuilder.equal(root.get("gender"), param.getGender())); - } - - if(Objects.nonNull(param.getAvgScore()) && param.getAvgScore().intValue() != 0) { - set.add(criteriaBuilder.greaterThanOrEqualTo(root.get("avgScore"), param.getAvgScore().intValue())); - } - - if(StringUtils.isNotEmpty(param.getSeniority()) && !StringUtils.equals(UNLIMITED, param.getSeniority())) { - if(YOUNG.equals(param.getSeniority())) { - set.add(criteriaBuilder.lessThanOrEqualTo(root.get("seniorityYear"), 5)); - } - else if(SENIOR.equals(param.getSeniority())) { - set.add(criteriaBuilder.greaterThan(root.get("seniorityYear"), 5)); - } - } - - Predicate[] predicates = new Predicate[set.size()]; - predicates = set.toArray(predicates); - return criteriaBuilder.and(predicates); - } - }; - } - - public static Specification<Consultant> getStrictQuerySpec(StrictQueryConsultantParam param) { - return new Specification<Consultant>() { - @SuppressWarnings("FieldNameHidesFieldInSuperclass") - private static final long serialVersionUID = 664452413090316174L; - - @Override - public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { - Set<Predicate> set = new HashSet<>(); - - if(Objects.nonNull(param.getGender())) { - set.add(criteriaBuilder.equal(root.get("gender"), param.getGender())); - } - - if(StringUtils.isNotEmpty(param.getArea())) { - set.add(criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%")); - } - - Predicate[] predicates = new Predicate[set.size()]; - predicates = set.toArray(predicates); - return criteriaBuilder.and(predicates); - } - }; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java b/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java deleted file mode 100644 index 58c96d9..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.pollex.pam.service; - -import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentCustomerView; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.domain.CustomerFavoriteConsultant; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.enums.LoginResult; -import com.pollex.pam.repository.ConsultantRepository; -import com.pollex.pam.repository.CustomerFavoriteConsultantRepository; -import com.pollex.pam.repository.SatisfactionRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.*; -import com.pollex.pam.service.mapper.AppointmentCustomerViewMapper; -import com.pollex.pam.service.mapper.ConsultantDTOMapper; -import com.pollex.pam.service.mapper.ConsultantMapper; -import com.pollex.pam.service.util.FileUtil; -import com.pollex.pam.web.rest.errors.ConsultantNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.SpringTemplateEngine; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import static com.pollex.pam.consts.SeniorityQueryConst.*; -import static com.pollex.pam.enums.ContactStatusEnum.*; - -@Service -@Transactional -public class ConsultantService { - - private static final Logger log = LoggerFactory.getLogger(ConsultantService.class); - - @Autowired - ConsultantRepository consultantRepository; - - @Autowired - CustomerFavoriteConsultantRepository customerFavoriteConsultantRepository; - - @Autowired - ConsultantMapper consultantMapper; - - @Autowired - AppointmentService appointmentService; - - @Autowired - LoginRecordService loginRecordService; - - @Autowired - AppointmentCustomerViewMapper appointmentCustomerViewMapper; - - @Autowired - SatisfactionService satisfactionService; - - @Autowired - ConsultantDTOMapper consultantDTOMapper; - - @Autowired - ApplicationProperties applicationProperty; - - @Autowired - SendMsgService sendMsgService; - - @Autowired - SpringTemplateEngine springTemplateEngine; - - @Autowired - ApplicationProperties applicationProperties; - - @Autowired - ConsultantService consultantService; - - @Autowired - SatisfactionRepository satisfactionRepository; - - @Autowired - PersonalNotificationService personalNotificationService; - - public List<CustomerFavoriteConsultantDTO> getMyConsultantList() { - Long customerId = SecurityUtils.getCustomerDBId(); - - return customerFavoriteConsultantRepository.findAllByCustomerId(customerId) - .stream() - .map(relation -> { - Consultant consultant = relation.getConsultant(); - CustomerFavoriteConsultantDTO dto = consultantMapper.toCustomerFavoriteConsultantDto(consultant); - dto.setCreateTime(relation.getCreatedDate()); - dto.setUpdateTime(relation.getCreatedDate()); - dto.setCustomerViewTime(relation.getViewTime()); - - setInfoByAvailableAppointment( - dto, - appointmentService.findAvailableByAgentNoAndCustomerId(consultant.getAgentNo(), customerId) - ); - - setFavoriteConsultantUpdatedTime(relation, dto); - - return dto; - - }).collect(Collectors.toList()); - } - - public void setFavoriteConsultantUpdatedTime(CustomerFavoriteConsultant relation, - CustomerFavoriteConsultantDTO dto) { - Consultant consultant = relation.getConsultant(); - appointmentService.findLatestAppointmentByAgentNoAndCustomerId(consultant.getAgentNo(), relation.getCustomerId()) - .ifPresent(latestAppointment -> { - dto.setUpdateTime(latestAppointment.getLastModifiedDate()); - }); - - if(dto.getUpdateTime().isBefore(relation.getCreatedDate())) { - dto.setUpdateTime(relation.getCreatedDate()); - } - } - - private void setInfoByAvailableAppointment(CustomerFavoriteConsultantDTO customerFavoriteConsultantDTO, List<AppointmentCustomerView> appointmentList) { - List<AppointmentCustomerView> appointments = appointmentList.stream() - .sorted(Comparator.comparing(AppointmentCustomerView::getAppointmentDate).reversed()) - .collect(Collectors.toList()); - - List<AppointmentCustomerViewDTO> appointmentCustomerViewDTOS = appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointments); - customerFavoriteConsultantDTO.setAppointments(appointmentCustomerViewDTOS); - - if (!appointments.isEmpty()) { - AppointmentCustomerView latestAvailableAppointment = appointments.get(0); - ContactStatusEnum latestStatus = latestAvailableAppointment.getCommunicateStatus(); - if(latestStatus != ContactStatusEnum.DONE && latestStatus != ContactStatusEnum.CLOSED) - customerFavoriteConsultantDTO.setContactStatus(latestStatus); - else - customerFavoriteConsultantDTO.setContactStatus(PICKED); - }else { - customerFavoriteConsultantDTO.setContactStatus(PICKED); - } - } - - public List<ConsultantDTO> getRecommendConsultantList() { - return consultantRepository.findAllByRecommendIsTrue() - .stream() - .map(consultantMapper::toDto) - .collect(Collectors.toList()); - } - - public List<ConsultantDTO> strictQueryConsultant(StrictQueryConsultantParam param) { - return consultantRepository.findAll(ConsultantQuerySpec.getStrictQuerySpec(param)) - .stream() - .map(consultant -> { - int suitabilityScore = getStrictQuerySuitabilityScore(param, consultant); - - ConsultantDTO dto = consultantMapper.toDto(consultant); - dto.setSuitability(suitabilityScore); - - return dto; - }) - .collect(Collectors.toList()); - } - - private int getStrictQuerySuitabilityScore(StrictQueryConsultantParam param, Consultant consultant) { - Float queryAvgScore = param.getAvgScore(); - String querySeniority = param.getSeniority(); - List<String> queryRequirements = param.getRequirements(); - - int score = 0; - if(isConsultantGreaterThanScore(queryAvgScore, consultant.getAvgScore())) { - score += 30; - } - - if(isConsultantInSeniority(querySeniority, consultant.getSeniorityYear())) { - score += 20; - } - - if(isAllRequirementsIncludeConsultant(queryRequirements, consultant.getExpertise())) { - score += 50; - } - - return score; - } - - private boolean isAllRequirementsIncludeConsultant(List<String> queryRequirements, String consultantExpertise) { - return queryRequirements - .stream() - .allMatch(queryRequirement -> consultantExpertise.matches(".*"+queryRequirement+".*")); - } - - private boolean isConsultantInSeniority(String querySeniority, Long consultantSeniorityYear) { - switch (querySeniority == null ? "" : querySeniority) { - case YOUNG: - return consultantSeniorityYear < 5; - case SENIOR: - return consultantSeniorityYear > 5; - case UNLIMITED: - case "": - return true; - default: - return false; - } - } - - private boolean isConsultantGreaterThanScore(Float queryAvgScore, Float consultantAvgScore) { - return Objects.isNull(queryAvgScore) || queryAvgScore < consultantAvgScore; - } - - public List<ConsultantDTO> fastQueryConsultant(FastQueryConsultantParam param) { - return consultantRepository.findAll(ConsultantQuerySpec.getFastQuerySpec(param)) - .stream() - .map(consultantMapper::toDto) - .collect(Collectors.toList()); - } - - public ConsultantDetailDTO getConsultantDetail(String agentNo) { - Consultant consultant = consultantRepository.findOneByAgentNo(agentNo).orElseThrow(ConsultantNotFoundException::new); - ConsultantDetailDTO consultantDetailDTO = consultantMapper.toDetailDto(consultant); - - loginRecordService.findLatestLoginRecord(agentNo, LoginResult.SUCCESS) - .ifPresent(loginRecord -> consultantDetailDTO.setLatestLoginTime(loginRecord.getLoginDate())); - - return consultantDetailDTO; - } - - @Transactional - public void addConsultantToCustomList(AddConsultantParam param) { - List<String> agentNoList = param.getAgentNoList(); - List<Consultant> consultants = consultantRepository.findAllByAgentNoIn(agentNoList); - Long userId = SecurityUtils.getCustomerDBId(); - - consultants.forEach(consultant -> { - boolean isConsultantInList = customerFavoriteConsultantRepository.findOneByCustomerIdAndConsultant(userId, consultant).isPresent(); - - if(!isConsultantInList) { - CustomerFavoriteConsultant customerFavoriteConsultant = new CustomerFavoriteConsultant(); - customerFavoriteConsultant.setConsultant(consultant); - customerFavoriteConsultant.setCustomerId(userId); - - customerFavoriteConsultantRepository.save(customerFavoriteConsultant); - } - else { - log.info("The consultant is in customer favorite list! customId = {}, consultant AgentNo = {}", userId, consultant.getAgentNo()); - } - }); - - } - - public List<AppointmentCustomerViewDTO> getMyAppointment() { - String agentNo = SecurityUtils.getAgentNo(); - return appointmentService.getConsultantAvailableAppointments(agentNo); - } - - public void removeConsultantFromCustomList(String agentNo) { - Long customId = SecurityUtils.getCustomerDBId(); - Consultant consultant = consultantRepository.findOneByAgentNo(agentNo).orElseThrow(ConsultantNotFoundException::new); - CustomerFavoriteConsultant target = customerFavoriteConsultantRepository.findOneByCustomerIdAndConsultant(customId, consultant).orElse(null); - - if(target != null) { - customerFavoriteConsultantRepository.delete(target); - } - else { - log.info("this consultant is not in customer list! agentNo = {}, customId = {}", agentNo, customId); - } - } - - public void recordAllAppointmentsView() { - String agentNo = SecurityUtils.getAgentNo(); - appointmentService.recordAllAppointmentsView(agentNo); - } - - public void recordMyConsultantListView() { - Long customerId = SecurityUtils.getCustomerDBId(); - List<CustomerFavoriteConsultant> notViewRelation = customerFavoriteConsultantRepository - .findAllByCustomerId(customerId) - .stream() - .filter(relation -> Objects.isNull(relation.getViewTime())) - .collect(Collectors.toList()); - - notViewRelation.forEach(relation -> { - relation.setViewTime(Instant.now()); - }); - - customerFavoriteConsultantRepository.saveAll(notViewRelation); - } - - public Consultant findByAgentNo(String agentNo) { - return consultantRepository.findOneByAgentNo(agentNo).get(); - } - - public Consultant editConsultant(ConsultantEditDTO editDTO) { - Consultant consultant = consultantRepository.findOneByAgentNo(editDTO.getAgentNo()) - .orElseThrow(ConsultantNotFoundException::new); - consultantDTOMapper.copyToConsultant(editDTO, consultant); - FileUtil.base64ToFile(editDTO.getPhotoBase64(), editDTO.getPhotoFileName(), applicationProperty.getFileFolderPath()); - consultantRepository.save(consultant); - personalNotificationService.createEditConsultantToConsultant(consultant); - return consultant; - } - - public InputStream getAvatarImage(String agentNo) { - Consultant consultant = consultantRepository.findOneByAgentNo(agentNo) - .orElseThrow(ConsultantNotFoundException::new); - File file = new File(consultant.getPhotoPath()); - try { - InputStream in = new FileInputStream(file); - return in; - } catch (FileNotFoundException e) { - log.error("agent photo not found , agentNo:"+agentNo,e); - return null; - } - } - - public void sendSatisfactionToClient(Appointment appointment) { - String subject = "皛踵�漲憛怠神�"; - - if(StringUtils.hasText(appointment.getEmail())) { - String content = genSendSatisfactionEmailContent(appointment); - sendMsgService.sendMsgByEmail(appointment.getEmail(), subject, content, true); - - }if(StringUtils.hasText(appointment.getPhone())) { - String content = genSendSatisfactionSMSContent(appointment); - sendMsgService.sendMsgBySMS(appointment.getPhone(), content); - } - - personalNotificationService.createSendSatisfactionToClientToCustomer(appointment); - } - - private String genSendSatisfactionSMSContent(Appointment appointment) { - String agentNo = appointment.getAgentNo(); - Consultant consultant = consultantService.findByAgentNo(agentNo); - String contsultantName = consultant.getName(); - String content = contsultantName+"憿批��憛怠神靽���像���遛��漲閰��"+getSendSatisfactionToClientUrl(appointment.getId()); - return content; - } - - private String genSendSatisfactionEmailContent(Appointment appointment) { - String agentNo = appointment.getAgentNo(); - Consultant consultant = consultantService.findByAgentNo(agentNo); - Context context = new Context(); - context.setVariable("consultantName", consultant.getName()); - context.setVariable("appointmentUrl", getSendSatisfactionToClientUrl(appointment.getId())); - String content = springTemplateEngine.process("mail/writeSatisfactionNotice", context); - return content; - } - - public String getSendSatisfactionToClientUrl(Long appointmentId) { - return applicationProperties.getFrontEndDomain() + "/?appointmentId=" + appointmentId; - } - - public void setConsultantAvgScore(Satisfaction satisfaction) { - Optional<Float> avgScore = getAgentAvgScore(satisfaction.getAgentNo()); - - if(avgScore.isPresent()) { - BigDecimal bigDecimal = BigDecimal.valueOf(avgScore.get()); - - Consultant consultant = consultantRepository.findOneByAgentNo(satisfaction.getAgentNo()).get(); - consultant.setAvgScore(bigDecimal.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue()); - consultantRepository.save(consultant); - } - } - - public Optional<Float> getAgentAvgScore(String agentNo) { - return satisfactionRepository.getAgentScoreAvg(agentNo); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java b/pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java index 427e102..e7d394c 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java @@ -15,12 +15,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.enums.CustomerDetailEnum; -import com.pollex.pam.repository.CustomerRepository; +import com.pollex.pam.business.domain.Customer; +import com.pollex.pam.business.enums.CustomerDetailEnum; +import com.pollex.pam.business.repository.CustomerRepository; import com.pollex.pam.security.jwt.TokenProvider; import com.pollex.pam.security.token.OtpAuthenticationToken; -import com.pollex.pam.web.rest.vm.OtpAccount; +import com.pollex.pam.business.web.vm.OtpAccount; @Service @Transactional diff --git a/pamapi/src/main/java/com/pollex/pam/service/CustomerService.java b/pamapi/src/main/java/com/pollex/pam/service/CustomerService.java index 79a086d..3f1b6c4 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/CustomerService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/CustomerService.java @@ -2,21 +2,23 @@ import java.util.Optional; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.CustomerDTO; -import com.pollex.pam.service.mapper.CustomerMapper; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.OtpTmpService; +import com.pollex.pam.business.service.UsernameAlreadyUsedException; +import com.pollex.pam.business.service.dto.CustomerDTO; +import com.pollex.pam.business.service.mapper.CustomerMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.domain.OtpTmp; -import com.pollex.pam.enums.OtpLoginTypeEnum; -import com.pollex.pam.enums.OtpTmpStatusEnum; -import com.pollex.pam.repository.CustomerRepository; -import com.pollex.pam.service.dto.CustomerRegisterDTO; -import com.pollex.pam.service.mapper.CustomerDTOMapper; +import com.pollex.pam.business.domain.Customer; +import com.pollex.pam.business.domain.OtpTmp; +import com.pollex.pam.business.enums.OtpLoginTypeEnum; +import com.pollex.pam.business.enums.OtpTmpStatusEnum; +import com.pollex.pam.business.repository.CustomerRepository; +import com.pollex.pam.business.service.dto.CustomerRegisterDTO; +import com.pollex.pam.business.service.mapper.CustomerDTOMapper; @Service @Transactional diff --git a/pamapi/src/main/java/com/pollex/pam/service/EmailAlreadyUsedException.java b/pamapi/src/main/java/com/pollex/pam/service/EmailAlreadyUsedException.java deleted file mode 100644 index 427dc68..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/EmailAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.service; - -public class EmailAlreadyUsedException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public EmailAlreadyUsedException() { - super("Email is already in use!"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/InterviewRecordService.java b/pamapi/src/main/java/com/pollex/pam/service/InterviewRecordService.java deleted file mode 100644 index 40197b4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/InterviewRecordService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.pollex.pam.service; - -import java.util.List; - -import org.hibernate.boot.model.naming.IllegalIdentifierException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.InterviewRecord; -import com.pollex.pam.enums.InterviewRecordStatusEnum; -import com.pollex.pam.repository.InterviewRecordRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.InterviewRecordDTO; -import com.pollex.pam.service.mapper.InterviewRecordMapper; -import com.pollex.pam.web.rest.errors.InterviewRecordNotFoundException; - -@Service -@Transactional -public class InterviewRecordService { - - @Autowired - InterviewRecordRepository interviewRecordRepository; - - @Autowired - InterviewRecordMapper interviewRecordMapper; - - @Autowired - AppointmentService appointmentService; - - public InterviewRecord create(InterviewRecordDTO dto) { - if(dto.getId()!=null) { - throw new IllegalArgumentException(); - } - - InterviewRecord record = interviewRecordMapper.toInterviewRecord(dto); - checkAuth(record); - record.setStatus(InterviewRecordStatusEnum.AVAILABLE); - interviewRecordRepository.save(record); - return record; - } - - public InterviewRecord update(InterviewRecordDTO dto) { - if(dto.getId()==null) { - throw new IllegalArgumentException(); - } - - InterviewRecord record = findById(dto.getId()); - checkAuth(record); - interviewRecordMapper.copyToInterviewRecord(dto, record); - interviewRecordRepository.save(record); - return record; - } - - public void checkAuth(InterviewRecord record) { - Appointment appointment = appointmentService.findById(record.getAppointmentId()); - if(!appointment.getAgentNo().equals(SecurityUtils.getAgentNo())) { - throw new IllegalAccessError("The account can not edit the appointment"); - } - } - - public void delete(Long interviewRecordId) { - InterviewRecord record = findById(interviewRecordId); - record.setStatus(InterviewRecordStatusEnum.DELETED); - interviewRecordRepository.save(record); - } - - public InterviewRecord findById(Long id) { - return interviewRecordRepository.findById(id) - .orElseThrow(InterviewRecordNotFoundException::new); - } - - public List<InterviewRecordDTO> findByAppointmentId(Long appointmentId) { - List<InterviewRecord> records = interviewRecordRepository.findByAppointmentId(appointmentId); - return interviewRecordMapper.toInterviewRecordDTO(records); - } - - public List<InterviewRecordDTO> findByAppointmentIdAndStatus(Long appointmentId, InterviewRecordStatusEnum status) { - List<InterviewRecord> records = interviewRecordRepository.findByAppointmentIdAndStatus(appointmentId, status); - return interviewRecordMapper.toInterviewRecordDTO(records); - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/InvalidPasswordException.java b/pamapi/src/main/java/com/pollex/pam/service/InvalidPasswordException.java deleted file mode 100644 index 24b28e5..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/InvalidPasswordException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.service; - -public class InvalidPasswordException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public InvalidPasswordException() { - super("Incorrect password"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/LoginRecordService.java b/pamapi/src/main/java/com/pollex/pam/service/LoginRecordService.java deleted file mode 100644 index 8c0b8c4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/LoginRecordService.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pollex.pam.service; - -import com.pollex.pam.domain.LoginRecord; -import com.pollex.pam.enums.LoginResult; -import com.pollex.pam.repository.LoginRecordRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; - -import static com.pollex.pam.enums.LoginMethod.E_SERVICE; -import static com.pollex.pam.enums.LoginMethod.OTP; -import static com.pollex.pam.enums.LoginResult.FAIL; -import static com.pollex.pam.enums.LoginResult.SUCCESS; - - -@Service -@Transactional -public class LoginRecordService { - - @Autowired - LoginRecordRepository loginRecordRepository; - - public Optional<LoginRecord> findLatestLoginRecord(String account, LoginResult loginResult) { - return loginRecordRepository.findTopByAccountAndResultOrderByLoginDateDesc(account, loginResult); - } - - public void saveOTPLoginSuccessRecord(String account) { - LoginRecord loginRecord = new LoginRecord(); - loginRecord.setAccount(account); - loginRecord.setLoginMethod(OTP); - loginRecord.setResult(SUCCESS); - - loginRecordRepository.save(loginRecord); - } - - public void saveOTPLoginFailRecord(String account, String failReason) { - LoginRecord loginRecord = new LoginRecord(); - loginRecord.setAccount(account); - loginRecord.setLoginMethod(OTP); - loginRecord.setResult(FAIL); - loginRecord.setFailedReason(failReason); - - loginRecordRepository.save(loginRecord); - } - - public void saveEServiceLoginSuccessRecord(String account) { - LoginRecord loginRecord = new LoginRecord(); - loginRecord.setAccount(account); - loginRecord.setLoginMethod(E_SERVICE); - loginRecord.setResult(SUCCESS); - - loginRecordRepository.save(loginRecord); - } - - public void saveEServiceLoginFailRecord(String account, String failReason) { - LoginRecord loginRecord = new LoginRecord(); - loginRecord.setAccount(account); - loginRecord.setLoginMethod(E_SERVICE); - loginRecord.setResult(FAIL); - loginRecord.setFailedReason(failReason); - - loginRecordRepository.save(loginRecord); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/MailService.java b/pamapi/src/main/java/com/pollex/pam/service/MailService.java deleted file mode 100644 index 555edd5..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/MailService.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.pollex.pam.service; - -import com.pollex.pam.domain.User; -import java.nio.charset.StandardCharsets; -import java.util.Locale; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.MessageSource; -import org.springframework.mail.MailException; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.SpringTemplateEngine; -import tech.jhipster.config.JHipsterProperties; - -/** - * Service for sending emails. - * <p> - * We use the {@link Async} annotation to send emails asynchronously. - */ -@Service -public class MailService { - - private final Logger log = LoggerFactory.getLogger(MailService.class); - - private static final String USER = "user"; - - private static final String BASE_URL = "baseUrl"; - - private final JHipsterProperties jHipsterProperties; - - private final JavaMailSender javaMailSender; - - private final MessageSource messageSource; - - private final SpringTemplateEngine templateEngine; - - public MailService( - JHipsterProperties jHipsterProperties, - JavaMailSender javaMailSender, - MessageSource messageSource, - SpringTemplateEngine templateEngine - ) { - this.jHipsterProperties = jHipsterProperties; - this.javaMailSender = javaMailSender; - this.messageSource = messageSource; - this.templateEngine = templateEngine; - } - - @Async - public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) { - log.debug( - "Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", - isMultipart, - isHtml, - to, - subject, - content - ); - - // Prepare message using a Spring helper - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - try { - MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); - message.setTo(to); - message.setFrom(jHipsterProperties.getMail().getFrom()); - message.setSubject(subject); - message.setText(content, isHtml); - javaMailSender.send(mimeMessage); - log.debug("Sent email to User '{}'", to); - } catch (MailException | MessagingException e) { - log.warn("Email could not be sent to user '{}'", to, e); - } - } - - @Async - public void sendEmailFromTemplate(User user, String templateName, String titleKey) { - if (user.getEmail() == null) { - log.debug("Email doesn't exist for user '{}'", user.getLogin()); - return; - } - Locale locale = Locale.forLanguageTag(user.getLangKey()); - Context context = new Context(locale); - context.setVariable(USER, user); - context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl()); - String content = templateEngine.process(templateName, context); - String subject = messageSource.getMessage(titleKey, null, locale); - sendEmail(user.getEmail(), subject, content, false, true); - } - - @Async - public void sendActivationEmail(User user) { - log.debug("Sending activation email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title"); - } - - @Async - public void sendCreationEmail(User user) { - log.debug("Sending creation email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title"); - } - - @Async - public void sendPasswordResetMail(User user) { - log.debug("Sending password reset email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/NoticeService.java b/pamapi/src/main/java/com/pollex/pam/service/NoticeService.java deleted file mode 100644 index 5d9a908..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/NoticeService.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pollex.pam.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.repository.AppointmentRepository; -import com.pollex.pam.service.dto.AppointmentNoticeSendDTO; - -@Service -@Transactional -public class NoticeService { - - @Autowired - AppointmentService appointmentService; - - @Autowired - SendMsgService sendMsgService; - - @Autowired - AppointmentNoticeLogService appointmentNoticeLogService; - - @Autowired - AppointmentRepository appointmentRepository; - - @Autowired - PersonalNotificationService personalNotificationService; - - - public void sendNotice(AppointmentNoticeSendDTO dto) { - String subject = "靽���像�蝟餌絞�嚗���"; - - if(StringUtils.hasText(dto.getEmail())) { - sendMsgService.sendMsgByEmail(dto.getEmail(), subject, dto.getMessage(), true); - }if(StringUtils.hasText(dto.getPhone())) { - sendMsgService.sendMsgBySMS(dto.getPhone(), dto.getMessage()); - } - - List<AppointmentNoticeLog> noticeLogs = - appointmentNoticeLogService.findByAppointmentId(dto.getAppointmentId()); - if(noticeLogs.size()==0) { - Appointment appointment = appointmentService.findById(dto.getAppointmentId()); - appointment.setCommunicateStatus(ContactStatusEnum.CONTACTED); - appointmentRepository.save(appointment); - } - - appointmentNoticeLogService.create(dto); - personalNotificationService.createSendNoticeToCustomer(dto.getAppointmentId()); - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/OtpTmpService.java b/pamapi/src/main/java/com/pollex/pam/service/OtpTmpService.java deleted file mode 100644 index df66731..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/OtpTmpService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.pollex.pam.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.OtpTmp; -import com.pollex.pam.enums.OtpLoginTypeEnum; -import com.pollex.pam.enums.OtpTmpStatusEnum; -import com.pollex.pam.repository.OtpTmpRepository; - -@Service -@Transactional -public class OtpTmpService { - - @Autowired - OtpTmpRepository otpTmpRepository; - - public OtpTmp createOtpTmp(String account, String indexKey) { - OtpTmp oldTmp = otpTmpRepository.findByAccount(account); - if(oldTmp==null) { - OtpTmp otpTmp = new OtpTmp(); - otpTmp.setIndexKey(indexKey); - otpTmp.setAccount(account); - otpTmp.setStatus(OtpTmpStatusEnum.UNVERIFIED); - return otpTmpRepository.save(otpTmp); - }else { - oldTmp.setIndexKey(indexKey); - oldTmp.setStatus(OtpTmpStatusEnum.UNVERIFIED); - return otpTmpRepository.save(oldTmp); - } - } - - public OtpTmp findByAccountAndIndexKey(String account, String indexKey) { - return otpTmpRepository.findByAccountAndIndexKey(account, indexKey); - } - - public OtpTmp save(OtpTmp otpTmp) { - return otpTmpRepository.save(otpTmp); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/OtpUtilService.java b/pamapi/src/main/java/com/pollex/pam/service/OtpUtilService.java index 868901a..ff21125 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/OtpUtilService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/OtpUtilService.java @@ -1,17 +1,17 @@ package com.pollex.pam.service; -import com.pollex.pam.domain.OtpTmp; -import com.pollex.pam.enums.OtpTmpStatusEnum; -import com.pollex.pam.web.rest.errors.OtpLoginFailException; -import com.pollex.pam.web.rest.vm.VerifyOtpVM; +import com.pollex.pam.business.domain.OtpTmp; +import com.pollex.pam.business.enums.OtpTmpStatusEnum; +import com.pollex.pam.business.service.OtpTmpService; +import com.pollex.pam.business.web.errors.OtpLoginFailException; +import com.pollex.pam.business.web.vm.VerifyOtpVM; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.stereotype.Service; import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.service.dto.OtpResponseDTO; +import com.pollex.pam.business.service.dto.OtpResponseDTO; import org.springframework.transaction.annotation.Transactional; @Service @@ -27,9 +27,6 @@ @Autowired OtpTmpService otpTmpService; - - @Autowired - LoginRecordService loginRecordService; @Transactional public void verifyOtp(VerifyOtpVM verifyOtpParam) { @@ -47,11 +44,9 @@ } else { log.info("otp login fail... , account = {}, error code = {}, failReason = {}", account, otpResponseDTO.getFailCode(), otpResponseDTO.getFailReason()); - loginRecordService.saveOTPLoginFailRecord(account, otpResponseDTO.getFailReason()); throw new OtpLoginFailException(otpResponseDTO.getFailCode()); } } - loginRecordService.saveOTPLoginSuccessRecord(account); setVerrifiedOtpTmp(account, indexKey); } diff --git a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java index b61ef34..cdbfb83 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java @@ -1,7 +1,7 @@ package com.pollex.pam.service; import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.service.dto.OtpResponseDTO; +import com.pollex.pam.business.service.dto.OtpResponseDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/pamapi/src/main/java/com/pollex/pam/service/PersonalNotificationService.java b/pamapi/src/main/java/com/pollex/pam/service/PersonalNotificationService.java deleted file mode 100644 index 3fa7b67..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/PersonalNotificationService.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.pollex.pam.service; - -import java.time.Instant; -import java.util.List; - -import javax.management.Notification; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.domain.PersonalNotification; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.enums.NotificationTypeEnum; -import com.pollex.pam.enums.PersonalNotificationRoleEnum; -import com.pollex.pam.repository.CustomerRepository; -import com.pollex.pam.repository.PersonalNotificationRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.AppointmentUpdateDTO; - -@Service -@Transactional -public class PersonalNotificationService { - - @Autowired - PersonalNotificationRepository personalNotificationRepository; - - @Autowired - ConsultantService consultantService; - - @Autowired - AppointmentService appointmentService; - - @Autowired - CustomerService customerService; - - @Autowired - CustomerRepository customerRepository; - - @Autowired - SatisfactionService satisfactionService; - - public List<PersonalNotification> getMyPersonalNotification(Long ownerId, PersonalNotificationRoleEnum role) { - return personalNotificationRepository.findAllByOwnerRoleAndOwnerId(role, ownerId); - } - - public void createSendSatisfactionToClientToCustomer(Appointment appointment) { - PersonalNotification entity = new PersonalNotification(); - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - String content = consultant.getName()+"憿批��憛怠神皛踵�漲閰��"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(appointment.getCustomerId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); - entity.setTitle("憛怠神皛踵�漲"); - personalNotificationRepository.save(entity); - } - - public void createSendNoticeToCustomer(Long appointmentId) { - Appointment appointment = appointmentService.findById(appointmentId); - PersonalNotification entity = new PersonalNotification(); - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - String content = "���� "+consultant.getName()+"憿批���赤�"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(appointment.getCustomerId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); - entity.setTitle("憿批��赤�"); - personalNotificationRepository.save(entity); - } - - public void createNotFillAppointmentSatisfactionNumberToCustomer(Long customerId, int notFillSatisfactionSum) { - PersonalNotification entity = new PersonalNotification(); - - String content = "���� "+notFillSatisfactionSum+" 蝑“���遛��漲��閬‵撖�"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(customerId); - entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); - entity.setTitle("摰X皛踵�漲"); - personalNotificationRepository.save(entity); - } - - public void createEditConsultantToConsultant(Consultant consultant) { - PersonalNotification entity = new PersonalNotification(); - String content = "����犖撣唾�身摰歇�脰��"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(consultant.getId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); - entity.setTitle("霈撣唾����"); - personalNotificationRepository.save(entity); - } - - public void createMarkAppointmentDeletedToConsultant(Appointment appointment) { - PersonalNotification entity = new PersonalNotification(); - Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - String content = customer.getName()+"摰X撌脣�������"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(consultant.getId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); - entity.setTitle("��������"); - personalNotificationRepository.save(entity); - } - - public void createUpdateAppointmentToConsultant(Appointment appointment) { - PersonalNotification entity = new PersonalNotification(); - Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - String content = customer.getName()+"摰X撌脫���������"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(consultant.getId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); - entity.setTitle("��������"); - personalNotificationRepository.save(entity); - } - - public void createScorefactionToConsultant(Satisfaction satisfaction) { - PersonalNotification entity = new PersonalNotification(); - Appointment appointment = appointmentService.findById(satisfaction.getAppointmentId()); - Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - String content = customer.getName()+"摰X撌脣��脰�遛��漲閰��"; - entity.setContent(content); - entity.setNotificationType(NotificationTypeEnum.ACTIVITY); - entity.setOwnerId(consultant.getId()); - entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); - entity.setTitle("摰X皛踵�漲"); - personalNotificationRepository.save(entity); - } - - public void readAllMyNotification() { - if(StringUtils.hasText(SecurityUtils.getAgentNo())) { - Long consultantId = consultantService.findByAgentNo(SecurityUtils.getAgentNo()).getId(); - readAllNotification(PersonalNotificationRoleEnum.CONSULTANT, consultantId); - }else if(SecurityUtils.getCustomerDBId()!=null){ - readAllNotification(PersonalNotificationRoleEnum.CUSTOMER, SecurityUtils.getCustomerDBId()); - } - } - - public void readAllNotification(PersonalNotificationRoleEnum ownerRole - , Long ownerId) { - List<PersonalNotification> allNotification = personalNotificationRepository.findAllByOwnerRoleAndOwnerId(ownerRole, ownerId); - Instant today = Instant.now(); - allNotification.stream() - .filter(notification -> notification.getReadDate()==null) - .forEach(notification ->{ - notification.setReadDate(today); - personalNotificationRepository.saveAll(allNotification); - }); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java b/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java deleted file mode 100644 index 1bf3c20..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.pollex.pam.service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -import com.pollex.pam.enums.SatisfactionTypeEnum; -import com.pollex.pam.security.SecurityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.enums.SatisfactionStatusEnum; -import com.pollex.pam.repository.ConsultantRepository; -import com.pollex.pam.repository.CustomerRepository; -import com.pollex.pam.repository.SatisfactionRepository; -import com.pollex.pam.service.dto.SatisfactionCustomerScoreDTO; -import com.pollex.pam.service.dto.SatisfactionDTO; -import com.pollex.pam.service.mapper.AppointmentMapper; -import com.pollex.pam.service.mapper.SatisfactionDTOMapper; -import com.pollex.pam.service.mapper.SatisfactionMapper; -import com.pollex.pam.web.rest.errors.SatisfactionAlreadyExistException; -import com.pollex.pam.web.rest.errors.SatisfactionNotFoundException; -import org.springframework.util.Assert; - -@Service -@Transactional -public class SatisfactionService { - - private static final Logger log = LoggerFactory.getLogger(SatisfactionService.class); - - @Autowired - SatisfactionRepository satisfactionRepository; - - @Autowired - AppointmentMapper appointmentMapper; - - @Autowired - SatisfactionDTOMapper satisfactionDTOMapper; - - @Autowired - SatisfactionMapper satisfactionMapper; - - @Autowired - CustomerRepository customerRepository; - - @Autowired - ConsultantRepository consultantRepository; - - @Autowired - ConsultantService consultantService; - - @Autowired - PersonalNotificationService personalNotificationService; - - public Satisfaction save(Satisfaction satisfaction) { - satisfaction = satisfactionRepository.save(satisfaction); - if(satisfaction.getType() == SatisfactionTypeEnum.APPOINTMENT) { - consultantService.setConsultantAvgScore(satisfaction); - } - return satisfaction; - } - - public Satisfaction scorefaction(SatisfactionCustomerScoreDTO scoreDTO) { - Optional<Satisfaction> satisfactionOP = satisfactionRepository.findOneByAppointmentIdAndType(scoreDTO.getAppointmentId(), scoreDTO.getType()); - Satisfaction satisfaction = satisfactionOP.orElseThrow(SatisfactionNotFoundException::new); - - boolean isSameCustomer = satisfaction.getCustomerId().equals(SecurityUtils.getCustomerDBId()); - Assert.isTrue(isSameCustomer, "The currently logged in customer has a different ID than the customer on Satisfaction"); - - satisfaction.setScore(scoreDTO.getScore()); - satisfaction.setStatus(SatisfactionStatusEnum.FILLED); - save(satisfaction); - - if(satisfaction.getType() == SatisfactionTypeEnum.APPOINTMENT) { - personalNotificationService.createScorefactionToConsultant(satisfaction); - } - return satisfaction; - } - - public Satisfaction createAppointmentSatisfaction(Appointment appointment) { - boolean isexist = getByAppointmentIdAndType(appointment.getId(), SatisfactionTypeEnum.APPOINTMENT).isPresent(); - if(isexist) { - throw new SatisfactionAlreadyExistException(); - } - Satisfaction satisfaction = appointmentMapper.toAppointmentSatisfaction(appointment); - return save(satisfaction); - } -// -// public Satisfaction createSatisfaction(SatisfactionCustomerScoreDTO createDTO) { -// Satisfaction satisfaction = satisfactionDTOMapper.toSatisfaction(createDTO); -// return save(satisfaction); -// } - - public List<SatisfactionDTO> getByAgentNoAndType(String agentNo, SatisfactionTypeEnum type) { - List<Satisfaction> satisfactionList = satisfactionRepository.findByAgentNoAndType(agentNo, type); - return satisfactionMapper.toDTO(satisfactionList); - } - - public List<SatisfactionDTO> getByCustomerId(Long customerDBId) { - List<Satisfaction> satisfactionList = satisfactionRepository.findByCustomerId(customerDBId); - return satisfactionMapper.toDTO(satisfactionList); - } - - public Optional<Satisfaction> getByAppointmentIdAndType(Long appointmentId, SatisfactionTypeEnum type) { - return satisfactionRepository.findOneByAppointmentIdAndType(appointmentId, type); - } - - public List<Satisfaction> getByStatusAndType(SatisfactionStatusEnum status, SatisfactionTypeEnum type) { - return satisfactionRepository.findAllByStatusAndType(status, type); - } - - public List<Satisfaction> scoreAllfaction(List<SatisfactionCustomerScoreDTO> scoreDTO) { - List<Satisfaction> satisfactionList = new ArrayList<>(); - scoreDTO.stream().forEach(dto ->{ - satisfactionList.add(scorefaction(dto)); - }); - return satisfactionList; - } - - public void createUnfilledSystemSatisfaction(Appointment appointment) { - Satisfaction satisfaction = new Satisfaction(); - satisfaction.setAppointmentId(appointment.getId()); - satisfaction.setCustomerId(SecurityUtils.getCustomerDBId()); - satisfaction.setStatus(SatisfactionStatusEnum.UNFILLED); - satisfaction.setType(SatisfactionTypeEnum.SYSTEM); - - satisfactionRepository.save(satisfaction); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java b/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java deleted file mode 100644 index 627aeb4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.pollex.pam.service; - -import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.*; -import com.pollex.pam.enums.AppointmentStatusEnum; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.enums.SatisfactionStatusEnum; -import com.pollex.pam.enums.SatisfactionTypeEnum; -import com.pollex.pam.repository.AppointmentCustomerViewRepository; -import com.pollex.pam.repository.AppointmentExpiringNotifyRecordRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.SpringTemplateEngine; - -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -@Service -@Transactional -public class ScheduleTaskService { - - private static final String NOT_CONTACTED_NOTIFY_SUBJECT = "�����脰�蝜恍�"; - private static final Logger log = LoggerFactory.getLogger(ScheduleTaskService.class); - - @Autowired - ConsultantService consultantService; - - @Autowired - AppointmentService appointmentService; - - @Autowired - AppointmentCustomerViewRepository appointmentCustomerViewRepository; - - @Autowired - SendMsgService sendMsgService; - - @Autowired - SpringTemplateEngine springTemplateEngine; - - @Autowired - ApplicationProperties applicationProperties; - - @Autowired - AppointmentExpiringNotifyRecordRepository appointmentExpiringNotifyRecordRepository; - - @Autowired - SatisfactionService satisfactionService; - - @Autowired - PersonalNotificationService personalNotificationService; - - @Scheduled(cron = "0 30 8 * * *") - public void sendAppointmentPendingNotifyToConsultant() { - log.info("Starting send appointment pending notify to consultant"); - - Map<String, List<AppointmentCustomerView>> consultantWithPendingAppointments = - appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE) - .stream() - .filter(appointment -> - appointmentService.isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_PENDING_PHONE_INTERVAL, Constants.APPOINTMENT_PENDING_EMAIL_INTERVAL) - ) - .collect(Collectors.groupingBy(AppointmentCustomerView::getAgentNo)); - - consultantWithPendingAppointments.forEach((agentNo, pendingAppointments) -> { - int pendingAppointmentsSum = pendingAppointments.size(); - Consultant consultant = consultantService.findByAgentNo(agentNo); - Optional<String> optionalPhone = Optional.ofNullable(consultant.getPhoneNumber()).filter(StringUtils::hasText); - Optional<String> optionalEmail = Optional.ofNullable(consultant.getEmail()).filter(StringUtils::hasText); - - String emailContent = getAppointmentPendingNotifyEmailContent(pendingAppointmentsSum); - - optionalPhone.ifPresent(phone -> { - sendMsgService.sendMsgBySMS(phone, String.format("����%s������脰�蝜恬������", pendingAppointmentsSum)); - }); - optionalEmail.ifPresent(email -> { - sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, emailContent, true); - }); - }); - - log.info("Sending appointment pending notify to consultant finish"); - } - - @Scheduled(cron = "0 30 8 * * *") - public void sendAppointmentExpiringNotifyToCustomer() { - log.info("Starting send appointment expiring notify to customer"); - - List<AppointmentCustomerView> allByCommunicateStatus = - appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE) - .stream() - .filter(appointment -> - appointmentService.isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_EXPIRING_PHONE_INTERVAL, Constants.APPOINTMENT_EXPIRING_EMAIL_INTERVAL) - ) - .filter(this::isAppointmentExpiringNotifyNotOnLimit) - .collect(Collectors.toList()); - - allByCommunicateStatus.forEach(appointment -> { - Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); - Optional<String> optionalPhone = Optional.ofNullable(appointment.getPhone()).filter(StringUtils::hasText); - Optional<String> optionalEmail = Optional.ofNullable(appointment.getEmail()).filter(StringUtils::hasText); - - optionalPhone.ifPresent(phone -> - sendMsgService.sendMsgBySMS(phone, String.format("敺甇�����%s憿批�迤敹�葉嚗������蒂���隞“������雯��嚗�%s" - , consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId()))) - ); - optionalEmail.ifPresent(email -> - sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, getAppointmentExpiringNotifyEmail(consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId())), true) - ); - - AppointmentExpiringNotifyRecord record = new AppointmentExpiringNotifyRecord(); - record.setAppointmentId(appointment.getId()); - record.setSendTime(Instant.now()); - - appointmentExpiringNotifyRecordRepository.save(record); - }); - - log.info("Sending appointment expiring notify to customer finish"); - } - - // todo ��蝣箄�府����, otis todo=134497 - @Scheduled(cron = "0 30 8 * * *") - public void sendNotFillAppointmentSatisfactionToPersonalNotification() { - Map<Long, List<Satisfaction>> customerNotFillSatisfactions = - satisfactionService.getByStatusAndType(SatisfactionStatusEnum.UNFILLED, SatisfactionTypeEnum.APPOINTMENT) - .stream() - .collect(Collectors.groupingBy(Satisfaction::getCustomerId)); - - customerNotFillSatisfactions.forEach((customerId, notFillSatisfactions) -> - personalNotificationService.createNotFillAppointmentSatisfactionNumberToCustomer(customerId, notFillSatisfactions.size()) - ); - } - - private boolean isAppointmentExpiringNotifyNotOnLimit(AppointmentCustomerView appointment) { - int sendNotifyToCustomerRecordSum = - appointmentExpiringNotifyRecordRepository.findAllByAppointmentId(appointment.getId()).size(); - - return sendNotifyToCustomerRecordSum < Constants.SEND_EXPIRING_NOTIFY_LIMIT; - } - - private String getAppointmentExpiringNotifyUrl(Long appointmentId) { - return applicationProperties.getFrontEndDomain() + "?notContactAppointmentId=" + appointmentId; - } - - private String getAppointmentPendingNotifyEmailContent(int sum) { - Context context = new Context(); - context.setVariable("pendingAppointmentSum", sum); - return springTemplateEngine.process("mail/appointmentPendingNotifyEmail", context); - } - - private String getAppointmentExpiringNotifyEmail(String consultantName, String notifyUrl) { - Context context = new Context(); - context.setVariable("consultantName", consultantName); - context.setVariable("notifyUrl", notifyUrl); - return springTemplateEngine.process("mail/appointmentExpiringNotifyEmail", context); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java b/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java deleted file mode 100644 index a5be71e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.pollex.pam.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.config.ApplicationProperties.Email; -import com.pollex.pam.config.ApplicationProperties.SMS; -import com.pollex.pam.config.Constants; -import com.pollex.pam.enums.SendEmailMsgMethod; -import com.pollex.pam.repository.ConsultantRepository; -import com.pollex.pam.service.dto.*; -import com.pollex.pam.service.util.HttpRequestUtil; -import com.pollex.pam.web.rest.errors.SendEmailFailException; -import com.pollex.pam.web.rest.errors.SendSMSFailException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.core.env.Profiles; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.thymeleaf.spring5.SpringTemplateEngine; -import tech.jhipster.config.JHipsterConstants; - -import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.Base64.Encoder; - -@Service -public class SendMsgService { - - private static final Logger log = LoggerFactory.getLogger(SendMsgService.class); - private final Encoder encoder = Base64.getEncoder(); - - private static final String SEND_SMS_SUCCESS_CODE = "1"; - - @Autowired - ApplicationProperties applicationProperties; - - @Autowired - ConsultantRepository consultantRepository; - - @Autowired - SpringTemplateEngine springTemplateEngine; - - @Autowired - Environment environment; - - @Autowired - MailService mailService; - - public SendSMSResponse sendMsgBySMS(String toMobile, String content) throws SendSMSFailException { - - SMS smsProperties = applicationProperties.getSms(); - if(!smsProperties.isSendNotifyMsg()) { -// return getMockSMSResponse(); - return null; - } - - SendSMSRequest sendSMSRequest = new SendSMSRequest(); - sendSMSRequest.setpKey(UUID.randomUUID().toString()); - sendSMSRequest.setSourceCode(smsProperties.getSourceCode()); - sendSMSRequest.setSender(smsProperties.getSender()); - sendSMSRequest.setMsgTypeSet(smsProperties.getSmsType()); - sendSMSRequest.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00"))); - sendSMSRequest.setSubject(encoder.encodeToString(smsProperties.getSubject().getBytes(StandardCharsets.UTF_8))); - sendSMSRequest.setActivityId(""); - - SMSDetail smsDetail = new SMSDetail(); - smsDetail.setMobile(toMobile); - smsDetail.setContent(encoder.encodeToString(content.getBytes(StandardCharsets.UTF_8))); - - sendSMSRequest.setDetail(Collections.singletonList(smsDetail)); - - try { - ResponseEntity<SendSMSResponse> responseEntity = HttpRequestUtil.postWithJson(smsProperties.getUrl(), sendSMSRequest, SendSMSResponse.class); - SendSMSResponse response = responseEntity.getBody(); - - log.debug("response status code = {}", responseEntity.getStatusCode()); - log.debug("smsResponse = {}", responseEntity.getBody()); - - if(!SEND_SMS_SUCCESS_CODE.equals(response.getReturnCode())) { - throw new SendSMSFailException("sms service return code = " + response.getReturnCode() + ", error_msg = " + response.getErrorMsg()); - } - - return responseEntity.getBody(); - } catch (SendSMSFailException e) { - throw e; - } catch (Exception e) { - log.warn("send sms fail by other reason!", e); - throw new SendSMSFailException("send sms fail by other reason!"); - } - } - -// private SendSMSResponse getMockSMSResponse() { -// SendSMSResponse mock = new SendSMSResponse(); -// mock.set -// return null; -// } - - public String sendMsgByEmail(String to, String subject, String content, boolean htmlFormat) throws SendEmailFailException{ - return sendMsgByEmail(to, subject, content, htmlFormat, Collections.emptyList(), Collections.emptyList()); - } - - public String sendMsgByEmail(String toAddress, String subject, String content, boolean htmlFormat, List<String> toCCAddress, - List<String> attachments) throws SendEmailFailException { - String fromAddress = applicationProperties.getEmail().getSenderEmail(); - - SendMailRequest sendMailRequest = new SendMailRequest(); - sendMailRequest.setSendMailAddresses(Collections.singletonList(toAddress)); - sendMailRequest.setFrom(fromAddress); - sendMailRequest.setContent(content); - sendMailRequest.setSubject(subject); - sendMailRequest.setSendCCMailAddresses(toCCAddress); - sendMailRequest.setAttachments(attachments); - sendMailRequest.setHtmlFormat(htmlFormat); - sendMailRequest.setFunctionId(applicationProperties.getEmail().getFunctionId()); - - return sendMsgByEmail(sendMailRequest); - } - - public String sendMsgByEmail(SendMailRequest sendMailRequest) throws SendEmailFailException{ - final Email emailProperties = applicationProperties.getEmail(); - - if(!emailProperties.isSendNotifyMsg()) { - return null; - } - - if(emailProperties.getMethod() == SendEmailMsgMethod.POLLEX_GMAIL) { - return sendMsgByPollexGmail(sendMailRequest); - } - else if(emailProperties.getMethod() == SendEmailMsgMethod.PAM_EMAIL_SERVICE) { - return sendMsgByPamEmailService(sendMailRequest); - } - - return null; - } - - private String sendMsgByPollexGmail(SendMailRequest sendMailRequest) { - String subject = sendMailRequest.getSubject(); - String content = sendMailRequest.getContent(); - boolean isHtml = sendMailRequest.isHtmlFormat(); - sendMailRequest.getSendMailAddresses().forEach(receiver -> mailService.sendEmail(receiver, subject, content, false, isHtml)); - - return null; - } - - private String sendMsgByPamEmailService(SendMailRequest sendMailRequest) { - final Email emailProperties = applicationProperties.getEmail(); - try { - ResponseEntity<String> responseEntity = - HttpRequestUtil.postWithJson(emailProperties.getUrl(), sendMailRequest, String.class); - log.debug("responseEntity = {}", responseEntity); - - String rawResponseString = responseEntity.getBody(); - SendMailResponse sendMailResponse = new ObjectMapper().readValue(rawResponseString, SendMailResponse.class); - log.debug("sendMailResponse = {}", sendMailResponse); - - if (sendMailResponse == null || sendMailResponse.getData() == null || !"ADDED".equalsIgnoreCase(sendMailResponse.getData().getMessageStatus())) { - throw new SendEmailFailException("send email service return error msg! raw response string= " + rawResponseString); - } - - return responseEntity.getBody(); - } catch (SendEmailFailException e) { - throw e; - } catch (Exception e) { - log.warn("send email fail by other reason", e); - throw new SendEmailFailException("send email failed!"); - } - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/UserService.java b/pamapi/src/main/java/com/pollex/pam/service/UserService.java deleted file mode 100644 index 3bfa0ad..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/UserService.java +++ /dev/null @@ -1,333 +0,0 @@ -package com.pollex.pam.service; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cache.CacheManager; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.Authority; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.AuthorityRepository; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.dto.UserDTO; - -import tech.jhipster.security.RandomUtil; - -/** - * Service class for managing users. - */ -@Service -@Transactional -public class UserService { - - private final Logger log = LoggerFactory.getLogger(UserService.class); - - private final UserRepository userRepository; - - private final PasswordEncoder passwordEncoder; - - private final AuthorityRepository authorityRepository; - - private final CacheManager cacheManager; - - - public UserService( - UserRepository userRepository, - PasswordEncoder passwordEncoder, - AuthorityRepository authorityRepository, - CacheManager cacheManager - ) { - this.userRepository = userRepository; - this.passwordEncoder = passwordEncoder; - this.authorityRepository = authorityRepository; - this.cacheManager = cacheManager; - } - - public Optional<User> activateRegistration(String key) { - log.debug("Activating user for activation key {}", key); - return userRepository - .findOneByActivationKey(key) - .map(user -> { - // activate given user for the registration key. - user.setActivated(true); - user.setActivationKey(null); - this.clearUserCaches(user); - log.debug("Activated user: {}", user); - return user; - }); - } - - public Optional<User> completePasswordReset(String newPassword, String key) { - log.debug("Reset user password for reset key {}", key); - return userRepository - .findOneByResetKey(key) - .filter(user -> user.getResetDate().isAfter(Instant.now().minus(1, ChronoUnit.DAYS))) - .map(user -> { - user.setPassword(passwordEncoder.encode(newPassword)); - user.setResetKey(null); - user.setResetDate(null); - this.clearUserCaches(user); - return user; - }); - } - - public Optional<User> requestPasswordReset(String mail) { - return userRepository - .findOneByEmailIgnoreCase(mail) - .filter(User::isActivated) - .map(user -> { - user.setResetKey(RandomUtil.generateResetKey()); - user.setResetDate(Instant.now()); - this.clearUserCaches(user); - return user; - }); - } - -// public User registerUser(AdminUserDTO userDTO, String password) { -// userRepository -// .findOneByLogin(userDTO.getLogin().toLowerCase()) -// .ifPresent(existingUser -> { -// boolean removed = removeNonActivatedUser(existingUser); -// if (!removed) { -// throw new UsernameAlreadyUsedException(); -// } -// }); -// userRepository -// .findOneByEmailIgnoreCase(userDTO.getEmail()) -// .ifPresent(existingUser -> { -// boolean removed = removeNonActivatedUser(existingUser); -// if (!removed) { -// throw new EmailAlreadyUsedException(); -// } -// }); -// User newUser = new User(); -// String encryptedPassword = passwordEncoder.encode(password); -// newUser.setLogin(userDTO.getLogin().toLowerCase()); -// // new user gets initially a generated password -// newUser.setPassword(encryptedPassword); -// newUser.setFirstName(userDTO.getFirstName()); -// newUser.setLastName(userDTO.getLastName()); -// if (userDTO.getEmail() != null) { -// newUser.setEmail(userDTO.getEmail().toLowerCase()); -// } -// newUser.setImageUrl(userDTO.getImageUrl()); -// newUser.setLangKey(userDTO.getLangKey()); -// // new user is not active -// newUser.setActivated(false); -// // new user gets registration key -// newUser.setActivationKey(RandomUtil.generateActivationKey()); -// Set<Authority> authorities = new HashSet<>(); -// authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add); -// newUser.setAuthorities(authorities); -// userRepository.save(newUser); -// this.clearUserCaches(newUser); -// log.debug("Created Information for User: {}", newUser); -// return newUser; -// } - - private boolean removeNonActivatedUser(User existingUser) { - if (existingUser.isActivated()) { - return false; - } - userRepository.delete(existingUser); - userRepository.flush(); - this.clearUserCaches(existingUser); - return true; - } - - public User createUser(AdminUserDTO userDTO) { - User user = new User(); - user.setLogin(userDTO.getLogin().toLowerCase()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - if (userDTO.getEmail() != null) { - user.setEmail(userDTO.getEmail().toLowerCase()); - } - user.setImageUrl(userDTO.getImageUrl()); - if (userDTO.getLangKey() == null) { - user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language - } else { - user.setLangKey(userDTO.getLangKey()); - } - String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); - user.setPassword(encryptedPassword); - user.setResetKey(RandomUtil.generateResetKey()); - user.setResetDate(Instant.now()); - user.setActivated(true); - if (userDTO.getAuthorities() != null) { - Set<Authority> authorities = userDTO - .getAuthorities() - .stream() - .map(authorityRepository::findById) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toSet()); - user.setAuthorities(authorities); - } - userRepository.save(user); - this.clearUserCaches(user); - log.debug("Created Information for User: {}", user); - return user; - } - - /** - * Update all information for a specific user, and return the modified user. - * - * @param userDTO user to update. - * @return updated user. - */ - public Optional<AdminUserDTO> updateUser(AdminUserDTO userDTO) { - return Optional - .of(userRepository.findById(userDTO.getId())) - .filter(Optional::isPresent) - .map(Optional::get) - .map(user -> { - this.clearUserCaches(user); - user.setLogin(userDTO.getLogin().toLowerCase()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - if (userDTO.getEmail() != null) { - user.setEmail(userDTO.getEmail().toLowerCase()); - } - user.setImageUrl(userDTO.getImageUrl()); - user.setActivated(userDTO.isActivated()); - user.setLangKey(userDTO.getLangKey()); - Set<Authority> managedAuthorities = user.getAuthorities(); - managedAuthorities.clear(); - userDTO - .getAuthorities() - .stream() - .map(authorityRepository::findById) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(managedAuthorities::add); - this.clearUserCaches(user); - log.debug("Changed Information for User: {}", user); - return user; - }) - .map(AdminUserDTO::new); - } - - public void deleteUser(String login) { - userRepository - .findOneByLogin(login) - .ifPresent(user -> { - userRepository.delete(user); - this.clearUserCaches(user); - log.debug("Deleted User: {}", user); - }); - } - - /** - * Update basic information (first name, last name, email, language) for the current user. - * - * @param firstName first name of user. - * @param lastName last name of user. - * @param email email id of user. - * @param langKey language key. - * @param imageUrl image URL of user. - */ - public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) { - SecurityUtils - .getCurrentUserLogin() - .flatMap(userRepository::findOneByLogin) - .ifPresent(user -> { - user.setFirstName(firstName); - user.setLastName(lastName); - if (email != null) { - user.setEmail(email.toLowerCase()); - } - user.setLangKey(langKey); - user.setImageUrl(imageUrl); - this.clearUserCaches(user); - log.debug("Changed Information for User: {}", user); - }); - } - - @Transactional - public void changePassword(String currentClearTextPassword, String newPassword) { - SecurityUtils - .getCurrentUserLogin() - .flatMap(userRepository::findOneByLogin) - .ifPresent(user -> { - String currentEncryptedPassword = user.getPassword(); - if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) { - throw new InvalidPasswordException(); - } - String encryptedPassword = passwordEncoder.encode(newPassword); - user.setPassword(encryptedPassword); - this.clearUserCaches(user); - log.debug("Changed password for User: {}", user); - }); - } - - @Transactional(readOnly = true) - public Page<AdminUserDTO> getAllManagedUsers(Pageable pageable) { - return userRepository.findAll(pageable).map(AdminUserDTO::new); - } - - @Transactional(readOnly = true) - public Page<UserDTO> getAllPublicUsers(Pageable pageable) { - return userRepository.findAllByIdNotNullAndActivatedIsTrue(pageable).map(UserDTO::new); - } - - @Transactional(readOnly = true) - public Optional<User> getUserWithAuthoritiesByLogin(String login) { - return userRepository.findOneWithAuthoritiesByLogin(login); - } - - @Transactional(readOnly = true) - public Optional<User> getUserWithAuthorities() { - return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); - } - - /** - * Not activated users should be automatically deleted after 3 days. - * <p> - * This is scheduled to get fired everyday, at 01:00 (am). - */ - @Scheduled(cron = "0 0 1 * * ?") - public void removeNotActivatedUsers() { - userRepository - .findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS)) - .forEach(user -> { - log.debug("Deleting not activated user {}", user.getLogin()); - userRepository.delete(user); - this.clearUserCaches(user); - }); - } - - /** - * Gets a list of all the authorities. - * @return a list of all the authorities. - */ - @Transactional(readOnly = true) - public List<String> getAuthorities() { - return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList()); - } - - private void clearUserCaches(User user) { - Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE)).evict(user.getLogin()); - if (user.getEmail() != null) { - Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_EMAIL_CACHE)).evict(user.getEmail()); - } - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/UsernameAlreadyUsedException.java b/pamapi/src/main/java/com/pollex/pam/service/UsernameAlreadyUsedException.java deleted file mode 100644 index 3d011f8..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/UsernameAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.service; - -public class UsernameAlreadyUsedException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UsernameAlreadyUsedException() { - super("Login name already used!"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AbstractAppointmentProcessDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AbstractAppointmentProcessDTO.java deleted file mode 100644 index 13b270d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AbstractAppointmentProcessDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.enums.ContactStatusEnum; - -public abstract class AbstractAppointmentProcessDTO{ - - private ContactStatusEnum contactStatus; - private Long appointmentId; -// private Long closedInfoId; - - public ContactStatusEnum getContactStatus() { - return contactStatus; - } - - public void setContactStatus(ContactStatusEnum contactStatus) { - this.contactStatus = contactStatus; - } - - public Long getAppointmentId() { - return appointmentId; - } - - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - -// public Long getClosedInfoId() { -// return closedInfoId; -// } -// -// public void setClosedInfoId(Long closedInfoId) { -// this.closedInfoId = closedInfoId; -// } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AddConsultantParam.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AddConsultantParam.java deleted file mode 100644 index 87749cf..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AddConsultantParam.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.List; - -public class AddConsultantParam { - List<String> agentNoList; - - public List<String> getAgentNoList() { - return agentNoList; - } - - public void setAgentNoList(List<String> agentNoList) { - this.agentNoList = agentNoList; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AdminUserDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AdminUserDTO.java deleted file mode 100644 index bcdafec..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AdminUserDTO.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.Authority; -import com.pollex.pam.domain.User; -import java.time.Instant; -import java.util.Set; -import java.util.stream.Collectors; -import javax.validation.constraints.*; - -/** - * A DTO representing a user, with his authorities. - */ -public class AdminUserDTO { - - private Long id; - - @NotBlank - @Pattern(regexp = Constants.LOGIN_REGEX) - @Size(min = 1, max = 50) - private String login; - - @Size(max = 50) - private String firstName; - - @Size(max = 50) - private String lastName; - - @Email - @Size(min = 5, max = 254) - private String email; - - @Size(max = 256) - private String imageUrl; - - private boolean activated = false; - - @Size(min = 2, max = 10) - private String langKey; - - private String createdBy; - - private Instant createdDate; - - private String lastModifiedBy; - - private Instant lastModifiedDate; - - private Set<String> authorities; - - public AdminUserDTO() { - // Empty constructor needed for Jackson. - } - - public AdminUserDTO(User user) { - this.id = user.getId(); - this.login = user.getLogin(); - this.firstName = user.getFirstName(); - this.lastName = user.getLastName(); - this.email = user.getEmail(); - this.activated = user.isActivated(); - this.imageUrl = user.getImageUrl(); - this.langKey = user.getLangKey(); - this.createdBy = user.getCreatedBy(); - this.createdDate = user.getCreatedDate(); - this.lastModifiedBy = user.getLastModifiedBy(); - this.lastModifiedDate = user.getLastModifiedDate(); - this.authorities = user.getAuthorities().stream().map(Authority::getName).collect(Collectors.toSet()); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - public void setLogin(String login) { - this.login = login; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public boolean isActivated() { - return activated; - } - - public void setActivated(boolean activated) { - this.activated = activated; - } - - public String getLangKey() { - return langKey; - } - - public void setLangKey(String langKey) { - this.langKey = langKey; - } - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getLastModifiedBy() { - return lastModifiedBy; - } - - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public Set<String> getAuthorities() { - return authorities; - } - - public void setAuthorities(Set<String> authorities) { - this.authorities = authorities; - } - - // prettier-ignore - @Override - public String toString() { - return "AdminUserDTO{" + - "login='" + login + '\'' + - ", firstName='" + firstName + '\'' + - ", lastName='" + lastName + '\'' + - ", email='" + email + '\'' + - ", imageUrl='" + imageUrl + '\'' + - ", activated=" + activated + - ", langKey='" + langKey + '\'' + - ", createdBy=" + createdBy + - ", createdDate=" + createdDate + - ", lastModifiedBy='" + lastModifiedBy + '\'' + - ", lastModifiedDate=" + lastModifiedDate + - ", authorities=" + authorities + - "}"; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCloseDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCloseDTO.java deleted file mode 100644 index bc9a8e2..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCloseDTO.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.Date; - -import com.pollex.pam.enums.ContactStatusEnum; - -public class AppointmentCloseDTO{ - -// private Long closedInfoId; - private String policyholderIdentityId; - private String planCode; - private Date policyEntryDate; - private String remark; - private String closedReason; - private String closedOtherReason; - private ContactStatusEnum contactStatus; - private Long appointmentId; - - public String getPolicyholderIdentityId() { - return policyholderIdentityId; - } - public void setPolicyholderIdentityId(String policyholderIdentityId) { - this.policyholderIdentityId = policyholderIdentityId; - } - public String getPlanCode() { - return planCode; - } - public void setPlanCode(String planCode) { - this.planCode = planCode; - } - public Date getPolicyEntryDate() { - return policyEntryDate; - } - public void setPolicyEntryDate(Date policyEntryDate) { - this.policyEntryDate = policyEntryDate; - } - public String getRemark() { - return remark; - } - public void setRemark(String remark) { - this.remark = remark; - } - public String getClosedReason() { - return closedReason; - } - public void setClosedReason(String closedReason) { - this.closedReason = closedReason; - } - public String getClosedOtherReason() { - return closedOtherReason; - } - public void setClosedOtherReason(String closedOtherReason) { - this.closedOtherReason = closedOtherReason; - } - public ContactStatusEnum getContactStatus() { - return contactStatus; - } - public void setContactStatus(ContactStatusEnum contactStatus) { - this.contactStatus = contactStatus; - } - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } -// public Long getClosedInfoId() { -// return closedInfoId; -// } -// public void setClosedInfoId(Long closedInfoId) { -// this.closedInfoId = closedInfoId; -// } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCreateDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCreateDTO.java deleted file mode 100644 index 3c566ab..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCreateDTO.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.pollex.pam.service.dto; - -public class AppointmentCreateDTO { - - private String phone; - private String email; - private String contactType; //�蝯⊥撘� - private String gender; - private String age; - private String job; - private String requirement; - private String hopeContactTime; //撣�蝯∠���� - private String otherRequirement; - private String agentNo; - - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getContactType() { - return contactType; - } - public void setContactType(String contactType) { - this.contactType = contactType; - } - public String getGender() { - return gender; - } - public void setGender(String gender) { - this.gender = gender; - } - public String getJob() { - return job; - } - public void setJob(String job) { - this.job = job; - } - public String getRequirement() { - return requirement; - } - public void setRequirement(String requirement) { - this.requirement = requirement; - } - public String getHopeContactTime() { - return hopeContactTime; - } - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - public String getOtherRequirement() { - return otherRequirement; - } - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - public String getAge() { - return age; - } - public void setAge(String age) { - this.age = age; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java deleted file mode 100644 index 6c3f3fb..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.time.Instant; -import java.util.List; - -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.domain.AppointmentMemo; -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.domain.InterviewRecord; -import com.pollex.pam.enums.ContactStatusEnum; - -public class AppointmentCustomerViewDTO { - - private Long id; - private String phone; - private String email; - private String contactType; - private String gender; - private String age; - private String job; - private String requirement; - private ContactStatusEnum communicateStatus; - private String hopeContactTime; - private String otherRequirement; - private Instant appointmentDate; - private Instant lastModifiedDate; - private String agentNo; - private Long customerId; - private String name; - private Instant consultantViewTime; - private Instant consultantReadTime; - private Instant contactTime; - private Float satisfactionScore; - private List<AppointmentMemo> appointmentMemoList; - private List<InterviewRecordDTO> interviewRecordDTOs; - private List<AppointmentNoticeLog> appointmentNoticeLogs; - private AppointmentClosedInfo appointmentClosedInfo; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getContactType() { - return contactType; - } - public void setContactType(String contactType) { - this.contactType = contactType; - } - public String getGender() { - return gender; - } - public void setGender(String gender) { - this.gender = gender; - } - public String getAge() { - return age; - } - public void setAge(String age) { - this.age = age; - } - public String getJob() { - return job; - } - public void setJob(String job) { - this.job = job; - } - public String getRequirement() { - return requirement; - } - public void setRequirement(String requirement) { - this.requirement = requirement; - } - public ContactStatusEnum getCommunicateStatus() { - return communicateStatus; - } - public void setCommunicateStatus(ContactStatusEnum communicateStatus) { - this.communicateStatus = communicateStatus; - } - public String getHopeContactTime() { - return hopeContactTime; - } - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - public String getOtherRequirement() { - return otherRequirement; - } - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - public Instant getAppointmentDate() { - return appointmentDate; - } - public void setAppointmentDate(Instant appointmentDate) { - this.appointmentDate = appointmentDate; - } - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - public Long getCustomerId() { - return customerId; - } - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public Instant getConsultantViewTime() { - return consultantViewTime; - } - public void setConsultantViewTime(Instant consultantViewTime) { - this.consultantViewTime = consultantViewTime; - } - public Instant getConsultantReadTime() { - return consultantReadTime; - } - public void setConsultantReadTime(Instant consultantReadTime) { - this.consultantReadTime = consultantReadTime; - } - public Instant getContactTime() { - return contactTime; - } - public void setContactTime(Instant contactTime) { - this.contactTime = contactTime; - } - public Float getSatisfactionScore() { - return satisfactionScore; - } - public void setSatisfactionScore(Float satisfactionScore) { - this.satisfactionScore = satisfactionScore; - } - public List<AppointmentMemo> getAppointmentMemoList() { - return appointmentMemoList; - } - public void setAppointmentMemoList(List<AppointmentMemo> appointmentMemoList) { - this.appointmentMemoList = appointmentMemoList; - } - public List<InterviewRecordDTO> getInterviewRecordDTOs() { - return interviewRecordDTOs; - } - public void setInterviewRecordDTOs(List<InterviewRecordDTO> interviewRecordDTOs) { - this.interviewRecordDTOs = interviewRecordDTOs; - } - public List<AppointmentNoticeLog> getAppointmentNoticeLogs() { - return appointmentNoticeLogs; - } - public void setAppointmentNoticeLogs(List<AppointmentNoticeLog> appointmentNoticeLogs) { - this.appointmentNoticeLogs = appointmentNoticeLogs; - } - public AppointmentClosedInfo getAppointmentClosedInfo() { - return appointmentClosedInfo; - } - public void setAppointmentClosedInfo(AppointmentClosedInfo appointmentClosedInfo) { - this.appointmentClosedInfo = appointmentClosedInfo; - } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java deleted file mode 100644 index ea18083..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.time.Instant; - -import org.springframework.stereotype.Service; - -import com.pollex.pam.enums.ContactStatusEnum; - -public class AppointmentDTO { - - private Long id; - private String phone; - private String email; - private String contactType; - private String gender; - private String age; - private String job; - private String requirement; - private ContactStatusEnum communicateStatus; - private String hopeContactTime; - private String otherRequirement; - private Instant appointmentDate; - private Instant lastModifiedDate; - private String agentNo; - private Long customerId; - private Instant consultantViewTime; - private Instant consultantReadTime; - private Instant contactTime; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getContactType() { - return contactType; - } - public void setContactType(String contactType) { - this.contactType = contactType; - } - public String getGender() { - return gender; - } - public void setGender(String gender) { - this.gender = gender; - } - public String getAge() { - return age; - } - public void setAge(String age) { - this.age = age; - } - public String getJob() { - return job; - } - public void setJob(String job) { - this.job = job; - } - public String getRequirement() { - return requirement; - } - public void setRequirement(String requirement) { - this.requirement = requirement; - } - public ContactStatusEnum getCommunicateStatus() { - return communicateStatus; - } - public void setCommunicateStatus(ContactStatusEnum communicateStatus) { - this.communicateStatus = communicateStatus; - } - public String getHopeContactTime() { - return hopeContactTime; - } - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - public String getOtherRequirement() { - return otherRequirement; - } - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - public Instant getAppointmentDate() { - return appointmentDate; - } - public void setAppointmentDate(Instant appointmentDate) { - this.appointmentDate = appointmentDate; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - public Long getCustomerId() { - return customerId; - } - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - public Instant getConsultantViewTime() { - return consultantViewTime; - } - public void setConsultantViewTime(Instant consultantViewTime) { - this.consultantViewTime = consultantViewTime; - } - public Instant getConsultantReadTime() { - return consultantReadTime; - } - public void setConsultantReadTime(Instant consultantReadTime) { - this.consultantReadTime = consultantReadTime; - } - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - public Instant getContactTime() { - return contactTime; - } - public void setContactTime(Instant contactTime) { - this.contactTime = contactTime; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoCreateDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoCreateDTO.java deleted file mode 100644 index 1750480..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoCreateDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pollex.pam.service.dto; - -public class AppointmentMemoCreateDTO { - - private String content; - private Long appointmentId; - - public String getContent() { - return content; - } - public void setContent(String content) { - this.content = content; - } - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoUpdateDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoUpdateDTO.java deleted file mode 100644 index 262838a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentMemoUpdateDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pollex.pam.service.dto; - -public class AppointmentMemoUpdateDTO{ - - private Long id; - private String content; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentNoticeSendDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentNoticeSendDTO.java deleted file mode 100644 index 2256fc8..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentNoticeSendDTO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.Date; - -public class AppointmentNoticeSendDTO { - - private String message; - private Long appointmentId; - private String email; - private String phone; -// private String noticeType; - private Date interviewDate; - - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } -// public String getNoticeType() { -// return noticeType; -// } -// public void setNoticeType(String noticeType) { -// this.noticeType = noticeType; -// } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - public Date getInterviewDate() { - return interviewDate; - } - public void setInterviewDate(Date interviewDate) { - this.interviewDate = interviewDate; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentUpdateDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentUpdateDTO.java deleted file mode 100644 index 0be3753..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentUpdateDTO.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.pollex.pam.service.dto; - -public class AppointmentUpdateDTO { - private Long id; - private String phone; - private String email; - private String contactType; - private String gender; - private String age; - private String job; - private String requirement; - private String hopeContactTime; - private String otherRequirement; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getContactType() { - return contactType; - } - - public void setContactType(String contactType) { - this.contactType = contactType; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - public String getAge() { - return age; - } - - public void setAge(String age) { - this.age = age; - } - - public String getJob() { - return job; - } - - public void setJob(String job) { - this.job = job; - } - - public String getRequirement() { - return requirement; - } - - public void setRequirement(String requirement) { - this.requirement = requirement; - } - - public String getHopeContactTime() { - return hopeContactTime; - } - - public void setHopeContactTime(String hopeContactTime) { - this.hopeContactTime = hopeContactTime; - } - - public String getOtherRequirement() { - return otherRequirement; - } - - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/ClosedProcessDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/ClosedProcessDTO.java deleted file mode 100644 index 9b18da4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/ClosedProcessDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pollex.pam.service.dto; - -public class ClosedProcessDTO extends AbstractAppointmentProcessDTO{ - - private String remark; - private String closedReason; - private String closedOtherReason; - - public String getRemark() { - return remark; - } - public void setRemark(String remark) { - this.remark = remark; - } - public String getClosedReason() { - return closedReason; - } - public void setClosedReason(String closedReason) { - this.closedReason = closedReason; - } - public String getClosedOtherReason() { - return closedOtherReason; - } - public void setClosedOtherReason(String closedOtherReason) { - this.closedOtherReason = closedOtherReason; - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java deleted file mode 100644 index f847769..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.pollex.pam.enums.ContactStatusEnum; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.List; - -public class ConsultantDTO { - - @JsonProperty("new") - private boolean newConsultant; - private String agentNo; - private String name; - private String img; - private List<String> expertise; - private Float avgScore; - private ContactStatusEnum contactStatus; - private Instant updateTime; - private String role; - private String seniority; - private int suitability; - - public boolean isNewConsultant() { - if(updateTime != null){ - Instant nowTimestamp = Instant.now(); - return ChronoUnit.DAYS.between(updateTime, nowTimestamp) < 3; - } - return false; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getImg() { - return img; - } - - public void setImg(String img) { - this.img = img; - } - - public List<String> getExpertise() { - return expertise; - } - - public void setExpertise(List<String> expertise) { - this.expertise = expertise; - } - - public Float getAvgScore() { - return avgScore; - } - - public void setAvgScore(Float avgScore) { - this.avgScore = avgScore; - } - - public ContactStatusEnum getContactStatus() { - return contactStatus; - } - - public void setContactStatus(ContactStatusEnum contactStatus) { - this.contactStatus = contactStatus; - } - - public Instant getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Instant updateTime) { - this.updateTime = updateTime; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getSeniority() { - return seniority; - } - - public void setSeniority(String seniority) { - this.seniority = seniority; - } - - public void setNewConsultant(boolean newConsultant) { - this.newConsultant = newConsultant; - } - - public int getSuitability() { - return suitability; - } - - public void setSuitability(int suitability) { - this.suitability = suitability; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDetailDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDetailDTO.java deleted file mode 100644 index ea92f3f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDetailDTO.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.time.Instant; -import java.util.List; - -import com.pollex.pam.enums.GenderEnum; - -public class ConsultantDetailDTO { - - private String name; - private String agentNo; - private String role; - private String img; - private Float avgScore; - private String title; - private String phoneNumber; - private String serveArea; - private String companyAddress; - private Instant latestLoginTime; - private String seniority; - private Number evaluation; - private List<String> expertise; - private String concept; - private String experiences; - private String awards; - private GenderEnum gender; - private String communicationStyle; - private String email; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getImg() { - return img; - } - - public void setImg(String img) { - this.img = img; - } - - public Float getAvgScore() { - return avgScore; - } - - public void setAvgScore(Float avgScore) { - this.avgScore = avgScore; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public String getServeArea() { - return serveArea; - } - - public void setServeArea(String serveArea) { - this.serveArea = serveArea; - } - - public String getCompanyAddress() { - return companyAddress; - } - - public void setCompanyAddress(String companyAddress) { - this.companyAddress = companyAddress; - } - - public Instant getLatestLoginTime() { - return latestLoginTime; - } - - public void setLatestLoginTime(Instant latestLoginTime) { - this.latestLoginTime = latestLoginTime; - } - - public String getSeniority() { - return seniority; - } - - public void setSeniority(String seniority) { - this.seniority = seniority; - } - - public Number getEvaluation() { - return evaluation; - } - - public void setEvaluation(Number evaluation) { - this.evaluation = evaluation; - } - - public List<String> getExpertise() { - return expertise; - } - - public void setExpertise(List<String> expertise) { - this.expertise = expertise; - } - - public String getConcept() { - return concept; - } - - public void setConcept(String concept) { - this.concept = concept; - } - - public String getExperiences() { - return experiences; - } - - public void setExperiences(String experiences) { - this.experiences = experiences; - } - - public String getAwards() { - return awards; - } - - public void setAwards(String awards) { - this.awards = awards; - } - - public GenderEnum getGender() { - return gender; - } - - public void setGender(GenderEnum gender) { - this.gender = gender; - } - - public String getCommunicationStyle() { - return communicationStyle; - } - - public void setCommunicationStyle(String communicationStyle) { - this.communicationStyle = communicationStyle; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantEditDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantEditDTO.java deleted file mode 100644 index 0489a1d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantEditDTO.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.List; - -import com.pollex.pam.enums.GenderEnum; - -public class ConsultantEditDTO { - -// private Long id; - private String name; - private List<String> expertise; - private String title; - private String role; - private String serveArea; - private GenderEnum gender; - private String phoneNumber; - private String companyAddress; - private Long seniorityYear; - private Long seniorityMonth; - private String concept; - private String experiences; - private String awards; - private String communicationStyle; - private String photoBase64; - private String photoFileName; - private String agentNo; - -// public Long getId() { -// return id; -// } -// public void setId(Long id) { -// this.id = id; -// } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public List<String> getExpertise() { - return expertise; - } - public void setExpertise(List<String> expertise) { - this.expertise = expertise; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public String getRole() { - return role; - } - public void setRole(String role) { - this.role = role; - } - public String getServeArea() { - return serveArea; - } - public void setServeArea(String serveArea) { - this.serveArea = serveArea; - } - public GenderEnum getGender() { - return gender; - } - public void setGender(GenderEnum gender) { - this.gender = gender; - } - public String getPhoneNumber() { - return phoneNumber; - } - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - public String getCompanyAddress() { - return companyAddress; - } - public void setCompanyAddress(String companyAddress) { - this.companyAddress = companyAddress; - } - public Long getSeniorityYear() { - return seniorityYear; - } - public void setSeniorityYear(Long seniorityYear) { - this.seniorityYear = seniorityYear; - } - public Long getSeniorityMonth() { - return seniorityMonth; - } - public void setSeniorityMonth(Long seniorityMonth) { - this.seniorityMonth = seniorityMonth; - } - public String getConcept() { - return concept; - } - public void setConcept(String concept) { - this.concept = concept; - } - public String getExperiences() { - return experiences; - } - public void setExperiences(String experiences) { - this.experiences = experiences; - } - public String getAwards() { - return awards; - } - public void setAwards(String awards) { - this.awards = awards; - } - public String getCommunicationStyle() { - return communicationStyle; - } - public void setCommunicationStyle(String communicationStyle) { - this.communicationStyle = communicationStyle; - } - public String getPhotoBase64() { - return photoBase64; - } - public void setPhotoBase64(String photoBase64) { - this.photoBase64 = photoBase64; - } - public String getPhotoFileName() { - return "consultant_"+this.getAgentNo()+".jpg"; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerDTO.java deleted file mode 100644 index 176dc0b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pollex.pam.service.dto; - -public class CustomerDTO { - private String email; - private String phone; - private String name; - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java deleted file mode 100644 index bdcdfd6..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.pollex.pam.enums.ContactStatusEnum; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.List; - -public class CustomerFavoriteConsultantDTO { - - private String agentNo; - private String name; - private String img; - private List<String> expertise; - private Float avgScore; - private ContactStatusEnum contactStatus; - private Instant createTime; - private Instant updateTime; - private Instant customerViewTime; - private String role; - private String seniority; - private List<AppointmentCustomerViewDTO> appointments; - - public String getAgentNo() { - return agentNo; - } - - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getImg() { - return img; - } - - public void setImg(String img) { - this.img = img; - } - - public List<String> getExpertise() { - return expertise; - } - - public void setExpertise(List<String> expertise) { - this.expertise = expertise; - } - - public Float getAvgScore() { - return avgScore; - } - - public void setAvgScore(Float avgScore) { - this.avgScore = avgScore; - } - - public ContactStatusEnum getContactStatus() { - return contactStatus; - } - - public void setContactStatus(ContactStatusEnum contactStatus) { - this.contactStatus = contactStatus; - } - - public Instant getCreateTime() { - return createTime; - } - - public Instant getUpdateTime() { - return updateTime; - } - - public void setCreateTime(Instant createTime) { - this.createTime = createTime; - } - - public void setUpdateTime(Instant updateTime) { - this.updateTime = updateTime; - } - - public Instant getCustomerViewTime() { - return customerViewTime; - } - - public void setCustomerViewTime(Instant customerViewTime) { - this.customerViewTime = customerViewTime; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } - - public String getSeniority() { - return seniority; - } - - public void setSeniority(String seniority) { - this.seniority = seniority; - } - - public List<AppointmentCustomerViewDTO> getAppointments() { - return appointments; - } - - public void setAppointments(List<AppointmentCustomerViewDTO> appointments) { - this.appointments = appointments; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerRegisterDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerRegisterDTO.java deleted file mode 100644 index 058cc56..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerRegisterDTO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.enums.OtpLoginTypeEnum; - -public class CustomerRegisterDTO { - - private String name; - private String phone; - private String email; - private OtpLoginTypeEnum contactType; - private String indexKey; - private String otpCode; - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public OtpLoginTypeEnum getContactType() { - return contactType; - } - public void setContactType(OtpLoginTypeEnum contactType) { - this.contactType = contactType; - } - public String getIndexKey() { - return indexKey; - } - public void setIndexKey(String indexKey) { - this.indexKey = indexKey; - } - public String getOtpCode() { - return otpCode; - } - public void setOtpCode(String otpCode) { - this.otpCode = otpCode; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/DoneProcessDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/DoneProcessDTO.java deleted file mode 100644 index 2c9881a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/DoneProcessDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.Date; - -public class DoneProcessDTO extends AbstractAppointmentProcessDTO{ - - private String policyholderIdentityId; - private String planCode; - private Date policyEntryDate; - private String remark; - - public String getPolicyholderIdentityId() { - return policyholderIdentityId; - } - public void setPolicyholderIdentityId(String policyholderIdentityId) { - this.policyholderIdentityId = policyholderIdentityId; - } - public String getPlanCode() { - return planCode; - } - public void setPlanCode(String planCode) { - this.planCode = planCode; - } - public Date getPolicyEntryDate() { - return policyEntryDate; - } - public void setPolicyEntryDate(Date policyEntryDate) { - this.policyEntryDate = policyEntryDate; - } - public String getRemark() { - return remark; - } - public void setRemark(String remark) { - this.remark = remark; - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceRequest.java b/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceRequest.java deleted file mode 100644 index 00e139d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceRequest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pollex.pam.service.dto; - -public class EServiceRequest { - private String func; - private String id; - private String pin; - private String pwd; - private String sys; - - public String getFunc() { - return func; - } - - public void setFunc(String func) { - this.func = func; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getPin() { - return pin; - } - - public void setPin(String pin) { - this.pin = pin; - } - - public String getPwd() { - return pwd; - } - - public void setPwd(String pwd) { - this.pwd = pwd; - } - - public String getSys() { - return sys; - } - - public void setSys(String sys) { - this.sys = sys; - } -} - diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceResponse.java b/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceResponse.java deleted file mode 100644 index a04681d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/EServiceResponse.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.List; - -public class EServiceResponse { - private String issuccess; - private String code; - private String msg; - private List<EServiceData> data; - - public String getIssuccess() { - return issuccess; - } - - public void setIssuccess(String issuccess) { - this.issuccess = issuccess; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public List<EServiceData> getData() { - return data; - } - - public void setData(List<EServiceData> data) { - this.data = data; - } - - @Override - public String toString() { - return "EServiceResponse{" + - "issuccess='" + issuccess + '\'' + - ", code='" + code + '\'' + - ", msg='" + msg + '\'' + - '}'; - } -} - -class EServiceData { - private String usr; - private String isactive; - private String role; - - public String getUsr() { - return usr; - } - - public void setUsr(String usr) { - this.usr = usr; - } - - public String getIsactive() { - return isactive; - } - - public void setIsactive(String isactive) { - this.isactive = isactive; - } - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/FastQueryConsultantParam.java b/pamapi/src/main/java/com/pollex/pam/service/dto/FastQueryConsultantParam.java deleted file mode 100644 index a8c443d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/FastQueryConsultantParam.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.enums.GenderEnum; - -import java.util.List; - -public class FastQueryConsultantParam { - - private GenderEnum gender; - private List<String> communicationStyles; - private Number avgScore; - private String status; - private String seniority; - - public GenderEnum getGender() { - return gender; - } - - public void setGender(GenderEnum gender) { - this.gender = gender; - } - - public List<String> getCommunicationStyles() { - return communicationStyles; - } - - public void setCommunicationStyles(List<String> communicationStyles) { - this.communicationStyles = communicationStyles; - } - - public Number getAvgScore() { - return avgScore; - } - - public void setAvgScore(Number avgScore) { - this.avgScore = avgScore; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getSeniority() { - return seniority; - } - - public void setSeniority(String seniority) { - this.seniority = seniority; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/InterviewRecordDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/InterviewRecordDTO.java deleted file mode 100644 index 83c3a7b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/InterviewRecordDTO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.time.Instant; -import java.util.Date; - -public class InterviewRecordDTO { - - private Long id; - private String content; - private Instant createdDate; - private Instant lastModifiedDate; - private String createdBy; - private String lastModifiedBy; - private Date interviewDate; - private Long appointmentId; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getContent() { - return content; - } - public void setContent(String content) { - this.content = content; - } - public Instant getCreatedDate() { - return createdDate; - } - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - public String getCreatedBy() { - return createdBy; - } - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - public String getLastModifiedBy() { - return lastModifiedBy; - } - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - public Date getInterviewDate() { - return interviewDate; - } - public void setInterviewDate(Date interviewDate) { - this.interviewDate = interviewDate; - } - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java deleted file mode 100644 index 68d0704..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.Arrays; -import java.util.List; - -public class OtpResponseDTO { - private static final String OTP_SUCCESS_CODE = "0"; - private final String indexKey; - private final boolean success; - private final String failCode; - private final String failReason; - - public OtpResponseDTO(String[] strings) { - this(Arrays.asList(strings)); - } - - public OtpResponseDTO(List<String> strings) { - if(strings.size() == 4) { - this.indexKey = strings.get(0); - this.success = OTP_SUCCESS_CODE.equals(strings.get(1)); - this.failCode = strings.get(2); - this.failReason = strings.get(3); - } - else { - throw new IllegalArgumentException("the otp response can't format: " + strings); - } - } - - public String getIndexKey() { - return indexKey; - } - - public boolean isSuccess() { - return success; - } - - public String getFailCode() { - return failCode; - } - - public String getFailReason() { - return failReason; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/PasswordChangeDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/PasswordChangeDTO.java deleted file mode 100644 index 0ad177f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/PasswordChangeDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pollex.pam.service.dto; - -/** - * A DTO representing a password change required data - current and new password. - */ -public class PasswordChangeDTO { - - private String currentPassword; - private String newPassword; - - public PasswordChangeDTO() { - // Empty constructor needed for Jackson. - } - - public PasswordChangeDTO(String currentPassword, String newPassword) { - this.currentPassword = currentPassword; - this.newPassword = newPassword; - } - - public String getCurrentPassword() { - return currentPassword; - } - - public void setCurrentPassword(String currentPassword) { - this.currentPassword = currentPassword; - } - - public String getNewPassword() { - return newPassword; - } - - public void setNewPassword(String newPassword) { - this.newPassword = newPassword; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java deleted file mode 100644 index 8cbc3da..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SMSDetail { - private String mobile; - private String content; - - @JsonProperty("mobile") - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - @JsonProperty("content") - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionCustomerScoreDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionCustomerScoreDTO.java deleted file mode 100644 index 1cbf0e3..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionCustomerScoreDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.enums.SatisfactionTypeEnum; - -public class SatisfactionCustomerScoreDTO { - - private Long appointmentId; - private Float score; - private SatisfactionTypeEnum type; - - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - public Float getScore() { - return score; - } - public void setScore(Float score) { - this.score = score; - } - public SatisfactionTypeEnum getType() { - return type; - } - public void setType(SatisfactionTypeEnum type) { - this.type = type; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java deleted file mode 100644 index 152a82d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.time.Instant; - -import com.pollex.pam.enums.SatisfactionStatusEnum; -import com.pollex.pam.enums.SatisfactionTypeEnum; - -public class SatisfactionDTO { - - private Long id; - private Instant createdDate; - private Instant lastModifiedDate; - private Long customerId; - private String agentNo; - private SatisfactionStatusEnum status; - private Float score; - private Long appointmentId; - private String customerName; - private String agentName; - private SatisfactionTypeEnum type; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public Instant getCreatedDate() { - return createdDate; - } - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - public Long getCustomerId() { - return customerId; - } - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - public SatisfactionStatusEnum getStatus() { - return status; - } - public void setStatus(SatisfactionStatusEnum status) { - this.status = status; - } - public Float getScore() { - return score; - } - public void setScore(Float score) { - this.score = score; - } - public Long getAppointmentId() { - return appointmentId; - } - public void setAppointmentId(Long appointmentId) { - this.appointmentId = appointmentId; - } - public String getCustomerName() { - return customerName; - } - public void setCustomerName(String customerName) { - this.customerName = customerName; - } - public String getAgentName() { - return agentName; - } - public void setAgentName(String agentName) { - this.agentName = agentName; - } - public SatisfactionTypeEnum getType() { - return type; - } - public void setType(SatisfactionTypeEnum type) { - this.type = type; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionUpdateDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionUpdateDTO.java deleted file mode 100644 index 1a8435f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionUpdateDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pollex.pam.service.dto; - -public class SatisfactionUpdateDTO { - - private Long id; - private Long customerId; - private String agentNo; - private String status; - private String score; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public Long getCustomerId() { - return customerId; - } - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - public String getAgentNo() { - return agentNo; - } - public void setAgentNo(String agentNo) { - this.agentNo = agentNo; - } - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - public String getScore() { - return score; - } - public void setScore(String score) { - this.score = score; - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailRequest.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailRequest.java deleted file mode 100644 index 2470a67..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailRequest.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.pollex.pam.service.dto; - -import java.util.List; - -public class SendMailRequest { - - /** - * �隞嗉�� - */ - private List<String> sendMailAddresses; - /** - * �� - */ - private List<String> sendCCMailAddresses; - /** - * 銝駁�� - */ - private String subject; - /** - * ���� - */ - private String content; - /** - * 撖辣�� - */ - private String from; - /** - * ��辣頝臬�� - */ - private List<String> attachments; - /** - * �� html format - */ - private boolean htmlFormat; - /** - * �摰儔閮���� (������������神甇餃�pos) - */ - private String functionId; - - public List<String> getSendMailAddresses() { - return sendMailAddresses; - } - - public void setSendMailAddresses(List<String> sendMailAddresses) { - this.sendMailAddresses = sendMailAddresses; - } - - public List<String> getSendCCMailAddresses() { - return sendCCMailAddresses; - } - - public void setSendCCMailAddresses(List<String> sendCCMailAddresses) { - this.sendCCMailAddresses = sendCCMailAddresses; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public String getFrom() { - return from; - } - - public void setFrom(String from) { - this.from = from; - } - - public List<String> getAttachments() { - return attachments; - } - - public void setAttachments(List<String> attachments) { - this.attachments = attachments; - } - - public boolean isHtmlFormat() { - return htmlFormat; - } - - public void setHtmlFormat(boolean htmlFormat) { - this.htmlFormat = htmlFormat; - } - - public String getFunctionId() { - return functionId; - } - - public void setFunctionId(String functionId) { - this.functionId = functionId; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java deleted file mode 100644 index aee72f7..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class SendMailResponse { - private Data data; - - public Data getData() { - return data; - } - - public void setData(Data data) { - this.data = data; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Data { - private String messageStatus; - - public String getMessageStatus() { - return messageStatus; - } - - public void setMessageStatus(String messageStatus) { - this.messageStatus = messageStatus; - } - - @Override - public String toString() { - return "Data{" + - "messageStatus='" + messageStatus + '\'' + - '}'; - } - } - - @Override - public String toString() { - return "SendMailResponse{" + - "data=" + data + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java deleted file mode 100644 index de3aa42..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public class SendSMSRequest { - - private String pKey; - private String sourceCode; - private String sender; - private String sendTime; - private String subject; - private String activityId; - private String mmsPath; - private String msgTypeSet; - private List<SMSDetail> detail; - - @JsonProperty("p_key") - public String getpKey() { - return pKey; - } - - public void setpKey(String pKey) { - this.pKey = pKey; - } - - @JsonProperty("source_code") - public String getSourceCode() { - return sourceCode; - } - - public void setSourceCode(String sourceCode) { - this.sourceCode = sourceCode; - } - - @JsonProperty("sender") - public String getSender() { - return sender; - } - - public void setSender(String sender) { - this.sender = sender; - } - - @JsonProperty("send_time") - public String getSendTime() { - return sendTime; - } - - public void setSendTime(String sendTime) { - this.sendTime = sendTime; - } - - @JsonProperty("subject") - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - @JsonProperty("activity_id") - public String getActivityId() { - return activityId; - } - - public void setActivityId(String activityId) { - this.activityId = activityId; - } - - @JsonProperty("mms_path") - public String getMmsPath() { - return mmsPath; - } - - public void setMmsPath(String mmsPath) { - this.mmsPath = mmsPath; - } - - @JsonProperty("msg_type_set") - public String getMsgTypeSet() { - return msgTypeSet; - } - - public void setMsgTypeSet(String msgTypeSet) { - this.msgTypeSet = msgTypeSet; - } - - @JsonProperty("detail") - public List<SMSDetail> getDetail() { - return detail; - } - - public void setDetail(List<SMSDetail> detail) { - this.detail = detail; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java deleted file mode 100644 index 9073766..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SendSMSResponse { - - @JsonProperty("p_key") - private String pKey; - - @JsonProperty("return_code") - private String returnCode; - - @JsonProperty("msg_batchNo") - private String msgBatchNo; - - @JsonProperty("error_msg") - private String errorMsg; - - public String getpKey() { - return pKey; - } - - public void setpKey(String pKey) { - this.pKey = pKey; - } - - public String getReturnCode() { - return returnCode; - } - - public void setReturnCode(String returnCode) { - this.returnCode = returnCode; - } - - public String getMsgBatchNo() { - return msgBatchNo; - } - - public void setMsgBatchNo(String msgBatchNo) { - this.msgBatchNo = msgBatchNo; - } - - public String getErrorMsg() { - return errorMsg; - } - - public void setErrorMsg(String errorMsg) { - this.errorMsg = errorMsg; - } - - @Override - public String toString() { - return "SendSMSResponse{" + - "pKey='" + pKey + '\'' + - ", returnCode='" + returnCode + '\'' + - ", msgBatchNo='" + msgBatchNo + '\'' + - ", errorMsg='" + errorMsg + '\'' + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java b/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java deleted file mode 100644 index 7a7afcf..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.enums.GenderEnum; - -import java.util.List; - -public class StrictQueryConsultantParam { - - private GenderEnum gender; - private Float avgScore; - private String status; - private String area; - private List<String> requirements; - private String otherRequirement; - private String seniority; - private List<String> popularTags; - private String otherPopularTags; - - public GenderEnum getGender() { - return gender; - } - - public void setGender(GenderEnum gender) { - this.gender = gender; - } - - public Float getAvgScore() { - return avgScore; - } - - public void setAvgScore(Float avgScore) { - this.avgScore = avgScore; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public List<String> getRequirements() { - return requirements; - } - - public void setRequirements(List<String> requirements) { - this.requirements = requirements; - } - - public String getOtherRequirement() { - return otherRequirement; - } - - public void setOtherRequirement(String otherRequirement) { - this.otherRequirement = otherRequirement; - } - - public String getSeniority() { - return seniority; - } - - public void setSeniority(String seniority) { - this.seniority = seniority; - } - - public List<String> getPopularTags() { - return popularTags; - } - - public void setPopularTags(List<String> popularTags) { - this.popularTags = popularTags; - } - - public String getOtherPopularTags() { - return otherPopularTags; - } - - public void setOtherPopularTags(String otherPopularTags) { - this.otherPopularTags = otherPopularTags; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/UserDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/UserDTO.java deleted file mode 100644 index dfcfacc..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/UserDTO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pollex.pam.service.dto; - -import com.pollex.pam.domain.User; - -/** - * A DTO representing a user, with only the public attributes. - */ -public class UserDTO { - - private Long id; - - private String login; - - public UserDTO() { - // Empty constructor needed for Jackson. - } - - public UserDTO(User user) { - this.id = user.getId(); - // Customize it here if you need, or not, firstName/lastName/etc - this.login = user.getLogin(); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - public void setLogin(String login) { - this.login = login; - } - - // prettier-ignore - @Override - public String toString() { - return "UserDTO{" + - "id='" + id + '\'' + - ", login='" + login + '\'' + - "}"; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/package-info.java b/pamapi/src/main/java/com/pollex/pam/service/dto/package-info.java deleted file mode 100644 index 44834d3..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Data Transfer Objects. - */ -package com.pollex.pam.service.dto; diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentCustomerViewMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentCustomerViewMapper.java deleted file mode 100644 index 4389195..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentCustomerViewMapper.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pollex.pam.service.mapper; - -import static java.util.stream.Collectors.toList; - -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.pollex.pam.domain.AppointmentClosedInfo; -import com.pollex.pam.domain.AppointmentCustomerView; -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.repository.AppointmentClosedInfoRepository; -import com.pollex.pam.service.AppointmentClosedInfoService; -import com.pollex.pam.service.AppointmentNoticeLogService; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.dto.AppointmentCustomerViewDTO; - -@Service -public class AppointmentCustomerViewMapper { - - @Autowired - AppointmentService appointmentService; - - @Autowired - AppointmentNoticeLogService appointmentNoticeLogService; - - @Autowired - AppointmentClosedInfoRepository appointmentClosedInfoRepository; - - @Transactional - public AppointmentCustomerViewDTO toAppointmentCustomerViewDTO(AppointmentCustomerView source) { - AppointmentCustomerViewDTO target = new AppointmentCustomerViewDTO(); - BeanUtils.copyProperties(source, target); - target.setAppointmentMemoList(source.getAppointmentMemoList()); - appointmentService.setInterviewRecordDTO(target); - List<AppointmentNoticeLog> noticeLogs = appointmentNoticeLogService.findByAppointmentId(source.getId()); - target.setAppointmentNoticeLogs(noticeLogs); - Optional<AppointmentClosedInfo> appointmentClosedInfoOP = appointmentClosedInfoRepository - .findByAppointmentId(source.getId()); - if(appointmentClosedInfoOP.isPresent()) { - target.setAppointmentClosedInfo(appointmentClosedInfoOP.get()); - } - appointmentService.setSatisfactionScore(target, source.getId()); - - return target; - } - - public List<AppointmentCustomerViewDTO> toAppointmentCustomerViewDTO( - List<AppointmentCustomerView> source) { - return source.stream().map(s -> toAppointmentCustomerViewDTO(s)) - .collect(toList()); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentDTOMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentDTOMapper.java deleted file mode 100644 index 8a1d6de..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentDTOMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pollex.pam.service.mapper; - -import com.pollex.pam.service.dto.AppointmentDTO; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.enums.ContactStatusEnum; -import com.pollex.pam.service.dto.AppointmentCreateDTO; - -@Service -public class AppointmentDTOMapper { - - public Appointment toAppointment(AppointmentCreateDTO source) { - Appointment target = new Appointment(); - BeanUtils.copyProperties(source, target); - return target; - } - - public Appointment toAppointment(AppointmentDTO source) { - Appointment target = new Appointment(); - BeanUtils.copyProperties(source, target); - return target; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java deleted file mode 100644 index 5526738..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.pollex.pam.service.mapper; - -import static java.util.stream.Collectors.toList; - -import java.util.List; - -import com.pollex.pam.enums.SatisfactionTypeEnum; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.enums.SatisfactionStatusEnum; -import com.pollex.pam.repository.AppointmentRepository; -import com.pollex.pam.service.dto.AppointmentDTO; - -@Service -public class AppointmentMapper { - - @Autowired - AppointmentRepository appointmentRepository; - - public AppointmentDTO toAppointmentDTO(Appointment source) { - AppointmentDTO target = new AppointmentDTO(); - BeanUtils.copyProperties(source, target); - return target; - } - - public List<AppointmentDTO> toAppointmentDTO(List<Appointment> source) { - return source.stream() - .map(s -> toAppointmentDTO(s)).collect(toList()); - } - - public Satisfaction toAppointmentSatisfaction(Appointment appointment) { - Satisfaction target = new Satisfaction(); - target.setAppointmentId(appointment.getId()); - target.setAgentNo(appointment.getAgentNo()); - target.setCustomerId(appointment.getCustomerId()); - target.setType(SatisfactionTypeEnum.APPOINTMENT); - target.setStatus(SatisfactionStatusEnum.UNFILLED); - return target; - } - - public Satisfaction toAppointmentSatisfaction(Long appointmentId) { - Appointment appointment = appointmentRepository.findById(appointmentId).get(); - return toAppointmentSatisfaction(appointment); - } - - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMemoMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMemoMapper.java deleted file mode 100644 index aaae2e9..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMemoMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pollex.pam.service.mapper; - -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.AppointmentMemo; -import com.pollex.pam.service.dto.AppointmentMemoCreateDTO; -import com.pollex.pam.service.dto.AppointmentMemoUpdateDTO; - -@Service -public class AppointmentMemoMapper { - - public AppointmentMemo toAppointmentMemo(AppointmentMemoCreateDTO source) { - AppointmentMemo target = new AppointmentMemo(); - BeanUtils.copyProperties(source, target); - return target; - } - - public AppointmentMemo copyToAppointmentMemo(AppointmentMemoUpdateDTO source, AppointmentMemo target) { - BeanUtils.copyProperties(source, target); - return target; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentNoticeSendMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentNoticeSendMapper.java deleted file mode 100644 index 69a8cb1..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentNoticeSendMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pollex.pam.service.mapper; - -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.service.dto.AppointmentNoticeSendDTO; - -@Service -public class AppointmentNoticeSendMapper { - - public AppointmentNoticeLog toAppointmentNoticeLog(AppointmentNoticeSendDTO source) { - AppointmentNoticeLog target = new AppointmentNoticeLog(); - BeanUtils.copyProperties(source, target); -// target.setAppointmentId(source.getAppointmentId()); - target.setContent(source.getMessage()); -// target.setEmail(source.getEmail()); -// target.setPhone(source.getPhone()); - return target; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantDTOMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantDTOMapper.java deleted file mode 100644 index 48987fc..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantDTOMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pollex.pam.service.mapper; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.service.dto.ConsultantEditDTO; -import com.pollex.pam.service.util.FileUtil; -import com.pollex.pam.service.util.StringUtils; - -@Service -public class ConsultantDTOMapper { - - @Autowired - ApplicationProperties applicationProperty; - - public void copyToConsultant(ConsultantEditDTO source, Consultant target) { - BeanUtils.copyProperties(source, target); - target.setPhotoPath(FileUtil.toPath(source.getPhotoFileName(), applicationProperty.getFileFolderPath())); - String expertise = StringUtils.convertToString(source.getExpertise(), ","); - target.setExpertise(expertise); - target.setAward(source.getAwards()); - target.setExperience(source.getExperiences()); - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java deleted file mode 100644 index a04507a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.pollex.pam.service.mapper; - -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.service.dto.ConsultantDTO; -import com.pollex.pam.service.dto.ConsultantDetailDTO; -import com.pollex.pam.service.dto.CustomerFavoriteConsultantDTO; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -public class ConsultantMapper { - - private static final Character SPLIT_MASK = ','; - - public CustomerFavoriteConsultantDTO toCustomerFavoriteConsultantDto(Consultant source) { - CustomerFavoriteConsultantDTO consultantDTO = new CustomerFavoriteConsultantDTO(); - consultantDTO.setAgentNo(source.getAgentNo()); - consultantDTO.setName(source.getName()); - consultantDTO.setAvgScore(source.getAvgScore()); - consultantDTO.setSeniority(source.getSeniorityDTOString()); - consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); - consultantDTO.setImg(source.getPhotoPath()); - consultantDTO.setRole(source.getRole()); - - consultantDTO.setContactStatus(null); - consultantDTO.setUpdateTime(null); - - return consultantDTO; - } - - public ConsultantDTO toDto(Consultant source) { - ConsultantDTO consultantDTO = new ConsultantDTO(); - consultantDTO.setAgentNo(source.getAgentNo()); - consultantDTO.setName(source.getName()); - consultantDTO.setAvgScore(source.getAvgScore()); - consultantDTO.setSeniority(source.getSeniorityDTOString()); - consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); - consultantDTO.setImg(source.getPhotoPath()); - consultantDTO.setRole(source.getRole()); - - consultantDTO.setSuitability(0); - consultantDTO.setContactStatus(null); - consultantDTO.setUpdateTime(null); -// consultantDTO.setLatestAppointmentId(null); - - return consultantDTO; - } - - public ConsultantDetailDTO toDetailDto(Consultant source) { - ConsultantDetailDTO consultantDetailDTO = new ConsultantDetailDTO(); - BeanUtils.copyProperties(source, consultantDetailDTO); - consultantDetailDTO.setName(source.getName()); - consultantDetailDTO.setAgentNo(source.getAgentNo()); - consultantDetailDTO.setRole(source.getRole()); - consultantDetailDTO.setAvgScore(source.getAvgScore()); - consultantDetailDTO.setTitle(source.getTitle()); - consultantDetailDTO.setPhoneNumber(source.getPhoneNumber()); - consultantDetailDTO.setServeArea(source.getServeArea()); - consultantDetailDTO.setCompanyAddress(source.getCompanyAddress()); - consultantDetailDTO.setSeniority(source.getSeniorityDTOString()); - consultantDetailDTO.setConcept(source.getConcept()); - consultantDetailDTO.setAwards(source.getAward()); - consultantDetailDTO.setImg(source.getPhotoPath()); - consultantDetailDTO.setExpertise(splitStringWithChar(source.getExpertise())); - consultantDetailDTO.setExperiences(source.getExperience()); - - // todo ��蝣箄�垣閰W漲銵函 - consultantDetailDTO.setEvaluation(50); - - return consultantDetailDTO; - } - - private List<String> splitStringWithChar(String source) { - return Arrays.stream(StringUtils.split(source, SPLIT_MASK)) - .map(String::trim) - .collect(Collectors.toList()); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerDTOMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerDTOMapper.java deleted file mode 100644 index 326eac2..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerDTOMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pollex.pam.service.mapper; - -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Customer; -import com.pollex.pam.service.dto.CustomerRegisterDTO; - -@Service -public class CustomerDTOMapper { - - public Customer toCustomer(CustomerRegisterDTO source) { - Customer target = new Customer(); - BeanUtils.copyProperties(source, target); - return target; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerMapper.java deleted file mode 100644 index 757d8c9..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/CustomerMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pollex.pam.service.mapper; - -import com.pollex.pam.domain.Customer; -import com.pollex.pam.service.dto.CustomerDTO; -import org.springframework.stereotype.Service; - -@Service -public class CustomerMapper { - - public CustomerDTO toDto(Customer customer) { - CustomerDTO dto = new CustomerDTO(); - dto.setEmail(customer.getEmail()); - dto.setPhone(customer.getPhone()); - dto.setName(customer.getName()); - - return dto; - } - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/InterviewRecordMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/InterviewRecordMapper.java deleted file mode 100644 index d611c2f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/InterviewRecordMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pollex.pam.service.mapper; - -import static java.util.stream.Collectors.toList; - -import java.util.List; - -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.InterviewRecord; -import com.pollex.pam.service.dto.InterviewRecordDTO; - -@Service -public class InterviewRecordMapper { - - public InterviewRecord toInterviewRecord(InterviewRecordDTO source) { - InterviewRecord target = new InterviewRecord(); - BeanUtils.copyProperties(source, target); - return target; - } - - public void copyToInterviewRecord(InterviewRecordDTO source, InterviewRecord target) { - BeanUtils.copyProperties(source, target); - } - - public List<InterviewRecordDTO> toInterviewRecordDTO(List<InterviewRecord> records) { - return records.stream() - .map(s-> toInterviewRecordDTO(s)) - .collect(toList()); - } - - public InterviewRecordDTO toInterviewRecordDTO(InterviewRecord source) { - InterviewRecordDTO target = new InterviewRecordDTO(); - BeanUtils.copyProperties(source, target); - return target; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionDTOMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionDTOMapper.java deleted file mode 100644 index fe1eaa2..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionDTOMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pollex.pam.service.mapper; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.enums.SatisfactionStatusEnum; -// import com.pollex.pam.service.dto.SatisfactionCustomerScoreDTO; - -@Service -public class SatisfactionDTOMapper { - - @Autowired - AppointmentMapper appointmentMapper; - -// public Satisfaction toSatisfaction(SatisfactionCustomerScoreDTO source) { -// Satisfaction satisfaction = appointmentMapper.toAppointmentSatisfaction(source.getAppointmentId()); -// satisfaction.setScore(source.getScore()); -// if(satisfaction.getScore()!=null) { -// satisfaction.setStatus(SatisfactionStatusEnum.FILLED); -// }else { -// satisfaction.setStatus(SatisfactionStatusEnum.UNFILLED); -// } -// return satisfaction; -// } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionMapper.java deleted file mode 100644 index 8a757a4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/SatisfactionMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.pollex.pam.service.mapper; - -import static java.util.stream.Collectors.toList; - -import java.util.List; -import java.util.Objects; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.repository.ConsultantRepository; -import com.pollex.pam.repository.CustomerRepository; -import com.pollex.pam.service.dto.SatisfactionDTO; - -@Service -public class SatisfactionMapper { - - @Autowired - ConsultantRepository consultantRepository; - - @Autowired - CustomerRepository customerRepository; - - public SatisfactionDTO toDTO(Satisfaction source) { - SatisfactionDTO target = new SatisfactionDTO(); - BeanUtils.copyProperties(source, target); - target.setScore(source.getScore()); - Consultant consultant= consultantRepository.findOneByAgentNo(source.getAgentNo()).orElse(null); - target.setAgentName(Objects.isNull(consultant) ? null : consultant.getName()); - Customer customer = customerRepository.findById(source.getCustomerId()).get(); - target.setCustomerName(customer.getName()); - return target; - } - - public List<SatisfactionDTO> toDTO(List<Satisfaction> satisfactionList) { - if(satisfactionList==null) return null; - return satisfactionList.stream() - .map(s -> toDTO(s)) - .collect(toList()); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/UserMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/UserMapper.java deleted file mode 100644 index a5ccf3f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/UserMapper.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.pollex.pam.service.mapper; - -import com.pollex.pam.domain.Authority; -import com.pollex.pam.domain.User; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.dto.UserDTO; -import java.util.*; -import java.util.stream.Collectors; -import org.mapstruct.BeanMapping; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.springframework.stereotype.Service; - -/** - * Mapper for the entity {@link User} and its DTO called {@link UserDTO}. - * - * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct - * support is still in beta, and requires a manual step with an IDE. - */ -@Service -public class UserMapper { - - public List<UserDTO> usersToUserDTOs(List<User> users) { - return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList()); - } - - public UserDTO userToUserDTO(User user) { - return new UserDTO(user); - } - - public List<AdminUserDTO> usersToAdminUserDTOs(List<User> users) { - return users.stream().filter(Objects::nonNull).map(this::userToAdminUserDTO).collect(Collectors.toList()); - } - - public AdminUserDTO userToAdminUserDTO(User user) { - return new AdminUserDTO(user); - } - - public List<User> userDTOsToUsers(List<AdminUserDTO> userDTOs) { - return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList()); - } - - public User userDTOToUser(AdminUserDTO userDTO) { - if (userDTO == null) { - return null; - } else { - User user = new User(); - user.setId(userDTO.getId()); - user.setLogin(userDTO.getLogin()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - user.setEmail(userDTO.getEmail()); - user.setImageUrl(userDTO.getImageUrl()); - user.setActivated(userDTO.isActivated()); - user.setLangKey(userDTO.getLangKey()); - Set<Authority> authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); - user.setAuthorities(authorities); - return user; - } - } - - private Set<Authority> authoritiesFromStrings(Set<String> authoritiesAsString) { - Set<Authority> authorities = new HashSet<>(); - - if (authoritiesAsString != null) { - authorities = - authoritiesAsString - .stream() - .map(string -> { - Authority auth = new Authority(); - auth.setName(string); - return auth; - }) - .collect(Collectors.toSet()); - } - - return authorities; - } - - public User userFromId(Long id) { - if (id == null) { - return null; - } - User user = new User(); - user.setId(id); - return user; - } - - @Named("id") - @BeanMapping(ignoreByDefault = true) - @Mapping(target = "id", source = "id") - public UserDTO toDtoId(User user) { - if (user == null) { - return null; - } - UserDTO userDto = new UserDTO(); - userDto.setId(user.getId()); - return userDto; - } - - @Named("idSet") - @BeanMapping(ignoreByDefault = true) - @Mapping(target = "id", source = "id") - public Set<UserDTO> toDtoIdSet(Set<User> users) { - if (users == null) { - return Collections.emptySet(); - } - - Set<UserDTO> userSet = new HashSet<>(); - for (User userEntity : users) { - userSet.add(this.toDtoId(userEntity)); - } - - return userSet; - } - - @Named("login") - @BeanMapping(ignoreByDefault = true) - @Mapping(target = "id", source = "id") - @Mapping(target = "login", source = "login") - public UserDTO toDtoLogin(User user) { - if (user == null) { - return null; - } - UserDTO userDto = new UserDTO(); - userDto.setId(user.getId()); - userDto.setLogin(user.getLogin()); - return userDto; - } - - @Named("loginSet") - @BeanMapping(ignoreByDefault = true) - @Mapping(target = "id", source = "id") - @Mapping(target = "login", source = "login") - public Set<UserDTO> toDtoLoginSet(Set<User> users) { - if (users == null) { - return Collections.emptySet(); - } - - Set<UserDTO> userSet = new HashSet<>(); - for (User userEntity : users) { - userSet.add(this.toDtoLogin(userEntity)); - } - - return userSet; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/package-info.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/package-info.java deleted file mode 100644 index b91e8ed..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * MapStruct mappers for mapping domain objects and Data Transfer Objects. - */ -package com.pollex.pam.service.mapper; diff --git a/pamapi/src/main/java/com/pollex/pam/service/package-info.java b/pamapi/src/main/java/com/pollex/pam/service/package-info.java deleted file mode 100644 index ee1f6cf..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Service layer beans. - */ -package com.pollex.pam.service; diff --git a/pamapi/src/main/java/com/pollex/pam/service/util/FileUtil.java b/pamapi/src/main/java/com/pollex/pam/service/util/FileUtil.java deleted file mode 100644 index dcfdff7..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/util/FileUtil.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.pollex.pam.service.util; - - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Base64; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FileUtil { - - private static final Logger log = LoggerFactory.getLogger(FileUtil.class); - - public static File base64ToFile(String base64, String fileName, String folderPath) { - if(base64 == null){ - return new File(folderPath); - } - File dir=new File(folderPath); - dir.setWritable(true); - dir.setReadable(true); - if (!dir.exists() && !dir.isDirectory()) { - dir.mkdirs(); - } - return base64ToFile(base64, toPath(fileName, folderPath)); - } - - public static File base64ToFile(String base64, String path) { - if(base64 == null){ - return new File(path); - } - - BufferedOutputStream bos = null; - - try { - byte[] bytes = Base64.getDecoder().decode(base64); - File file=new File(path); - file.setWritable(true); - file.setReadable(true); - bos = new BufferedOutputStream(new FileOutputStream(file)); - bos.write(bytes); - - - return file; - } catch (Exception e) { - log.error("upload file base64 to file error",e); - } finally { - if (bos != null) { - try { - bos.close(); - } catch (IOException e) { - log.error("upload file base64 to file error",e); - } - } - } - - return null; - } - - public static boolean isFileExisted(String fileName, String folderPath) { - return new File(toPath(fileName, folderPath)).isFile(); - } - - public static String toPath(String fileName, String folderPath) { - return folderPath + "/" + fileName; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java b/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java deleted file mode 100644 index 48cc43b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.pollex.pam.service.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.*; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.web.client.RestTemplate; - -import javax.net.ssl.SSLContext; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.X509Certificate; -import java.util.Map; -import java.util.Set; - -public final class HttpRequestUtil { - private static final Logger log = LoggerFactory.getLogger(HttpRequestUtil.class); - - private HttpRequestUtil() {} - - public static <T> ResponseEntity<T> getWithJson(String url, Class<T> responseType) - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException - { - return getWithJson(url, responseType, null); - } - - public static <T> ResponseEntity<T> getWithJson(String url, Class<T> responseType, Map<String, String> addedHeaders) - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException - { - RestTemplate restTemplate = getTrustAllRestTemplate(); - HttpHeaders headers = new HttpHeaders(); - setHeaders(headers, addedHeaders); - - HttpEntity<String> httpEntity = new HttpEntity<>(headers); - - log.debug("HttpRequestUtil get url: {}", url); - log.debug("httpEntity = {}", httpEntity); - return restTemplate.exchange(url, HttpMethod.GET, httpEntity, responseType); - } - - public static ResponseEntity<String> postWithJson(String url, Object jsonData, Map<String, String> headers) - throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException - { - return postWithJson(url, jsonData, String.class, headers); - } - - public static ResponseEntity<String> postWithJson(String url, Object jsonData) - throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException - { - return postWithJson(url, jsonData, String.class, null); - } - - public static <T> ResponseEntity<T> postWithJson(String url, Object jsonData, Class<T> responseType) - throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException - { - return postWithJson(url, jsonData, responseType, null); - } - - public static <T> ResponseEntity<T> postWithJson(String url, Object jsonData, Class<T> responseType, Map<String, String> addedHeaders) - throws JsonProcessingException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - - String parameters = new ObjectMapper().writeValueAsString(jsonData); - // ���摨阡��脰��log���� - if(parameters.length() < 1000){ - log.debug("parameters : {}",parameters); - } - - RestTemplate restTemplate = getTrustAllRestTemplate(); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - setHeaders(headers, addedHeaders); - - HttpEntity<String> entity = new HttpEntity<>(parameters, headers); - - log.debug("rest post with json, url = {}", url); - return restTemplate.exchange(url, HttpMethod.POST, entity, responseType); - } - - private static void setHeaders(HttpHeaders headers, Map<String, String> addedHeaders) { - if(addedHeaders != null && addedHeaders.size() > 0) { - Set<String> keys = addedHeaders.keySet(); - for (String key : keys) { - String headerValue = addedHeaders.get(key); - headers.set(key, headerValue); - log.info("http cust header key: {}", key); - log.info("http cust header headerValue: {}", headerValue); - } - } - } - - private static RestTemplate getTrustAllRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - SSLContext sslContext = SSLContexts.custom() - .loadTrustMaterial(null, (X509Certificate[] x509Certs, String s) -> true) - .build(); - SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); - CloseableHttpClient httpClient = HttpClients.custom() - .setSSLSocketFactory(csf) - .build(); - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); - requestFactory.setHttpClient(httpClient); - requestFactory.setConnectTimeout(300000); - requestFactory.setReadTimeout(300000); - return new RestTemplate(requestFactory); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/util/StringUtils.java b/pamapi/src/main/java/com/pollex/pam/service/util/StringUtils.java deleted file mode 100644 index fd2350a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/util/StringUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pollex.pam.service.util; - -import java.util.List; - -public class StringUtils { - - public static String convertToString(List<String> source - , String separator) { - StringBuilder result = new StringBuilder(); - for (String sourceString : source) { - result.append(sourceString+separator); - } - result.deleteCharAt(result.length()-1); - return result.toString(); - } - - -} diff --git a/pamapi/src/main/java/com/pollex/pam/service/util/VerifyCodeUtil.java b/pamapi/src/main/java/com/pollex/pam/service/util/VerifyCodeUtil.java deleted file mode 100644 index e42af0b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/service/util/VerifyCodeUtil.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.pollex.pam.service.util; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.util.Random; - -public final class VerifyCodeUtil { - - - public static String createcode() { - String code = ""; - code = ""; - String randomRange = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";// Randomly generated character - // range (0-9, a-z, A-Z) - - // The number of digits for generating the verification code (here 4 digits) - for (int i = 0; i < 4; i++) { - int index = (int) (Math.random() * 62);// Will produce a [0,62) number, excluding decimals - char randomCode = randomRange.charAt(index); - code = code + randomCode; - } - return code; - } - - // 3. Generate pictures - public static BufferedImage createimage(String code) { - // The first 2 parameters are: width, height. The back is the image type - // Create a BufferedImage object without transparent color, TYPE_INT_ARGB is - // with transparent color - BufferedImage bi = new BufferedImage(130, 50, BufferedImage.TYPE_INT_RGB); - - // 1. Get a canvas - Graphics g = bi.getGraphics(); - // 2. Add background color - g.setColor(Color.WHITE); - g.fillRect(0, 0, 130, 50); - - // 3. Add interference lines - for (int i = 0; i < 10; i++) { - Random r = new Random(); - int red = r.nextInt(256); - int green = r.nextInt(256); - int blue = r.nextInt(256); - Color c = new Color(red, green, blue); - g.setColor(c); - int x1 = r.nextInt(131); - int y1 = r.nextInt(51); - int x2 = r.nextInt(131); - int y2 = r.nextInt(51); - g.drawLine(x1, y1, x2, y2);// Draw a line - // g.drawOval(x1, y1, x2, y2);//Draw a curve - } - - // 3. Add text - g.setColor(Color.BLACK); - g.setFont(new Font(" ", Font.BOLD, 40)); - - // 4. Fill the text into the artboard - g.drawString(code, 15, 40); - - // 5. Close the canvas - g.dispose(); - return bi; - } - -} \ No newline at end of file diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/AccountResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/AccountResource.java index a4a87ae..a808fcd 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/AccountResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/AccountResource.java @@ -1,20 +1,16 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.security.jwt.JWTFilter; -import com.pollex.pam.service.CustomerAuthService; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.security.SecurityUtils; import com.pollex.pam.service.CustomerService; -import com.pollex.pam.service.MailService; -import com.pollex.pam.service.UserService; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.dto.CustomerRegisterDTO; -import com.pollex.pam.service.dto.PasswordChangeDTO; -import com.pollex.pam.web.rest.UserJWTController.JWTToken; -import com.pollex.pam.web.rest.errors.*; -import com.pollex.pam.web.rest.vm.KeyAndPasswordVM; -import com.pollex.pam.web.rest.vm.ManagedUserVM; +import com.pollex.pam.business.service.MailService; +import com.pollex.pam.business.service.UserService; +import com.pollex.pam.business.service.dto.AdminUserDTO; +import com.pollex.pam.business.service.dto.PasswordChangeDTO; +import com.pollex.pam.business.web.errors.*; +import com.pollex.pam.business.web.vm.KeyAndPasswordVM; +import com.pollex.pam.business.web.vm.ManagedUserVM; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @@ -22,9 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; /** @@ -48,7 +41,7 @@ private final UserService userService; private final MailService mailService; - + @Autowired CustomerService customerService; @@ -75,8 +68,8 @@ // User user = userService.registerUser(managedUserVM, managedUserVM.getPassword()); // mailService.sendActivationEmail(user); // } - - + + /** * {@code GET /activate} : activate the registered user. diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentMemoResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentMemoResource.java index c7a6afa..5b5ff0f 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentMemoResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentMemoResource.java @@ -10,36 +10,35 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.domain.AppointmentMemo; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.AppointmentMemoService; -import com.pollex.pam.service.dto.AppointmentMemoCreateDTO; -import com.pollex.pam.service.dto.AppointmentMemoUpdateDTO; +import com.pollex.pam.business.domain.AppointmentMemo; +import com.pollex.pam.business.service.AppointmentMemoService; +import com.pollex.pam.business.service.dto.AppointmentMemoCreateDTO; +import com.pollex.pam.business.service.dto.AppointmentMemoUpdateDTO; @RestController @RequestMapping("/api/appointment/memo") public class AppointmentMemoResource { - + @Autowired AppointmentMemoService appointmentMemoService; - + @PostMapping("/create") public ResponseEntity<AppointmentMemo> createMemo(@RequestBody AppointmentMemoCreateDTO memoDTO) { appointmentMemoService.checkPermission(memoDTO.getAppointmentId()); AppointmentMemo memo = appointmentMemoService.create(memoDTO); return new ResponseEntity<>(memo, HttpStatus.OK); } - + @PostMapping("/update") public ResponseEntity<AppointmentMemo> updateMemo(@RequestBody AppointmentMemoUpdateDTO memoDTO) { AppointmentMemo memo = appointmentMemoService.update(memoDTO); return new ResponseEntity<>(memo, HttpStatus.OK); } - + @DeleteMapping("/{memoId}") public void deleteMemo(@PathVariable Long memoId) { appointmentMemoService.delete(memoId); } - - + + } diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java index 6a8e6b7..5164e6a 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java @@ -1,20 +1,24 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.appointment.process.AppointmentProcess; -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.SendMsgService; -import com.pollex.pam.service.dto.*; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingType; +import com.pollex.pam.business.appointment.process.AppointmentProcess; +import com.pollex.pam.business.domain.Appointment; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.SendMsgService; -import com.pollex.pam.service.mapper.AppointmentMapper; +import com.pollex.pam.business.service.dto.*; +import com.pollex.pam.business.service.mapper.AppointmentMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.PersonalNotificationService; -import com.pollex.pam.service.SatisfactionService; +import com.pollex.pam.business.service.AppointmentService; +import com.pollex.pam.business.service.PersonalNotificationService; +import com.pollex.pam.business.service.SatisfactionService; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.*; @RestController @RequestMapping("/api/appointment") @@ -38,6 +42,7 @@ @Autowired PersonalNotificationService personalNotificationService; + @AuditLoggingInject(type = CUSTOMER_EDIT_APPOINTMENT) @PutMapping("") public ResponseEntity<Void> updateAppointment(@RequestBody AppointmentUpdateDTO dto) { Appointment appointment = appointmentService.updateAppointment(dto); @@ -45,12 +50,14 @@ return ResponseEntity.noContent().build(); } + @AuditLoggingInject(type = AuditLoggingType.CUSTOMER_CANCEL_APPOINTMENT) @DeleteMapping("/{appointmentId}") public ResponseEntity<Void> markAppointmentDeleted(@PathVariable Long appointmentId) { appointmentService.markAppointmentDeleted(appointmentId); return ResponseEntity.noContent().build(); } + @AuditLoggingInject(type = AuditLoggingType.CUSTOMER_CREATE_APPOINTMENT) @PostMapping("/customer/create") public AppointmentDTO clientCreateAppointment(@RequestBody AppointmentCreateDTO appointmentCreateDTO) { Appointment appointment = appointmentService.customerCreateAppointment(appointmentCreateDTO); @@ -66,17 +73,20 @@ return appointmentService.getAppointmentDetail(appointmentId); } + @AuditLoggingInject(type = CHECK_APPOINTMENT) @GetMapping("/getDetail/{appointmentId}") public AppointmentCustomerViewDTO getAppointmentDetail(@PathVariable Long appointmentId) { return appointmentService.getAppointmentDetail(appointmentId); } + @AuditLoggingInject(type = CONSULTANT_READ_APPOINTMENT) @PostMapping("/recordRead/{appointmentId}") public ResponseEntity<Void> recordConsultantReadAppointment(@PathVariable Long appointmentId) { appointmentService.recordConsultantReadTime(appointmentId); return ResponseEntity.noContent().build(); } + @AuditLoggingInject(type = APPOINTMENT_CLOSE) @PostMapping("/close") public ResponseEntity<Void> closeAppointment(@RequestBody AppointmentCloseDTO closeDTO) { appointmentService.closeAppointment(closeDTO); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantLoginValidateResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantLoginValidateResource.java index 47b4ffc..c47276d 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantLoginValidateResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantLoginValidateResource.java @@ -16,12 +16,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.service.util.VerifyCodeUtil; +import com.pollex.pam.business.service.util.VerifyCodeUtil; @RestController @RequestMapping("/api/login/validate") public class ConsultantLoginValidateResource { - + @GetMapping("/get_img_code") public void getVerifyCodeImg(HttpServletResponse response, HttpServletRequest request) { try { @@ -52,11 +52,11 @@ || !StringUtils.hasText(imgCode)) { return false; } - + if (imgCode.equals(sessionImpCode)) { return true; } - + return false; } } diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java index 3af2eaf..5a3cc86 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java @@ -1,27 +1,25 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.ConsultantService; -import com.pollex.pam.service.dto.*; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; +import com.pollex.pam.business.domain.Appointment; +import com.pollex.pam.business.domain.Consultant; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.AppointmentService; +import com.pollex.pam.business.service.ConsultantService; +import com.pollex.pam.business.service.dto.*; import org.apache.commons.compress.utils.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.List; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.CONSULTANT_SEND_FILL_SATISFACTION_NOTICE; +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.EDIT_CONSULTANT_DATA; @RestController @RequestMapping("/api/consultant") @@ -29,7 +27,7 @@ @Autowired ConsultantService consultantService; - + @Autowired AppointmentService appointmentService; @@ -102,8 +100,8 @@ }else { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - - + + } @PostMapping("/record/allAppointmentsView") @@ -111,7 +109,8 @@ consultantService.recordAllAppointmentsView(); return ResponseEntity.noContent().build(); } - + + @AuditLoggingInject(type = EDIT_CONSULTANT_DATA) @PostMapping("/edit") public ResponseEntity<Consultant> editConsultant(@RequestBody ConsultantEditDTO editDTO) { if(!editDTO.getAgentNo().equals(SecurityUtils.getAgentNo())) { @@ -120,7 +119,8 @@ Consultant editResult = consultantService.editConsultant(editDTO); return new ResponseEntity<>(editResult, HttpStatus.OK); } - + + @AuditLoggingInject(type = CONSULTANT_SEND_FILL_SATISFACTION_NOTICE) @PostMapping("/sendSatisfactionToClient/{appointmentId}") public ResponseEntity<Void> sendSatisfactionToClient(@PathVariable Long appointmentId) { Appointment appointment = appointmentService.findById(appointmentId); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/CustomerInfoResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/CustomerInfoResource.java index df6d70b..c02f1d5 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/CustomerInfoResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/CustomerInfoResource.java @@ -1,13 +1,16 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; import com.pollex.pam.service.CustomerService; -import com.pollex.pam.service.dto.CustomerDTO; +import com.pollex.pam.business.service.dto.CustomerDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.EDIT_CUSTOMER_DATA; @RestController @RequestMapping("/api/customer/info") @@ -21,6 +24,7 @@ return new ResponseEntity<>(customerService.getLoggedCustomerDTO(), HttpStatus.OK); } + @AuditLoggingInject(type = EDIT_CUSTOMER_DATA) @PutMapping("") public ResponseEntity<Void> updateLoggedCustomerInfo(@RequestBody CustomerDTO customerDTO) { boolean hasEmail = StringUtils.hasText(customerDTO.getEmail()); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/EServiceResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/EServiceResource.java index 840b8c9..06a1eab 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/EServiceResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/EServiceResource.java @@ -1,9 +1,11 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; +import com.pollex.pam.business.service.ConsultantService; import com.pollex.pam.security.jwt.JWTFilter; import com.pollex.pam.security.jwt.TokenProvider; -import com.pollex.pam.security.token.EServiceAuthenticationToken; -import com.pollex.pam.web.rest.vm.EServiceLoginVM; +import com.pollex.pam.business.security.token.EServiceAuthenticationToken; +import com.pollex.pam.business.web.vm.EServiceLoginVM; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.CONSULTANT_LOGIN; + @RestController @RequestMapping("/api/eService") public class EServiceResource { @@ -26,6 +30,10 @@ @Autowired TokenProvider tokenProvider; + @Autowired + ConsultantService consultantService; + + @AuditLoggingInject(type = CONSULTANT_LOGIN) @PostMapping("/authenticate") public ResponseEntity<UserJWTController.JWTToken> authorize(@RequestBody EServiceLoginVM eServiceLoginVM) { EServiceAuthenticationToken authenticationToken = new EServiceAuthenticationToken( @@ -34,7 +42,9 @@ ); Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + consultantService.updateLoginTime(eServiceLoginVM.getUsername()); SecurityContextHolder.getContext().setAuthentication(authenticationToken); + String jwt = tokenProvider.createToken(authentication, false); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer" + jwt); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/InterviewRecordResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/InterviewRecordResource.java index 730c020..1aaf45c 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/InterviewRecordResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/InterviewRecordResource.java @@ -1,5 +1,6 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -8,27 +9,30 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.domain.InterviewRecord; -import com.pollex.pam.service.InterviewRecordService; -import com.pollex.pam.service.dto.InterviewRecordDTO; +import com.pollex.pam.business.domain.InterviewRecord; +import com.pollex.pam.business.service.InterviewRecordService; +import com.pollex.pam.business.service.dto.InterviewRecordDTO; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.CONSULTANT_CREATE_INTERVIEW; @RestController @RequestMapping("/api/interview_record") public class InterviewRecordResource { - + @Autowired InterviewRecordService interviewRecordService; - + + @AuditLoggingInject(type = CONSULTANT_CREATE_INTERVIEW) @PostMapping("/create") public InterviewRecord create(@RequestBody InterviewRecordDTO dto) { return interviewRecordService.create(dto); } - + @PostMapping("/update") public InterviewRecord update(@RequestBody InterviewRecordDTO dto) { return interviewRecordService.update(dto); } - + @DeleteMapping("/{interviewRecordId}") public void delete(@PathVariable Long interviewRecordId) { interviewRecordService.delete(interviewRecordId); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/NoticeResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/NoticeResource.java index f1bde12..1661af0 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/NoticeResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/NoticeResource.java @@ -1,29 +1,31 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.domain.Appointment; -import com.pollex.pam.domain.AppointmentNoticeLog; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.NoticeService; -import com.pollex.pam.service.dto.AppointmentNoticeSendDTO; +import com.pollex.pam.business.domain.Appointment; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.AppointmentService; +import com.pollex.pam.business.service.NoticeService; +import com.pollex.pam.business.service.dto.AppointmentNoticeSendDTO; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.CONSULTANT_SEND_INTERVIEW_NOTICE; @RestController @RequestMapping("/api/notice") public class NoticeResource { - + @Autowired NoticeService noticeService; - + @Autowired AppointmentService appointmentService; - + + @AuditLoggingInject(type = CONSULTANT_SEND_INTERVIEW_NOTICE) @PostMapping("/send") public void sendNotice(@RequestBody AppointmentNoticeSendDTO dto) { Appointment appointment = appointmentService.findById(dto.getAppointmentId()); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java index 883c80a..3cad8c3 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.UUID; -import com.pollex.pam.web.rest.errors.CustomerNotRegisteredException; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,20 +17,22 @@ import org.springframework.web.bind.annotation.RestController; import com.pollex.pam.config.ApplicationProperties; -import com.pollex.pam.domain.Customer; -import com.pollex.pam.enums.OtpLoginTypeEnum; -import com.pollex.pam.repository.CustomerRepository; +import com.pollex.pam.business.domain.Customer; +import com.pollex.pam.business.enums.OtpLoginTypeEnum; +import com.pollex.pam.business.repository.CustomerRepository; import com.pollex.pam.security.jwt.JWTFilter; import com.pollex.pam.security.jwt.TokenProvider; import com.pollex.pam.service.CustomerAuthService; import com.pollex.pam.service.CustomerService; -import com.pollex.pam.service.OtpTmpService; +import com.pollex.pam.business.service.OtpTmpService; import com.pollex.pam.service.OtpUtilService; import com.pollex.pam.service.OtpWebService; -import com.pollex.pam.service.dto.CustomerRegisterDTO; -import com.pollex.pam.service.dto.OtpResponseDTO; -import com.pollex.pam.web.rest.vm.OtpLoginVM; -import com.pollex.pam.web.rest.vm.VerifyOtpVM; +import com.pollex.pam.business.service.dto.CustomerRegisterDTO; +import com.pollex.pam.business.service.dto.OtpResponseDTO; +import com.pollex.pam.business.web.vm.OtpLoginVM; +import com.pollex.pam.business.web.vm.VerifyOtpVM; + +import static com.pollex.pam.business.aop.logging.audit.AuditLoggingType.CUSTOMER_LOGIN; @RestController @RequestMapping("/api/otp") @@ -82,6 +84,7 @@ return new ResponseEntity<>(otpResponse, HttpStatus.OK); } + @AuditLoggingInject(type = CUSTOMER_LOGIN) @PostMapping("/verify") public ResponseEntity<UserJWTController.JWTToken> verifyOtp(@RequestBody VerifyOtpVM verifyOtpParam) { otpUtilService.verifyOtp(verifyOtpParam); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/PersonalNotificationResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/PersonalNotificationResource.java index ee805b5..9d2b05f 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/PersonalNotificationResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/PersonalNotificationResource.java @@ -8,34 +8,31 @@ import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.domain.Consultant; -import com.pollex.pam.domain.PersonalNotification; -import com.pollex.pam.enums.NotificationTypeEnum; -import com.pollex.pam.enums.PersonalNotificationRoleEnum; -import com.pollex.pam.repository.PersonalNotificationRepository; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.ConsultantService; -import com.pollex.pam.service.PersonalNotificationService; +import com.pollex.pam.business.domain.Consultant; +import com.pollex.pam.business.domain.PersonalNotification; +import com.pollex.pam.business.enums.PersonalNotificationRoleEnum; +import com.pollex.pam.business.repository.PersonalNotificationRepository; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.ConsultantService; +import com.pollex.pam.business.service.PersonalNotificationService; @RestController @RequestMapping("/api/personal_notification") public class PersonalNotificationResource { - + @Autowired PersonalNotificationService personalNotificationService; - + @Autowired PersonalNotificationRepository personalNotificationRepository; - + @Autowired ConsultantService consultantService; - + @GetMapping("/getMyPersonalNotification") public ResponseEntity<List<PersonalNotification>> getMyPersonalNotification() { List<PersonalNotification> personalNotificationList = new ArrayList<>(); @@ -47,7 +44,7 @@ } return new ResponseEntity<>(personalNotificationList, HttpStatus.OK); } - + @PostMapping("/readAllMyNotification") public void readAll() { personalNotificationService.readAllMyNotification(); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/PublicUserResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/PublicUserResource.java index 2b07888..be59f4d 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/PublicUserResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/PublicUserResource.java @@ -1,7 +1,7 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.service.UserService; -import com.pollex.pam.service.dto.UserDTO; +import com.pollex.pam.business.service.UserService; +import com.pollex.pam.business.service.dto.UserDTO; import java.util.*; import java.util.Collections; import org.slf4j.Logger; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/SatisfactionResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/SatisfactionResource.java index 92baf43..d1af1d5 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/SatisfactionResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/SatisfactionResource.java @@ -2,7 +2,9 @@ import java.util.List; -import com.pollex.pam.enums.SatisfactionTypeEnum; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingInject; +import com.pollex.pam.business.aop.logging.audit.AuditLoggingType; +import com.pollex.pam.business.enums.SatisfactionTypeEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,11 +15,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.pollex.pam.domain.Satisfaction; -import com.pollex.pam.security.SecurityUtils; -import com.pollex.pam.service.SatisfactionService; -import com.pollex.pam.service.dto.SatisfactionCustomerScoreDTO; -import com.pollex.pam.service.dto.SatisfactionDTO; +import com.pollex.pam.business.domain.Satisfaction; +import com.pollex.pam.business.security.SecurityUtils; +import com.pollex.pam.business.service.SatisfactionService; +import com.pollex.pam.business.service.dto.SatisfactionCustomerScoreDTO; +import com.pollex.pam.business.service.dto.SatisfactionDTO; @RestController @RequestMapping("/api/satisfaction") @@ -29,12 +31,14 @@ @Autowired SatisfactionService satisfactionService; + @AuditLoggingInject(type = AuditLoggingType.CUSTOMER_FILL_SATISFACTION) @PostMapping("/score") public Satisfaction scorefaction(@RequestBody SatisfactionCustomerScoreDTO scoreDTO) { return satisfactionService.scorefaction(scoreDTO); } - @PostMapping("/score/all") + @AuditLoggingInject(type = AuditLoggingType.CUSTOMER_FILL_SATISFACTION) + @PostMapping("/score/all") public List<Satisfaction> scoreAllfaction(@RequestBody List<SatisfactionCustomerScoreDTO> scoreDTO) { return satisfactionService.scoreAllfaction(scoreDTO); } diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java index 947b621..8c12c37 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java @@ -2,10 +2,9 @@ import com.pollex.pam.config.ApplicationProperties; import com.pollex.pam.security.jwt.TokenProvider; -import com.pollex.pam.service.LoginRecordService; import com.pollex.pam.service.OtpWebService; -import com.pollex.pam.service.dto.EServiceResponse; -import com.pollex.pam.service.dto.OtpResponseDTO; +import com.pollex.pam.business.service.dto.EServiceResponse; +import com.pollex.pam.business.service.dto.OtpResponseDTO; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; @@ -41,9 +40,6 @@ public class TestLoginResource { private final static Logger log = LoggerFactory.getLogger(TestLoginResource.class); - - @Autowired - LoginRecordService loginRecordService; @Autowired ApplicationProperties applicationProperty; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java index 8920b48..f001429 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java @@ -1,12 +1,11 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.service.AppointmentService; -import com.pollex.pam.service.SendMsgService; -import com.pollex.pam.service.dto.SendSMSResponse; +import com.pollex.pam.business.service.AppointmentService; +import com.pollex.pam.business.service.SendMsgService; +import com.pollex.pam.business.service.dto.SendSMSResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.thymeleaf.context.Context; import org.thymeleaf.spring5.SpringTemplateEngine; @Deprecated diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/UserJWTController.java b/pamapi/src/main/java/com/pollex/pam/web/rest/UserJWTController.java index 4848e08..90c0be8 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/UserJWTController.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/UserJWTController.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.pollex.pam.security.jwt.JWTFilter; import com.pollex.pam.security.jwt.TokenProvider; -import com.pollex.pam.web.rest.vm.LoginVM; +import com.pollex.pam.business.web.vm.LoginVM; import javax.validation.Valid; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/UserResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/UserResource.java index f7b7e17..6c1217b 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/UserResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/UserResource.java @@ -1,15 +1,15 @@ package com.pollex.pam.web.rest; -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.AuthoritiesConstants; -import com.pollex.pam.service.MailService; -import com.pollex.pam.service.UserService; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.web.rest.errors.BadRequestAlertException; -import com.pollex.pam.web.rest.errors.EmailAlreadyUsedException; -import com.pollex.pam.web.rest.errors.LoginAlreadyUsedException; +import com.pollex.pam.business.config.Constants; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.security.AuthoritiesConstants; +import com.pollex.pam.business.service.MailService; +import com.pollex.pam.business.service.UserService; +import com.pollex.pam.business.service.dto.AdminUserDTO; +import com.pollex.pam.business.web.errors.BadRequestAlertException; +import com.pollex.pam.business.web.errors.EmailAlreadyUsedException; +import com.pollex.pam.business.web.errors.LoginAlreadyUsedException; import java.net.URI; import java.net.URISyntaxException; import java.util.*; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentClosedInfoNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentClosedInfoNotFoundException.java deleted file mode 100644 index e1e00c8..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentClosedInfoNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Appointment close info not found") -public class AppointmentClosedInfoNotFoundException extends RuntimeException{ - - /** - * - */ - private static final long serialVersionUID = 1L; -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentMemoNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentMemoNotFoundException.java deleted file mode 100644 index b02f14e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentMemoNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Appointment memo not found") -public class AppointmentMemoNotFoundException extends RuntimeException{ - - /** - * - */ - private static final long serialVersionUID = 1L; -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentNotFoundException.java deleted file mode 100644 index be2eb8b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/AppointmentNotFoundException.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Appointment not found") -public class AppointmentNotFoundException extends RuntimeException{ - -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/BadRequestAlertException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/BadRequestAlertException.java deleted file mode 100644 index 5818e55..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/BadRequestAlertException.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -public class BadRequestAlertException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - private final String entityName; - - private final String errorKey; - - public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { - this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); - } - - public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { - super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); - this.entityName = entityName; - this.errorKey = errorKey; - } - - public String getEntityName() { - return entityName; - } - - public String getErrorKey() { - return errorKey; - } - - private static Map<String, Object> getAlertParameters(String entityName, String errorKey) { - Map<String, Object> parameters = new HashMap<>(); - parameters.put("message", "error." + errorKey); - parameters.put("params", entityName); - return parameters; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ConsultantNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ConsultantNotFoundException.java deleted file mode 100644 index 517d418..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ConsultantNotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Consultant not found") -public class ConsultantNotFoundException extends RuntimeException{ -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/CustomerNotRegisteredException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/CustomerNotRegisteredException.java deleted file mode 100644 index 89acfc0..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/CustomerNotRegisteredException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "CustomerNotRegistered") -public class CustomerNotRegisteredException extends RuntimeException{ -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EServiceErrorException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EServiceErrorException.java deleted file mode 100644 index ceef292..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EServiceErrorException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.UNAUTHORIZED) -public class EServiceErrorException extends RuntimeException{ - public EServiceErrorException(String message) { - super(message); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EmailAlreadyUsedException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EmailAlreadyUsedException.java deleted file mode 100644 index 8d05d20..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/EmailAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -public class EmailAlreadyUsedException extends BadRequestAlertException { - - private static final long serialVersionUID = 1L; - - public EmailAlreadyUsedException() { - super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ErrorConstants.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ErrorConstants.java deleted file mode 100644 index 49e421c..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ErrorConstants.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import java.net.URI; - -public final class ErrorConstants { - - public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; - public static final String ERR_VALIDATION = "error.validation"; - public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; - public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); - public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); - public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); - public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); - public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); - - private ErrorConstants() {} -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ExceptionTranslator.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ExceptionTranslator.java index e59e428..5c00cba 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ExceptionTranslator.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/ExceptionTranslator.java @@ -9,6 +9,9 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; + +import com.pollex.pam.business.service.UsernameAlreadyUsedException; +import com.pollex.pam.business.web.errors.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; @@ -117,7 +120,7 @@ @ExceptionHandler public ResponseEntity<Problem> handleEmailAlreadyUsedException( - com.pollex.pam.service.EmailAlreadyUsedException ex, + com.pollex.pam.business.service.EmailAlreadyUsedException ex, NativeWebRequest request ) { EmailAlreadyUsedException problem = new EmailAlreadyUsedException(); @@ -130,7 +133,7 @@ @ExceptionHandler public ResponseEntity<Problem> handleUsernameAlreadyUsedException( - com.pollex.pam.service.UsernameAlreadyUsedException ex, + UsernameAlreadyUsedException ex, NativeWebRequest request ) { LoginAlreadyUsedException problem = new LoginAlreadyUsedException(); @@ -143,7 +146,7 @@ @ExceptionHandler public ResponseEntity<Problem> handleInvalidPasswordException( - com.pollex.pam.service.InvalidPasswordException ex, + com.pollex.pam.business.service.InvalidPasswordException ex, NativeWebRequest request ) { return create(new InvalidPasswordException(), request); diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/FieldErrorVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/FieldErrorVM.java deleted file mode 100644 index 4028995..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/FieldErrorVM.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import java.io.Serializable; - -public class FieldErrorVM implements Serializable { - - private static final long serialVersionUID = 1L; - - private final String objectName; - - private final String field; - - private final String message; - - public FieldErrorVM(String dto, String field, String message) { - this.objectName = dto; - this.field = field; - this.message = message; - } - - public String getObjectName() { - return objectName; - } - - public String getField() { - return field; - } - - public String getMessage() { - return message; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InterviewRecordNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InterviewRecordNotFoundException.java deleted file mode 100644 index c3a426d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InterviewRecordNotFoundException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "InterviewRecord not found") -public class InterviewRecordNotFoundException extends RuntimeException{ - - /** - * - */ - private static final long serialVersionUID = 1L; - -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InvalidPasswordException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InvalidPasswordException.java deleted file mode 100644 index dd3812f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/InvalidPasswordException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -public class InvalidPasswordException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - public InvalidPasswordException() { - super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/LoginAlreadyUsedException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/LoginAlreadyUsedException.java deleted file mode 100644 index aab2f9a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/LoginAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -public class LoginAlreadyUsedException extends BadRequestAlertException { - - private static final long serialVersionUID = 1L; - - public LoginAlreadyUsedException() { - super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists"); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotFoundExpiringAppointmentException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotFoundExpiringAppointmentException.java deleted file mode 100644 index a2a02f0..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotFoundExpiringAppointmentException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "not found any expiring appointment") -public class NotFoundExpiringAppointmentException extends RuntimeException { -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotLoginException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotLoginException.java deleted file mode 100644 index 233f1b4..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotLoginException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.UNAUTHORIZED, reason = "Security Context error authentication") -public class NotLoginException extends RuntimeException{ -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/OtpLoginFailException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/OtpLoginFailException.java deleted file mode 100644 index 65ff04f..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/OtpLoginFailException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.UNAUTHORIZED) -public class OtpLoginFailException extends RuntimeException{ - public OtpLoginFailException(String message) { - super(message); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionAlreadyExistException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionAlreadyExistException.java deleted file mode 100644 index 013590a..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionAlreadyExistException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "Satisfaction already exist") -public class SatisfactionAlreadyExistException extends RuntimeException{ - - /** - * - */ - private static final long serialVersionUID = 1L; -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionNotFoundException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionNotFoundException.java deleted file mode 100644 index e504c34..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SatisfactionNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Satisfaction not found") -public class SatisfactionNotFoundException extends RuntimeException{ - - /** - * - */ - private static final long serialVersionUID = 1L; -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendEmailFailException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendEmailFailException.java deleted file mode 100644 index b43324b..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendEmailFailException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "send email failed") -public class SendEmailFailException extends RuntimeException { - public SendEmailFailException() {} - public SendEmailFailException(String message) { - super(message); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java deleted file mode 100644 index 0b721ab..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "send sms failed") -public class SendSMSFailException extends RuntimeException{ - public SendSMSFailException(){} - public SendSMSFailException(String message) { - super(message); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/package-info.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/package-info.java deleted file mode 100644 index b010ea3..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Specific errors used with Zalando's "problem-spring-web" library. - * - * More information on https://github.com/zalando/problem-spring-web - */ -package com.pollex.pam.web.rest.errors; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/EServiceLoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/EServiceLoginVM.java deleted file mode 100644 index 2cebe8e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/EServiceLoginVM.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -public class EServiceLoginVM { - private String username; - private String password; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/KeyAndPasswordVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/KeyAndPasswordVM.java deleted file mode 100644 index 7bb8309..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/KeyAndPasswordVM.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -/** - * View Model object for storing the user's key and password. - */ -public class KeyAndPasswordVM { - - private String key; - - private String newPassword; - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getNewPassword() { - return newPassword; - } - - public void setNewPassword(String newPassword) { - this.newPassword = newPassword; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/LoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/LoginVM.java deleted file mode 100644 index 97efc36..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/LoginVM.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * View Model object for storing a user's credentials. - */ -public class LoginVM { - - @NotNull - @Size(min = 1, max = 50) - private String username; - - @NotNull - @Size(min = 4, max = 100) - private String password; - - private boolean rememberMe; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean isRememberMe() { - return rememberMe; - } - - public void setRememberMe(boolean rememberMe) { - this.rememberMe = rememberMe; - } - - // prettier-ignore - @Override - public String toString() { - return "LoginVM{" + - "username='" + username + '\'' + - ", rememberMe=" + rememberMe + - '}'; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/ManagedUserVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/ManagedUserVM.java deleted file mode 100644 index 74605b5..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/ManagedUserVM.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -import com.pollex.pam.service.dto.AdminUserDTO; -import javax.validation.constraints.Size; - -/** - * View Model extending the AdminUserDTO, which is meant to be used in the user management UI. - */ -public class ManagedUserVM extends AdminUserDTO { - - public static final int PASSWORD_MIN_LENGTH = 4; - - public static final int PASSWORD_MAX_LENGTH = 100; - - @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH) - private String password; - - public ManagedUserVM() { - // Empty constructor needed for Jackson. - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - // prettier-ignore - @Override - public String toString() { - return "ManagedUserVM{" + super.toString() + "} "; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpAccount.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpAccount.java deleted file mode 100644 index e64bdca..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpAccount.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -import java.util.Optional; - -import org.apache.http.util.Asserts; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -import com.pollex.pam.domain.Customer; - -public class OtpAccount { - private String account; - private String indexKey; - - public OtpAccount(String account, String indexKey) { - this.account = account; - this.indexKey = indexKey; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getIndexKey() { - return indexKey; - } - - public void setIndexKey(String indexKey) { - this.indexKey = indexKey; - } - - public static OtpAccount createOtpAccount(Customer customerAcct, String indexKey) { - String acct = customerAcct.toAccountString(); - - Assert.hasText(acct, "Customer phone or email must not null"); - - return new OtpAccount(acct, indexKey); - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpEmailLoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpEmailLoginVM.java deleted file mode 100644 index c7a4ef6..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpEmailLoginVM.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -public class OtpEmailLoginVM { - private String email; - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java deleted file mode 100644 index e376624..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpLoginVM.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -import com.pollex.pam.enums.OtpLoginTypeEnum; - -public class OtpLoginVM { - private OtpLoginTypeEnum loginType; - private String account; - - public OtpLoginTypeEnum getLoginType() { - return loginType; - } - - public void setLoginType(OtpLoginTypeEnum loginType) { - this.loginType = loginType; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpSMSLoginVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpSMSLoginVM.java deleted file mode 100644 index 830ba8d..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/OtpSMSLoginVM.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -public class OtpSMSLoginVM { - private String phone; - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/VerifyOtpVM.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/VerifyOtpVM.java deleted file mode 100644 index 8465eee..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/VerifyOtpVM.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pollex.pam.web.rest.vm; - -public class VerifyOtpVM { - private String account; - private String indexKey; - private String otpCode; - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getIndexKey() { - return indexKey; - } - - public void setIndexKey(String indexKey) { - this.indexKey = indexKey; - } - - public String getOtpCode() { - return otpCode; - } - - public void setOtpCode(String otpCode) { - this.otpCode = otpCode; - } -} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/package-info.java b/pamapi/src/main/java/com/pollex/pam/web/rest/vm/package-info.java deleted file mode 100644 index 2a5048e..0000000 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/vm/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * View Models used by Spring MVC REST controllers. - */ -package com.pollex.pam.web.rest.vm; diff --git a/pamapi/src/main/resources/config/application-dev.yml b/pamapi/src/main/resources/config/application-dev.yml index e612913..9ceb7e1 100644 --- a/pamapi/src/main/resources/config/application-dev.yml +++ b/pamapi/src/main/resources/config/application-dev.yml @@ -125,7 +125,7 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos - front-end-domain: http://localhost:3000 + front-end-domain: 'http://localhost:3000/#' sms: send-notify-msg: false url: https://localhost:8081/testSMS diff --git a/pamapi/src/main/resources/config/application-pollex.yml b/pamapi/src/main/resources/config/application-pollex.yml index e6a2ae8..b05f912 100644 --- a/pamapi/src/main/resources/config/application-pollex.yml +++ b/pamapi/src/main/resources/config/application-pollex.yml @@ -123,7 +123,7 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos - front-end-domain: http://dev.pollex.com.tw:5566/pam + front-end-domain: 'http://dev.pollex.com.tw:5566/pam/#' sms: send-notify-msg: false url: https://localhost:8081/testSMS diff --git a/pamapi/src/main/resources/config/application-prod.yml b/pamapi/src/main/resources/config/application-prod.yml index f4185f4..8059119 100644 --- a/pamapi/src/main/resources/config/application-prod.yml +++ b/pamapi/src/main/resources/config/application-prod.yml @@ -131,6 +131,7 @@ # https://www.jhipster.tech/common-application-properties/ # =================================================================== +# PROD�憓�Ⅱ隤� application: mock-login: false otp-web-service-url: https://vtwlifeopensysuat.pru.intranet.asia/pcalife-otp/ws/otpWebService?wsdl @@ -139,7 +140,7 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos - front-end-domain: https://vtwlifeopensysuat.pru.intranet.asia/pam + front-end-domain: 'https://onlineuat.pcalife.com.tw/pam/#' sms: send-notify-msg: true url: https://vtwlifeopensysuat.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource diff --git a/pamapi/src/main/resources/config/application-sit.yml b/pamapi/src/main/resources/config/application-sit.yml index 6f0da19..2333d7c 100644 --- a/pamapi/src/main/resources/config/application-sit.yml +++ b/pamapi/src/main/resources/config/application-sit.yml @@ -117,7 +117,7 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos - front-end-domain: https://vtwlifeopensyssit.pru.intranet.asia/pam + front-end-domain: 'https://vtwlifeopensyssit.pru.intranet.asia/pam/#' sms: send-notify-msg: true url: https://vtwlifeopensysuat.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource diff --git a/pamapi/src/main/resources/config/application-uat.yml b/pamapi/src/main/resources/config/application-uat.yml index e97aa15..2921536 100644 --- a/pamapi/src/main/resources/config/application-uat.yml +++ b/pamapi/src/main/resources/config/application-uat.yml @@ -117,7 +117,7 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos - front-end-domain: https://vtwlifeopensysuat.pru.intranet.asia/pam + front-end-domain: 'https://onlineuat.pcalife.com.tw/pam/#' sms: send-notify-msg: true url: https://vtwlifeopensysuat.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource diff --git a/pamapi/src/main/resources/i18n/messages.properties b/pamapi/src/main/resources/i18n/messages.properties index 8f0b474..e20d485 100644 --- a/pamapi/src/main/resources/i18n/messages.properties +++ b/pamapi/src/main/resources/i18n/messages.properties @@ -24,7 +24,7 @@ email.write.satisfaction.content={0}\u9867\u554F\u8ACB\u60A8\u586B\u5BEB\u4FDD\u8AA0\u5A92\u5408\u5E73\u53F0\u7684\u6EFF\u610F\u5EA6\u8A55\u6BD4{1} # appointment pending notify email -email.write.appointment.pending.content=\u60a8\u6709{0}\u5247\u9810\u7d04\u55ae\u672a\u9032\u884c\u806f\u7e6b\uff0c\u8acb\u76e1\u901f\u8655\u7406 +email.write.appointment.pending.content=\u60a8\u6709{0}\u5247\u9810\u7d04\u55ae\u672a\u9032\u884c\u806f\u7e6b\uff0c\u8acb\u76e1\u901f\u8655\u7406\uff0c\u9ede\u64ca\u7db2\u5740\uff1a{1} # appointment expiring notify email email.write.appointment.expiring.content=\u5f88\u62b1\u6b49\uff01\u60a8\u9810\u7d04{0}\u9867\u554f\u6b63\u5fd9\u788c\u4e2d\uff0c\u8acb\u60a8\u53d6\u6d88\u9810\u7d04\u4e26\u6539\u9078\u5176\u4ed6\u9867\u554f\uff0c\u8acb\u9ede\u64ca\u7db2\u5740\uff1a{1} diff --git a/pamapi/src/main/resources/i18n/messages_zh_TW.properties b/pamapi/src/main/resources/i18n/messages_zh_TW.properties index f53d7c1..e460549 100644 --- a/pamapi/src/main/resources/i18n/messages_zh_TW.properties +++ b/pamapi/src/main/resources/i18n/messages_zh_TW.properties @@ -24,7 +24,7 @@ email.write.satisfaction.content={0}\u9867\u554F\u8ACB\u60A8\u586B\u5BEB\u4FDD\u8AA0\u5A92\u5408\u5E73\u53F0\u7684\u6EFF\u610F\u5EA6\u8A55\u6BD4{1} # appointment pending notify email -email.write.appointment.pending.content=\u60a8\u6709{0}\u5247\u9810\u7d04\u55ae\u672a\u9032\u884c\u806f\u7e6b\uff0c\u8acb\u76e1\u901f\u8655\u7406 +email.write.appointment.pending.content=\u60a8\u6709{0}\u5247\u9810\u7d04\u55ae\u672a\u9032\u884c\u806f\u7e6b\uff0c\u8acb\u76e1\u901f\u8655\u7406\uff0c\u9ede\u64ca\u7db2\u5740\uff1a{1} # appointment expiring notify email email.write.appointment.expiring.content=\u5f88\u62b1\u6b49\uff01\u60a8\u9810\u7d04{0}\u9867\u554f\u6b63\u5fd9\u788c\u4e2d\uff0c\u8acb\u60a8\u53d6\u6d88\u9810\u7d04\u4e26\u6539\u9078\u5176\u4ed6\u9867\u554f\uff0c\u8acb\u9ede\u64ca\u7db2\u5740\uff1a{1} diff --git a/pamapi/src/main/resources/templates/mail/appointmentPendingNotifyEmail.html b/pamapi/src/main/resources/templates/mail/appointmentPendingNotifyEmail.html index 29902c7..4e3ba74 100644 --- a/pamapi/src/main/resources/templates/mail/appointmentPendingNotifyEmail.html +++ b/pamapi/src/main/resources/templates/mail/appointmentPendingNotifyEmail.html @@ -5,7 +5,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> -<p th:text="#{email.write.appointment.pending.content(${pendingAppointmentSum})}">���������脰�蝜恬������</p> +<p th:text="#{email.write.appointment.pending.content(${pendingAppointmentSum}, ${notifyUrl})}">���������脰�蝜恬��������雯��嚗�</p> </body> </html> diff --git a/pamapi/src/test/java/com/pollex/pam/ArchTest.java b/pamapi/src/test/java/com/pollex/pam/ArchTest.java index d98c800..47e6326 100644 --- a/pamapi/src/test/java/com/pollex/pam/ArchTest.java +++ b/pamapi/src/test/java/com/pollex/pam/ArchTest.java @@ -17,9 +17,9 @@ noClasses() .that() - .resideInAnyPackage("com.pollex.pam.service..") + .resideInAnyPackage("com.pollex.pam.business.service..") .or() - .resideInAnyPackage("com.pollex.pam.repository..") + .resideInAnyPackage("com.pollex.pam.business.repository..") .should() .dependOnClassesThat() .resideInAnyPackage("..com.pollex.pam.web..") diff --git a/pamapi/src/test/java/com/pollex/pam/config/NoOpMailConfiguration.java b/pamapi/src/test/java/com/pollex/pam/config/NoOpMailConfiguration.java index cd88e1d..4a556b2 100644 --- a/pamapi/src/test/java/com/pollex/pam/config/NoOpMailConfiguration.java +++ b/pamapi/src/test/java/com/pollex/pam/config/NoOpMailConfiguration.java @@ -4,7 +4,7 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; -import com.pollex.pam.service.MailService; +import com.pollex.pam.business.service.MailService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/pamapi/src/test/java/com/pollex/pam/config/timezone/HibernateTimeZoneIT.java b/pamapi/src/test/java/com/pollex/pam/config/timezone/HibernateTimeZoneIT.java deleted file mode 100644 index f0db7f2..0000000 --- a/pamapi/src/test/java/com/pollex/pam/config/timezone/HibernateTimeZoneIT.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.pollex.pam.config.timezone; - -import static java.lang.String.format; -import static org.assertj.core.api.Assertions.assertThat; - -import com.pollex.pam.IntegrationTest; -import com.pollex.pam.repository.timezone.DateTimeWrapper; -import com.pollex.pam.repository.timezone.DateTimeWrapperRepository; -import java.time.*; -import java.time.format.DateTimeFormatter; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.transaction.annotation.Transactional; - -/** - * Integration tests for the ZoneId Hibernate configuration. - */ -@IntegrationTest -class HibernateTimeZoneIT { - - @Autowired - private DateTimeWrapperRepository dateTimeWrapperRepository; - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}") - private String zoneId; - - private DateTimeWrapper dateTimeWrapper; - private DateTimeFormatter dateTimeFormatter; - private DateTimeFormatter timeFormatter; - private DateTimeFormatter dateFormatter; - - @BeforeEach - public void setup() { - dateTimeWrapper = new DateTimeWrapper(); - dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); - dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); - dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); - dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); - dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); - dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); - dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); - - dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId)); - - timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId)); - - dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - } - - @Test - @Transactional - void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("instant", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getLocalTime() - .atDate(LocalDate.of(1970, Month.JANUARY, 1)) - .atZone(ZoneId.systemDefault()) - .format(timeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getOffsetTime() - .toLocalTime() - .atDate(LocalDate.of(1970, Month.JANUARY, 1)) - .atZone(ZoneId.systemDefault()) - .format(timeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - private String generateSqlRequest(String fieldName, long id) { - return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); - } - - private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { - while (sqlRowSet.next()) { - String dbValue = sqlRowSet.getString(1); - - assertThat(dbValue).isNotNull(); - assertThat(dbValue).isEqualTo(expectedValue); - } - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapper.java b/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapper.java deleted file mode 100644 index a6a6684..0000000 --- a/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapper.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.pollex.pam.repository.timezone; - -import java.io.Serializable; -import java.time.*; -import java.util.Objects; -import javax.persistence.*; - -@Entity -@Table(name = "jhi_date_time_wrapper") -public class DateTimeWrapper implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator") - private Long id; - - @Column(name = "instant") - private Instant instant; - - @Column(name = "local_date_time") - private LocalDateTime localDateTime; - - @Column(name = "offset_date_time") - private OffsetDateTime offsetDateTime; - - @Column(name = "zoned_date_time") - private ZonedDateTime zonedDateTime; - - @Column(name = "local_time") - private LocalTime localTime; - - @Column(name = "offset_time") - private OffsetTime offsetTime; - - @Column(name = "local_date") - private LocalDate localDate; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Instant getInstant() { - return instant; - } - - public void setInstant(Instant instant) { - this.instant = instant; - } - - public LocalDateTime getLocalDateTime() { - return localDateTime; - } - - public void setLocalDateTime(LocalDateTime localDateTime) { - this.localDateTime = localDateTime; - } - - public OffsetDateTime getOffsetDateTime() { - return offsetDateTime; - } - - public void setOffsetDateTime(OffsetDateTime offsetDateTime) { - this.offsetDateTime = offsetDateTime; - } - - public ZonedDateTime getZonedDateTime() { - return zonedDateTime; - } - - public void setZonedDateTime(ZonedDateTime zonedDateTime) { - this.zonedDateTime = zonedDateTime; - } - - public LocalTime getLocalTime() { - return localTime; - } - - public void setLocalTime(LocalTime localTime) { - this.localTime = localTime; - } - - public OffsetTime getOffsetTime() { - return offsetTime; - } - - public void setOffsetTime(OffsetTime offsetTime) { - this.offsetTime = offsetTime; - } - - public LocalDate getLocalDate() { - return localDate; - } - - public void setLocalDate(LocalDate localDate) { - this.localDate = localDate; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o; - return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - // prettier-ignore - @Override - public String toString() { - return "TimeZoneTest{" + - "id=" + id + - ", instant=" + instant + - ", localDateTime=" + localDateTime + - ", offsetDateTime=" + offsetDateTime + - ", zonedDateTime=" + zonedDateTime + - '}'; - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapperRepository.java b/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapperRepository.java deleted file mode 100644 index 2907925..0000000 --- a/pamapi/src/test/java/com/pollex/pam/repository/timezone/DateTimeWrapperRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pollex.pam.repository.timezone; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Spring Data JPA repository for the {@link DateTimeWrapper} entity. - */ -@Repository -public interface DateTimeWrapperRepository extends JpaRepository<DateTimeWrapper, Long> {} diff --git a/pamapi/src/test/java/com/pollex/pam/security/DomainUserDetailsServiceIT.java b/pamapi/src/test/java/com/pollex/pam/security/DomainUserDetailsServiceIT.java deleted file mode 100644 index bba00aa..0000000 --- a/pamapi/src/test/java/com/pollex/pam/security/DomainUserDetailsServiceIT.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.pollex.pam.security; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; - -import com.pollex.pam.IntegrationTest; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import java.util.Locale; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.transaction.annotation.Transactional; - -/** - * Integrations tests for {@link DomainUserDetailsService}. - */ -@Transactional -@IntegrationTest -class DomainUserDetailsServiceIT { - - private static final String USER_ONE_LOGIN = "test-user-one"; - private static final String USER_ONE_EMAIL = "test-user-one@localhost"; - private static final String USER_TWO_LOGIN = "test-user-two"; - private static final String USER_TWO_EMAIL = "test-user-two@localhost"; - private static final String USER_THREE_LOGIN = "test-user-three"; - private static final String USER_THREE_EMAIL = "test-user-three@localhost"; - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserDetailsService domainUserDetailsService; - - @BeforeEach - public void init() { - User userOne = new User(); - userOne.setLogin(USER_ONE_LOGIN); - userOne.setPassword(RandomStringUtils.random(60)); - userOne.setActivated(true); - userOne.setEmail(USER_ONE_EMAIL); - userOne.setFirstName("userOne"); - userOne.setLastName("doe"); - userOne.setLangKey("en"); - userRepository.save(userOne); - - User userTwo = new User(); - userTwo.setLogin(USER_TWO_LOGIN); - userTwo.setPassword(RandomStringUtils.random(60)); - userTwo.setActivated(true); - userTwo.setEmail(USER_TWO_EMAIL); - userTwo.setFirstName("userTwo"); - userTwo.setLastName("doe"); - userTwo.setLangKey("en"); - userRepository.save(userTwo); - - User userThree = new User(); - userThree.setLogin(USER_THREE_LOGIN); - userThree.setPassword(RandomStringUtils.random(60)); - userThree.setActivated(false); - userThree.setEmail(USER_THREE_EMAIL); - userThree.setFirstName("userThree"); - userThree.setLastName("doe"); - userThree.setLangKey("en"); - userRepository.save(userThree); - } - - @Test - void assertThatUserCanBeFoundByLogin() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test - void assertThatUserCanBeFoundByLoginIgnoreCase() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test - void assertThatUserCanBeFoundByEmail() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); - } - - @Test - void assertThatUserCanBeFoundByEmailIgnoreCase() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH)); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); - } - - @Test - void assertThatEmailIsPrioritizedOverLogin() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test - void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { - assertThatExceptionOfType(UserNotActivatedException.class) - .isThrownBy(() -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/security/SecurityUtilsUnitTest.java b/pamapi/src/test/java/com/pollex/pam/security/SecurityUtilsUnitTest.java deleted file mode 100644 index 202c393..0000000 --- a/pamapi/src/test/java/com/pollex/pam/security/SecurityUtilsUnitTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.pollex.pam.security; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; - -/** - * Test class for the {@link SecurityUtils} utility class. - */ -class SecurityUtilsUnitTest { - - @BeforeEach - @AfterEach - void cleanup() { - SecurityContextHolder.clearContext(); - } - - @Test - void testGetCurrentUserLogin() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); - SecurityContextHolder.setContext(securityContext); - Optional<String> login = SecurityUtils.getCurrentUserLogin(); - assertThat(login).contains("admin"); - } - - @Test - void testGetCurrentUserJWT() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token")); - SecurityContextHolder.setContext(securityContext); - Optional<String> jwt = SecurityUtils.getCurrentUserJWT(); - assertThat(jwt).contains("token"); - } - - @Test - void testIsAuthenticated() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); - SecurityContextHolder.setContext(securityContext); - boolean isAuthenticated = SecurityUtils.isAuthenticated(); - assertThat(isAuthenticated).isTrue(); - } - - @Test - void testAnonymousIsNotAuthenticated() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection<GrantedAuthority> authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities)); - SecurityContextHolder.setContext(securityContext); - boolean isAuthenticated = SecurityUtils.isAuthenticated(); - assertThat(isAuthenticated).isFalse(); - } - - @Test - void testHasCurrentUserThisAuthority() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection<GrantedAuthority> authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); - SecurityContextHolder.setContext(securityContext); - - assertThat(SecurityUtils.hasCurrentUserThisAuthority(AuthoritiesConstants.USER)).isTrue(); - assertThat(SecurityUtils.hasCurrentUserThisAuthority(AuthoritiesConstants.ADMIN)).isFalse(); - } - - @Test - void testHasCurrentUserAnyOfAuthorities() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection<GrantedAuthority> authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); - SecurityContextHolder.setContext(securityContext); - - assertThat(SecurityUtils.hasCurrentUserAnyOfAuthorities(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN)).isTrue(); - assertThat(SecurityUtils.hasCurrentUserAnyOfAuthorities(AuthoritiesConstants.ANONYMOUS, AuthoritiesConstants.ADMIN)).isFalse(); - } - - @Test - void testHasCurrentUserNoneOfAuthorities() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection<GrantedAuthority> authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); - SecurityContextHolder.setContext(securityContext); - - assertThat(SecurityUtils.hasCurrentUserNoneOfAuthorities(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN)).isFalse(); - assertThat(SecurityUtils.hasCurrentUserNoneOfAuthorities(AuthoritiesConstants.ANONYMOUS, AuthoritiesConstants.ADMIN)).isTrue(); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/security/jwt/JWTFilterTest.java b/pamapi/src/test/java/com/pollex/pam/security/jwt/JWTFilterTest.java deleted file mode 100644 index d459104..0000000 --- a/pamapi/src/test/java/com/pollex/pam/security/jwt/JWTFilterTest.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.pollex.pam.security.jwt; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pollex.pam.security.AuthoritiesConstants; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; -import java.util.Collections; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.http.HttpStatus; -import org.springframework.mock.web.MockFilterChain; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.util.ReflectionTestUtils; -import tech.jhipster.config.JHipsterProperties; - -class JWTFilterTest { - - private TokenProvider tokenProvider; - - private JWTFilter jwtFilter; - - @BeforeEach - public void setup() { - JHipsterProperties jHipsterProperties = new JHipsterProperties(); - String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; - jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); - tokenProvider = new TokenProvider(jHipsterProperties); - ReflectionTestUtils.setField(tokenProvider, "key", Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret))); - - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); - jwtFilter = new JWTFilter(tokenProvider); - SecurityContextHolder.getContext().setAuthentication(null); - } - - @Test - void testJWTFilter() throws Exception { - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - "test-user", - "test-password", - Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) - ); - String jwt = tokenProvider.createToken(authentication, false); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); - assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials()).hasToString(jwt); - } - - @Test - void testJWTFilterInvalidToken() throws Exception { - String jwt = "wrong_jwt"; - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - void testJWTFilterMissingAuthorization() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - void testJWTFilterMissingToken() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - void testJWTFilterWrongScheme() throws Exception { - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - "test-user", - "test-password", - Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) - ); - String jwt = tokenProvider.createToken(authentication, false); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/security/jwt/TokenProviderTest.java b/pamapi/src/test/java/com/pollex/pam/security/jwt/TokenProviderTest.java deleted file mode 100644 index 7dc9027..0000000 --- a/pamapi/src/test/java/com/pollex/pam/security/jwt/TokenProviderTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.pollex.pam.security.jwt; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pollex.pam.security.AuthoritiesConstants; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.util.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.test.util.ReflectionTestUtils; -import tech.jhipster.config.JHipsterProperties; - -class TokenProviderTest { - - private static final long ONE_MINUTE = 60000; - - private Key key; - private TokenProvider tokenProvider; - - @BeforeEach - public void setup() { - JHipsterProperties jHipsterProperties = new JHipsterProperties(); - String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; - jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); - tokenProvider = new TokenProvider(jHipsterProperties); - key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret)); - - ReflectionTestUtils.setField(tokenProvider, "key", key); - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); - } - - @Test - void testReturnFalseWhenJWThasInvalidSignature() { - boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); - - assertThat(isTokenValid).isFalse(); - } - - @Test - void testReturnFalseWhenJWTisMalformed() { - Authentication authentication = createAuthentication(); - String token = tokenProvider.createToken(authentication, false); - String invalidToken = token.substring(1); - boolean isTokenValid = tokenProvider.validateToken(invalidToken); - - assertThat(isTokenValid).isFalse(); - } - - @Test - void testReturnFalseWhenJWTisExpired() { - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); - - Authentication authentication = createAuthentication(); - String token = tokenProvider.createToken(authentication, false); - - boolean isTokenValid = tokenProvider.validateToken(token); - - assertThat(isTokenValid).isFalse(); - } - - @Test - void testReturnFalseWhenJWTisUnsupported() { - String unsupportedToken = createUnsupportedToken(); - - boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); - - assertThat(isTokenValid).isFalse(); - } - - @Test - void testReturnFalseWhenJWTisInvalid() { - boolean isTokenValid = tokenProvider.validateToken(""); - - assertThat(isTokenValid).isFalse(); - } - - @Test - void testKeyIsSetFromSecretWhenSecretIsNotEmpty() { - final String secret = "NwskoUmKHZtzGRKJKVjsJF7BtQMMxNWi"; - JHipsterProperties jHipsterProperties = new JHipsterProperties(); - jHipsterProperties.getSecurity().getAuthentication().getJwt().setSecret(secret); - - TokenProvider tokenProvider = new TokenProvider(jHipsterProperties); - - Key key = (Key) ReflectionTestUtils.getField(tokenProvider, "key"); - assertThat(key).isNotNull().isEqualTo(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8))); - } - - @Test - void testKeyIsSetFromBase64SecretWhenSecretIsEmpty() { - final String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; - JHipsterProperties jHipsterProperties = new JHipsterProperties(); - jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); - - TokenProvider tokenProvider = new TokenProvider(jHipsterProperties); - - Key key = (Key) ReflectionTestUtils.getField(tokenProvider, "key"); - assertThat(key).isNotNull().isEqualTo(Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret))); - } - - private Authentication createAuthentication() { - Collection<GrantedAuthority> authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); - return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); - } - - private String createUnsupportedToken() { - return Jwts.builder().setPayload("payload").signWith(key, SignatureAlgorithm.HS512).compact(); - } - - private String createTokenWithDifferentSignature() { - Key otherKey = Keys.hmacShaKeyFor( - Decoders.BASE64.decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") - ); - - return Jwts - .builder() - .setSubject("anonymous") - .signWith(otherKey, SignatureAlgorithm.HS512) - .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) - .compact(); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/service/MailServiceIT.java b/pamapi/src/test/java/com/pollex/pam/service/MailServiceIT.java deleted file mode 100644 index 1b0b967..0000000 --- a/pamapi/src/test/java/com/pollex/pam/service/MailServiceIT.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.pollex.pam.service; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -import com.pollex.pam.IntegrationTest; -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.User; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.net.URI; -import java.net.URL; -import java.nio.charset.Charset; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.mail.Multipart; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.MessageSource; -import org.springframework.mail.MailSendException; -import org.springframework.mail.javamail.JavaMailSenderImpl; -import org.thymeleaf.spring5.SpringTemplateEngine; -import tech.jhipster.config.JHipsterProperties; - -/** - * Integration tests for {@link MailService}. - */ -@IntegrationTest -class MailServiceIT { - - private static final String[] languages = { - "zh-tw", - "en", - // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array - }; - private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})"); - private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})"); - - @Autowired - private JHipsterProperties jHipsterProperties; - - @Autowired - private MessageSource messageSource; - - @Autowired - private SpringTemplateEngine templateEngine; - - @Spy - private JavaMailSenderImpl javaMailSender; - - @Captor - private ArgumentCaptor<MimeMessage> messageCaptor; - - private MailService mailService; - - @BeforeEach - public void setup() { - MockitoAnnotations.initMocks(this); - doNothing().when(javaMailSender).send(any(MimeMessage.class)); - mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); - } - - @Test - void testSendEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent()).isInstanceOf(String.class); - assertThat(message.getContent()).hasToString("testContent"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); - } - - @Test - void testSendHtmlEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent()).isInstanceOf(String.class); - assertThat(message.getContent()).hasToString("testContent"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testSendMultipartEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - MimeMultipart mp = (MimeMultipart) message.getContent(); - MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); - ByteArrayOutputStream aos = new ByteArrayOutputStream(); - part.writeTo(aos); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent()).isInstanceOf(Multipart.class); - assertThat(aos).hasToString("\r\ntestContent"); - assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); - } - - @Test - void testSendMultipartHtmlEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - MimeMultipart mp = (MimeMultipart) message.getContent(); - MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); - ByteArrayOutputStream aos = new ByteArrayOutputStream(); - part.writeTo(aos); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent()).isInstanceOf(Multipart.class); - assertThat(aos).hasToString("\r\ntestContent"); - assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testSendEmailFromTemplate() throws Exception { - User user = new User(); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - user.setLangKey("en"); - mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("test title"); - assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("<html>test title, http://127.0.0.1:8080, john</html>\n"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testSendActivationEmail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendActivationEmail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testCreationEmail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendCreationEmail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testSendPasswordResetMail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendPasswordResetMail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); - assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - void testSendEmailWithException() { - doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); - try { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); - } catch (Exception e) { - fail("Exception shouldn't have been thrown"); - } - } - - @Test - void testSendLocalizedEmailForAllSupportedLanguages() throws Exception { - User user = new User(); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - for (String langKey : languages) { - user.setLangKey(langKey); - mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); - verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - - String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties"; - URL resource = this.getClass().getClassLoader().getResource(propertyFilePath); - File file = new File(new URI(resource.getFile()).getPath()); - Properties properties = new Properties(); - properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); - - String emailTitle = (String) properties.get("email.test.title"); - assertThat(message.getSubject()).isEqualTo(emailTitle); - assertThat(message.getContent().toString()) - .isEqualToNormalizingNewlines("<html>" + emailTitle + ", http://127.0.0.1:8080, john</html>\n"); - } - } - - /** - * Convert a lang key to the Java locale. - */ - private String getJavaLocale(String langKey) { - String javaLangKey = langKey; - Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey); - if (matcher2.matches()) { - javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase(); - } - Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey); - if (matcher3.matches()) { - javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase(); - } - return javaLangKey; - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/service/UserServiceIT.java b/pamapi/src/test/java/com/pollex/pam/service/UserServiceIT.java deleted file mode 100644 index 9aa8c13..0000000 --- a/pamapi/src/test/java/com/pollex/pam/service/UserServiceIT.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.pollex.pam.service; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -import com.pollex.pam.IntegrationTest; -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.service.dto.AdminUserDTO; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Optional; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.auditing.AuditingHandler; -import org.springframework.data.auditing.DateTimeProvider; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.transaction.annotation.Transactional; -import tech.jhipster.security.RandomUtil; - -/** - * Integration tests for {@link UserService}. - */ -@IntegrationTest -@Transactional -class UserServiceIT { - - private static final String DEFAULT_LOGIN = "johndoe"; - - private static final String DEFAULT_EMAIL = "johndoe@localhost"; - - private static final String DEFAULT_FIRSTNAME = "john"; - - private static final String DEFAULT_LASTNAME = "doe"; - - private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; - - private static final String DEFAULT_LANGKEY = "dummy"; - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserService userService; - - @Autowired - private AuditingHandler auditingHandler; - - @MockBean - private DateTimeProvider dateTimeProvider; - - private User user; - - @BeforeEach - public void init() { - user = new User(); - user.setLogin(DEFAULT_LOGIN); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setEmail(DEFAULT_EMAIL); - user.setFirstName(DEFAULT_FIRSTNAME); - user.setLastName(DEFAULT_LASTNAME); - user.setImageUrl(DEFAULT_IMAGEURL); - user.setLangKey(DEFAULT_LANGKEY); - - when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); - auditingHandler.setDateTimeProvider(dateTimeProvider); - } - - @Test - @Transactional - void assertThatUserMustExistToResetPassword() { - userRepository.saveAndFlush(user); - Optional<User> maybeUser = userService.requestPasswordReset("invalid.login@localhost"); - assertThat(maybeUser).isNotPresent(); - - maybeUser = userService.requestPasswordReset(user.getEmail()); - assertThat(maybeUser).isPresent(); - assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); - assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); - assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); - } - - @Test - @Transactional - void assertThatOnlyActivatedUserCanRequestPasswordReset() { - user.setActivated(false); - userRepository.saveAndFlush(user); - - Optional<User> maybeUser = userService.requestPasswordReset(user.getLogin()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - void assertThatResetKeyMustNotBeOlderThan24Hours() { - Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); - String resetKey = RandomUtil.generateResetKey(); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey(resetKey); - userRepository.saveAndFlush(user); - - Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - void assertThatResetKeyMustBeValid() { - Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey("1234"); - userRepository.saveAndFlush(user); - - Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - void assertThatUserCanResetPassword() { - String oldPassword = user.getPassword(); - Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); - String resetKey = RandomUtil.generateResetKey(); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey(resetKey); - userRepository.saveAndFlush(user); - - Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isPresent(); - assertThat(maybeUser.orElse(null).getResetDate()).isNull(); - assertThat(maybeUser.orElse(null).getResetKey()).isNull(); - assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); - - userRepository.delete(user); - } - - @Test - @Transactional - void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() { - Instant now = Instant.now(); - when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); - user.setActivated(false); - user.setActivationKey(RandomStringUtils.random(20)); - User dbUser = userRepository.saveAndFlush(user); - dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); - userRepository.saveAndFlush(user); - Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); - List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); - assertThat(users).isNotEmpty(); - userService.removeNotActivatedUsers(); - users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); - assertThat(users).isEmpty(); - } - - @Test - @Transactional - void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() { - Instant now = Instant.now(); - when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); - user.setActivated(false); - User dbUser = userRepository.saveAndFlush(user); - dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); - userRepository.saveAndFlush(user); - Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); - List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); - assertThat(users).isEmpty(); - userService.removeNotActivatedUsers(); - Optional<User> maybeDbUser = userRepository.findById(dbUser.getId()); - assertThat(maybeDbUser).contains(dbUser); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/service/mapper/UserMapperTest.java b/pamapi/src/test/java/com/pollex/pam/service/mapper/UserMapperTest.java deleted file mode 100644 index e4514c7..0000000 --- a/pamapi/src/test/java/com/pollex/pam/service/mapper/UserMapperTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.pollex.pam.service.mapper; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pollex.pam.domain.User; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.dto.UserDTO; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -/** - * Unit tests for {@link UserMapper}. - */ -class UserMapperTest { - - private static final String DEFAULT_LOGIN = "johndoe"; - private static final Long DEFAULT_ID = 1L; - - private UserMapper userMapper; - private User user; - private AdminUserDTO userDto; - - @BeforeEach - public void init() { - userMapper = new UserMapper(); - user = new User(); - user.setLogin(DEFAULT_LOGIN); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setEmail("johndoe@localhost"); - user.setFirstName("john"); - user.setLastName("doe"); - user.setImageUrl("image_url"); - user.setLangKey("en"); - - userDto = new AdminUserDTO(user); - } - - @Test - void usersToUserDTOsShouldMapOnlyNonNullUsers() { - List<User> users = new ArrayList<>(); - users.add(user); - users.add(null); - - List<UserDTO> userDTOS = userMapper.usersToUserDTOs(users); - - assertThat(userDTOS).isNotEmpty().size().isEqualTo(1); - } - - @Test - void userDTOsToUsersShouldMapOnlyNonNullUsers() { - List<AdminUserDTO> usersDto = new ArrayList<>(); - usersDto.add(userDto); - usersDto.add(null); - - List<User> users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty().size().isEqualTo(1); - } - - @Test - void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() { - Set<String> authoritiesAsString = new HashSet<>(); - authoritiesAsString.add("ADMIN"); - userDto.setAuthorities(authoritiesAsString); - - List<AdminUserDTO> usersDto = new ArrayList<>(); - usersDto.add(userDto); - - List<User> users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty().size().isEqualTo(1); - assertThat(users.get(0).getAuthorities()).isNotNull(); - assertThat(users.get(0).getAuthorities()).isNotEmpty(); - assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); - } - - @Test - void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { - userDto.setAuthorities(null); - - List<AdminUserDTO> usersDto = new ArrayList<>(); - usersDto.add(userDto); - - List<User> users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty().size().isEqualTo(1); - assertThat(users.get(0).getAuthorities()).isNotNull(); - assertThat(users.get(0).getAuthorities()).isEmpty(); - } - - @Test - void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() { - Set<String> authoritiesAsString = new HashSet<>(); - authoritiesAsString.add("ADMIN"); - userDto.setAuthorities(authoritiesAsString); - - User user = userMapper.userDTOToUser(userDto); - - assertThat(user).isNotNull(); - assertThat(user.getAuthorities()).isNotNull(); - assertThat(user.getAuthorities()).isNotEmpty(); - assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); - } - - @Test - void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { - userDto.setAuthorities(null); - - User user = userMapper.userDTOToUser(userDto); - - assertThat(user).isNotNull(); - assertThat(user.getAuthorities()).isNotNull(); - assertThat(user.getAuthorities()).isEmpty(); - } - - @Test - void userDTOToUserMapWithNullUserShouldReturnNull() { - assertThat(userMapper.userDTOToUser(null)).isNull(); - } - - @Test - void testUserFromId() { - assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); - assertThat(userMapper.userFromId(null)).isNull(); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/AccountResourceIT.java b/pamapi/src/test/java/com/pollex/pam/web/rest/AccountResourceIT.java index 9ff6565..eace069 100644 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/AccountResourceIT.java +++ b/pamapi/src/test/java/com/pollex/pam/web/rest/AccountResourceIT.java @@ -6,17 +6,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import com.pollex.pam.IntegrationTest; -import com.pollex.pam.config.Constants; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.AuthorityRepository; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.AuthoritiesConstants; -import com.pollex.pam.service.UserService; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.dto.PasswordChangeDTO; -import com.pollex.pam.service.dto.UserDTO; -import com.pollex.pam.web.rest.vm.KeyAndPasswordVM; -import com.pollex.pam.web.rest.vm.ManagedUserVM; +import com.pollex.pam.business.config.Constants; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.AuthorityRepository; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.security.AuthoritiesConstants; +import com.pollex.pam.business.service.UserService; +import com.pollex.pam.business.service.dto.AdminUserDTO; +import com.pollex.pam.business.service.dto.PasswordChangeDTO; +import com.pollex.pam.business.web.vm.KeyAndPasswordVM; +import com.pollex.pam.business.web.vm.ManagedUserVM; import java.time.Instant; import java.util.*; import org.apache.commons.lang3.RandomStringUtils; diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/PublicUserResourceIT.java b/pamapi/src/test/java/com/pollex/pam/web/rest/PublicUserResourceIT.java index 72ece3d..092b58b 100644 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/PublicUserResourceIT.java +++ b/pamapi/src/test/java/com/pollex/pam/web/rest/PublicUserResourceIT.java @@ -6,9 +6,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import com.pollex.pam.IntegrationTest; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.AuthoritiesConstants; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.security.AuthoritiesConstants; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/UserJWTControllerIT.java b/pamapi/src/test/java/com/pollex/pam/web/rest/UserJWTControllerIT.java index 094e9ce..1eda30e 100644 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/UserJWTControllerIT.java +++ b/pamapi/src/test/java/com/pollex/pam/web/rest/UserJWTControllerIT.java @@ -10,9 +10,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.pollex.pam.IntegrationTest; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.web.rest.vm.LoginVM; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.web.vm.LoginVM; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/UserResourceIT.java b/pamapi/src/test/java/com/pollex/pam/web/rest/UserResourceIT.java index 9efe6d2..b1357ef 100644 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/UserResourceIT.java +++ b/pamapi/src/test/java/com/pollex/pam/web/rest/UserResourceIT.java @@ -7,13 +7,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import com.pollex.pam.IntegrationTest; -import com.pollex.pam.domain.Authority; -import com.pollex.pam.domain.User; -import com.pollex.pam.repository.UserRepository; -import com.pollex.pam.security.AuthoritiesConstants; -import com.pollex.pam.service.dto.AdminUserDTO; -import com.pollex.pam.service.mapper.UserMapper; -import com.pollex.pam.web.rest.vm.ManagedUserVM; +import com.pollex.pam.business.domain.Authority; +import com.pollex.pam.business.domain.User; +import com.pollex.pam.business.repository.UserRepository; +import com.pollex.pam.business.security.AuthoritiesConstants; +import com.pollex.pam.business.service.dto.AdminUserDTO; +import com.pollex.pam.business.service.mapper.UserMapper; +import com.pollex.pam.business.web.vm.ManagedUserVM; import java.time.Instant; import java.util.*; import java.util.function.Consumer; diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorIT.java b/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorIT.java deleted file mode 100644 index 057057c..0000000 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorIT.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.pollex.pam.IntegrationTest; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; - -/** - * Integration tests {@link ExceptionTranslator} controller advice. - */ -@WithMockUser -@AutoConfigureMockMvc -@IntegrationTest -class ExceptionTranslatorIT { - - @Autowired - private MockMvc mockMvc; - - @Test - void testConcurrencyFailure() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/concurrency-failure")) - .andExpect(status().isConflict()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); - } - - @Test - void testMethodArgumentNotValid() throws Exception { - mockMvc - .perform(post("/api/exception-translator-test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) - .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("test")) - .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) - .andExpect(jsonPath("$.fieldErrors.[0].message").value("must not be null")); - } - - @Test - void testMissingServletRequestPartException() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/missing-servlet-request-part")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")); - } - - @Test - void testMissingServletRequestParameterException() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/missing-servlet-request-parameter")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")); - } - - @Test - void testAccessDenied() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/access-denied")) - .andExpect(status().isForbidden()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.403")) - .andExpect(jsonPath("$.detail").value("test access denied!")); - } - - @Test - void testUnauthorized() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/unauthorized")) - .andExpect(status().isUnauthorized()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.401")) - .andExpect(jsonPath("$.path").value("/api/exception-translator-test/unauthorized")) - .andExpect(jsonPath("$.detail").value("test authentication failed!")); - } - - @Test - void testMethodNotSupported() throws Exception { - mockMvc - .perform(post("/api/exception-translator-test/access-denied")) - .andExpect(status().isMethodNotAllowed()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.405")) - .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); - } - - @Test - void testExceptionWithResponseStatus() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/response-status")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")) - .andExpect(jsonPath("$.title").value("test response status")); - } - - @Test - void testInternalServerError() throws Exception { - mockMvc - .perform(get("/api/exception-translator-test/internal-server-error")) - .andExpect(status().isInternalServerError()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.500")) - .andExpect(jsonPath("$.title").value("Internal Server Error")); - } -} diff --git a/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorTestController.java b/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorTestController.java deleted file mode 100644 index 131a99d..0000000 --- a/pamapi/src/test/java/com/pollex/pam/web/rest/errors/ExceptionTranslatorTestController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pollex.pam.web.rest.errors; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import org.springframework.dao.ConcurrencyFailureException; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/exception-translator-test") -public class ExceptionTranslatorTestController { - - @GetMapping("/concurrency-failure") - public void concurrencyFailure() { - throw new ConcurrencyFailureException("test concurrency failure"); - } - - @PostMapping("/method-argument") - public void methodArgument(@Valid @RequestBody TestDTO testDTO) {} - - @GetMapping("/missing-servlet-request-part") - public void missingServletRequestPartException(@RequestPart String part) {} - - @GetMapping("/missing-servlet-request-parameter") - public void missingServletRequestParameterException(@RequestParam String param) {} - - @GetMapping("/access-denied") - public void accessdenied() { - throw new AccessDeniedException("test access denied!"); - } - - @GetMapping("/unauthorized") - public void unauthorized() { - throw new BadCredentialsException("test authentication failed!"); - } - - @GetMapping("/response-status") - public void exceptionWithResponseStatus() { - throw new TestResponseStatusException(); - } - - @GetMapping("/internal-server-error") - public void internalServerError() { - throw new RuntimeException(); - } - - public static class TestDTO { - - @NotNull - private String test; - - public String getTest() { - return test; - } - - public void setTest(String test) { - this.test = test; - } - } - - @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status") - @SuppressWarnings("serial") - public static class TestResponseStatusException extends RuntimeException {} -} -- Gitblit v1.8.0