· 4 years ago · Feb 09, 2021, 06:32 AM
1package ru.carefy.client.mmt
2
3import khttp.post
4import khttp.responses.Response
5import org.kodein.di.DI
6import org.kodein.di.DIAware
7import ru.carefy.dto.UserMMTDto
8import ru.carefy.dto.user.UserMMTPolicyDto
9import ru.carefy.entity.enum.Sex
10import ru.carefy.utils.Config
11import ru.carefy.utils.Hasher
12import ru.carefy.utils.loggerFor
13import java.text.SimpleDateFormat
14
15class MMTClient(override val di: DI) : DIAware {
16 private val logger = loggerFor<MMTClient>()
17
18 fun add(user: UserMMTDto, productCode: String) {
19 user.mmtPassword = Hasher.getRandomString()
20
21 val body = mapOf(
22 "idpartner" to ID_PARTNER,
23 "product_code" to productCode,
24 "email" to user.email,
25 "phone" to user.phone,
26 "password" to user.mmtPassword,
27 "send_register_email" to 0,
28 "key" to getHash(
29 String.format(
30 "%s%s%s%s%s%s",
31 ID_PARTNER,
32 user.email,
33 user.mmtPassword,
34 user.phone,
35 0,
36 SECRET_KEY
37 )
38 )
39 )
40 logger.debug("TM: $ADD_URL $body")
41
42 val result = post(
43 ADD_URL,
44 data = body
45 )
46 if (result.jsonObject.has("error") || result.jsonObject.has("errors")) {
47 if (result.jsonObject.has("error") && result.jsonObject.getInt("error") in listOf(ERROR_PHONE_ALREADY_EXISTS, ERROR_EMAIL_ALREADY_EXISTS)) {
48 return
49 }
50
51 throw RuntimeException("MMT add error: ${result.jsonObject}")
52 }
53 }
54
55 fun createSession(userMMTPolicyDto: UserMMTPolicyDto): Response {
56 val body = mapOf(
57 "idpartner" to ID_PARTNER,
58 "product_code" to userMMTPolicyDto.telemedProgramCode.code,
59 "phone" to userMMTPolicyDto.user.phone,
60 "key" to getHash(String.format("%s%s%s", ID_PARTNER, userMMTPolicyDto.user.phone, SECRET_KEY))
61 )
62 logger.debug("TM: $CREATE_SESSION_URL $body")
63 return post(CREATE_SESSION_URL, data = body)
64 }
65
66 fun create(userMMTPolicyDto: UserMMTPolicyDto) {
67 val dateStart = SimpleDateFormat("yyyy-MM-dd 00:00:00").format(userMMTPolicyDto.policyStartDate.toDate())
68 val dateFinish = SimpleDateFormat("yyyy-MM-dd 00:00:00").format(userMMTPolicyDto.policyFinishDate.toDate())
69 val genderCode = if (userMMTPolicyDto.user.sex == Sex.MALE) 1 else 0
70 val birthdate = SimpleDateFormat("yyyy-MM-dd").format(userMMTPolicyDto.user.birthDate)
71 val body = mapOf(
72 "idpartner" to ID_PARTNER,
73 "code" to userMMTPolicyDto.policyNumber,
74 "product_code" to userMMTPolicyDto.telemedProgramCode.code,
75 "phone" to userMMTPolicyDto.user.phone,
76 "first_name" to userMMTPolicyDto.user.firstName,
77 "second_name" to userMMTPolicyDto.user.lastName,
78 "gender" to genderCode,
79 "birthdate" to birthdate,
80 "date_start" to dateStart,
81 "date_finish" to dateFinish,
82 "status" to STATUS,
83 "key" to getHash(
84 String.format(
85 "%s%s%s%s%s%s%s%s%s%s%s%s",
86 ID_PARTNER,
87 userMMTPolicyDto.policyNumber,
88 userMMTPolicyDto.user.firstName,
89 userMMTPolicyDto.user.lastName,
90 genderCode,
91 birthdate,
92 userMMTPolicyDto.telemedProgramCode.code,
93 dateStart,
94 dateFinish,
95 STATUS,
96 userMMTPolicyDto.user.phone,
97 SECRET_KEY
98 )
99 )
100 )
101 logger.debug("TM: $CREATE_POLICY_URL $body \n")
102 val result = post(
103 CREATE_POLICY_URL,
104 data = body
105 )
106
107 if (result.jsonObject.has("error") || result.jsonObject.has("errors")) {
108 throw RuntimeException("MMT create policy error: ${result.jsonObject}")
109 }
110 }
111
112 fun detachPolicy(userMMTPolicyDto: UserMMTPolicyDto) {
113 val body = mapOf(
114 "idpartner" to ID_PARTNER,
115 "product_code" to userMMTPolicyDto.telemedProgramCode.code,
116 "email" to userMMTPolicyDto.user.email,
117 "phone" to userMMTPolicyDto.user.phone,
118 "code" to userMMTPolicyDto.policyNumber,
119 "key" to getHash(
120 String.format(
121 "%s%s%s%s%s",
122 ID_PARTNER,
123 userMMTPolicyDto.user.email,
124 userMMTPolicyDto.user.phone,
125 userMMTPolicyDto.policyNumber,
126 SECRET_KEY
127 )
128 )
129 )
130 logger.debug("TM: $DETACH_POLICY_URL $body")
131
132 val result = post(
133 DETACH_POLICY_URL,
134 data = body
135 )
136
137 if (result.jsonObject.has("error") || result.jsonObject.has("errors")) {
138 throw RuntimeException("MMT detach policy error: ${result.jsonObject}")
139 }
140 }
141
142 fun updatePolicy(userMMTPolicyDto: UserMMTPolicyDto) {
143 val dateStart = SimpleDateFormat("yyyy-MM-dd 00:00:00").format(userMMTPolicyDto.policyStartDate.toDate())
144 val dateFinish = SimpleDateFormat("yyyy-MM-dd 00:00:00").format(userMMTPolicyDto.policyFinishDate.toDate())
145 val body = mapOf(
146 "idpartner" to ID_PARTNER,
147 "product_code" to userMMTPolicyDto.telemedProgramCode.code,
148 "code" to userMMTPolicyDto.policyNumber,
149 "date_start" to dateStart,
150 "date_finish" to dateFinish,
151 "status" to 0,
152 "key" to getHash(
153 String.format(
154 "%s%s%s%s%s%s%s",
155 ID_PARTNER,
156 userMMTPolicyDto.policyNumber,
157 userMMTPolicyDto.telemedProgramCode.code,
158 dateStart,
159 dateFinish,
160 0,
161 SECRET_KEY
162 )
163 )
164 )
165 logger.debug("TM: $UPDATE_POLICY_URL $body")
166
167 val result = post(
168 UPDATE_POLICY_URL,
169 data = body
170 )
171
172 if (result.jsonObject.has("error") || result.jsonObject.has("errors")) {
173 throw RuntimeException("MMT update policy error: ${result.jsonObject}")
174 }
175 }
176
177 private fun getHash(toHash: String): String {
178 logger.debug("to hash: $toHash")
179
180 return Hasher.encryptThisString(toHash)
181 }
182
183 companion object {
184 private val HOST: String = Config.instance[Config.mmtHost]
185 val ADD_URL: String = "$HOST/mobile/api/partners/user/add/"
186 val CREATE_SESSION_URL: String = "$HOST/mobile/api/partners/user/create-session/"
187 val CREATE_POLICY_URL: String = "$HOST/mobile/api/partners/policy/add/"
188 val DETACH_POLICY_URL: String = "$HOST/mobile/api/partners/user/detach-policy/"
189 val UPDATE_POLICY_URL: String = "$HOST/mobile/api/partners/policy/update/"
190 val ID_PARTNER: String = Config.instance[Config.mmtParentId]
191 val SECRET_KEY: String = Config.instance[Config.mmtSecretKet]
192 const val STATUS = 0
193 const val ERROR_EMAIL_ALREADY_EXISTS = 16
194 const val ERROR_PHONE_ALREADY_EXISTS = 17
195 const val ERROR_USER_NOT_FOUND = 33
196 }
197}
198