@up-im/medotvet_sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/.cursor/rules/apcheki_sdk.mdc +90 -0
  2. package/README.md +136 -0
  3. package/dist/api/abstract.d.ts +21 -0
  4. package/dist/api/abstract.js +125 -0
  5. package/dist/api/bookmarks.d.ts +28 -0
  6. package/dist/api/bookmarks.js +121 -0
  7. package/dist/api/chat.d.ts +30 -0
  8. package/dist/api/chat.js +118 -0
  9. package/dist/api/content.d.ts +154 -0
  10. package/dist/api/content.js +237 -0
  11. package/dist/api/geoIp.d.ts +8 -0
  12. package/dist/api/geoIp.js +14 -0
  13. package/dist/api/index.d.ts +27 -0
  14. package/dist/api/index.js +31 -0
  15. package/dist/api/payment.d.ts +54 -0
  16. package/dist/api/payment.js +90 -0
  17. package/dist/api/promocode.d.ts +9 -0
  18. package/dist/api/promocode.js +22 -0
  19. package/dist/api/push.d.ts +54 -0
  20. package/dist/api/push.js +99 -0
  21. package/dist/api/receipt.d.ts +34 -0
  22. package/dist/api/receipt.js +60 -0
  23. package/dist/api/stat.d.ts +21 -0
  24. package/dist/api/stat.js +75 -0
  25. package/dist/api/survey.d.ts +82 -0
  26. package/dist/api/survey.js +122 -0
  27. package/dist/api/user.d.ts +80 -0
  28. package/dist/api/user.js +167 -0
  29. package/dist/eventBus/abstract.d.ts +4 -0
  30. package/dist/eventBus/abstract.js +29 -0
  31. package/dist/eventBus/userLogin.d.ts +5 -0
  32. package/dist/eventBus/userLogin.js +11 -0
  33. package/dist/eventBus/userLogout.d.ts +4 -0
  34. package/dist/eventBus/userLogout.js +11 -0
  35. package/dist/http/apiError.d.ts +4 -0
  36. package/dist/http/apiError.js +10 -0
  37. package/dist/http/apiRoute.d.ts +98 -0
  38. package/dist/http/apiRoute.js +197 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +7 -0
  41. package/dist/interfaces/BannerType.d.ts +5 -0
  42. package/dist/interfaces/BannerType.js +7 -0
  43. package/dist/interfaces/apiStatEvents.d.ts +1 -0
  44. package/dist/interfaces/apiStatEvents.js +18 -0
  45. package/dist/interfaces/diplomaStatus.d.ts +8 -0
  46. package/dist/interfaces/diplomaStatus.js +9 -0
  47. package/dist/interfaces/iAppStore.d.ts +1 -0
  48. package/dist/interfaces/iAppStore.js +2 -0
  49. package/dist/interfaces/iAppVersionCheck.d.ts +5 -0
  50. package/dist/interfaces/iAppVersionCheck.js +2 -0
  51. package/dist/interfaces/iArticle.d.ts +15 -0
  52. package/dist/interfaces/iArticle.js +2 -0
  53. package/dist/interfaces/iBalance.d.ts +6 -0
  54. package/dist/interfaces/iBalance.js +2 -0
  55. package/dist/interfaces/iBank.d.ts +4 -0
  56. package/dist/interfaces/iBank.js +2 -0
  57. package/dist/interfaces/iBanner.d.ts +6 -0
  58. package/dist/interfaces/iBanner.js +2 -0
  59. package/dist/interfaces/iBookmark.d.ts +3 -0
  60. package/dist/interfaces/iBookmark.js +2 -0
  61. package/dist/interfaces/iBrand.d.ts +6 -0
  62. package/dist/interfaces/iBrand.js +2 -0
  63. package/dist/interfaces/iCatalog.d.ts +50 -0
  64. package/dist/interfaces/iCatalog.js +2 -0
  65. package/dist/interfaces/iCatalogNode.d.ts +3 -0
  66. package/dist/interfaces/iCatalogNode.js +2 -0
  67. package/dist/interfaces/iCatalogPreview.d.ts +17 -0
  68. package/dist/interfaces/iCatalogPreview.js +2 -0
  69. package/dist/interfaces/iCity.d.ts +4 -0
  70. package/dist/interfaces/iCity.js +2 -0
  71. package/dist/interfaces/iContentItem.d.ts +7 -0
  72. package/dist/interfaces/iContentItem.js +2 -0
  73. package/dist/interfaces/iEnv.d.ts +6 -0
  74. package/dist/interfaces/iEnv.js +2 -0
  75. package/dist/interfaces/iFilter.d.ts +11 -0
  76. package/dist/interfaces/iFilter.js +2 -0
  77. package/dist/interfaces/iGetNodeListProps.d.ts +8 -0
  78. package/dist/interfaces/iGetNodeListProps.js +2 -0
  79. package/dist/interfaces/iInstruction.d.ts +6 -0
  80. package/dist/interfaces/iInstruction.js +2 -0
  81. package/dist/interfaces/iIntro.d.ts +6 -0
  82. package/dist/interfaces/iIntro.js +2 -0
  83. package/dist/interfaces/iMessage.d.ts +25 -0
  84. package/dist/interfaces/iMessage.js +2 -0
  85. package/dist/interfaces/iNode.d.ts +26 -0
  86. package/dist/interfaces/iNode.js +2 -0
  87. package/dist/interfaces/iNodeTree.d.ts +14 -0
  88. package/dist/interfaces/iNodeTree.js +2 -0
  89. package/dist/interfaces/iPagingItems.d.ts +9 -0
  90. package/dist/interfaces/iPagingItems.js +2 -0
  91. package/dist/interfaces/iPayment.d.ts +20 -0
  92. package/dist/interfaces/iPayment.js +2 -0
  93. package/dist/interfaces/iPush.d.ts +14 -0
  94. package/dist/interfaces/iPush.js +2 -0
  95. package/dist/interfaces/iQuestion.d.ts +7 -0
  96. package/dist/interfaces/iQuestion.js +2 -0
  97. package/dist/interfaces/iReceipt.d.ts +20 -0
  98. package/dist/interfaces/iReceipt.js +2 -0
  99. package/dist/interfaces/iReceiptAddProps.d.ts +8 -0
  100. package/dist/interfaces/iReceiptAddProps.js +2 -0
  101. package/dist/interfaces/iReceiptProduct.d.ts +7 -0
  102. package/dist/interfaces/iReceiptProduct.js +2 -0
  103. package/dist/interfaces/iSearchParams.d.ts +11 -0
  104. package/dist/interfaces/iSearchParams.js +2 -0
  105. package/dist/interfaces/iShop.d.ts +6 -0
  106. package/dist/interfaces/iShop.js +2 -0
  107. package/dist/interfaces/iShopAddress.d.ts +5 -0
  108. package/dist/interfaces/iShopAddress.js +2 -0
  109. package/dist/interfaces/iSorter.d.ts +7 -0
  110. package/dist/interfaces/iSorter.js +2 -0
  111. package/dist/interfaces/iSpecialization.d.ts +4 -0
  112. package/dist/interfaces/iSpecialization.js +2 -0
  113. package/dist/interfaces/iStatView.d.ts +4 -0
  114. package/dist/interfaces/iStatView.js +2 -0
  115. package/dist/interfaces/iStorage.d.ts +5 -0
  116. package/dist/interfaces/iStorage.js +2 -0
  117. package/dist/interfaces/iStories.d.ts +13 -0
  118. package/dist/interfaces/iStories.js +2 -0
  119. package/dist/interfaces/iSubstance.d.ts +4 -0
  120. package/dist/interfaces/iSubstance.js +2 -0
  121. package/dist/interfaces/iSurvey.d.ts +36 -0
  122. package/dist/interfaces/iSurvey.js +2 -0
  123. package/dist/interfaces/iSurveyQuestion.d.ts +11 -0
  124. package/dist/interfaces/iSurveyQuestion.js +2 -0
  125. package/dist/interfaces/iSymptoms.d.ts +4 -0
  126. package/dist/interfaces/iSymptoms.js +2 -0
  127. package/dist/interfaces/iTestQuestion.d.ts +20 -0
  128. package/dist/interfaces/iTestQuestion.js +2 -0
  129. package/dist/interfaces/iTestResult.d.ts +17 -0
  130. package/dist/interfaces/iTestResult.js +2 -0
  131. package/dist/interfaces/iText.d.ts +3 -0
  132. package/dist/interfaces/iText.js +2 -0
  133. package/dist/interfaces/iUser.d.ts +35 -0
  134. package/dist/interfaces/iUser.js +2 -0
  135. package/dist/interfaces/iUserData.d.ts +10 -0
  136. package/dist/interfaces/iUserData.js +2 -0
  137. package/dist/interfaces/iUserEditProps.d.ts +20 -0
  138. package/dist/interfaces/iUserEditProps.js +2 -0
  139. package/dist/interfaces/iUserStat.d.ts +7 -0
  140. package/dist/interfaces/iUserStat.js +2 -0
  141. package/dist/interfaces/iUserSurvey.d.ts +21 -0
  142. package/dist/interfaces/iUserSurvey.js +11 -0
  143. package/dist/interfaces/iUserTokens.d.ts +4 -0
  144. package/dist/interfaces/iUserTokens.js +2 -0
  145. package/dist/interfaces/intRange.d.ts +3 -0
  146. package/dist/interfaces/intRange.js +2 -0
  147. package/dist/interfaces/itemType.d.ts +9 -0
  148. package/dist/interfaces/itemType.js +11 -0
  149. package/dist/interfaces/paymentStatus.d.ts +7 -0
  150. package/dist/interfaces/paymentStatus.js +9 -0
  151. package/dist/interfaces/paymentType.d.ts +5 -0
  152. package/dist/interfaces/paymentType.js +7 -0
  153. package/dist/interfaces/payoutType.d.ts +5 -0
  154. package/dist/interfaces/payoutType.js +7 -0
  155. package/dist/interfaces/pushStatus.d.ts +6 -0
  156. package/dist/interfaces/pushStatus.js +8 -0
  157. package/dist/interfaces/receiptStatus.d.ts +7 -0
  158. package/dist/interfaces/receiptStatus.js +9 -0
  159. package/dist/interfaces/testStatus.d.ts +6 -0
  160. package/dist/interfaces/testStatus.js +7 -0
  161. package/dist/interfaces/userRole.d.ts +6 -0
  162. package/dist/interfaces/userRole.js +14 -0
  163. package/dist/interfaces/userStatEvent.d.ts +5 -0
  164. package/dist/interfaces/userStatEvent.js +7 -0
  165. package/dist/interfaces/viewEventType.d.ts +13 -0
  166. package/dist/interfaces/viewEventType.js +19 -0
  167. package/dist/service/webSocketClient.d.ts +21 -0
  168. package/dist/service/webSocketClient.js +87 -0
  169. package/dist/storage/default.d.ts +2 -0
  170. package/dist/storage/default.js +8 -0
  171. package/dist/storage/user.d.ts +21 -0
  172. package/dist/storage/user.js +107 -0
  173. package/dist/utils/queryString.d.ts +3 -0
  174. package/dist/utils/queryString.js +21 -0
  175. package/package.json +31 -0
  176. package/src/api/abstract.ts +136 -0
  177. package/src/api/bookmarks.ts +109 -0
  178. package/src/api/chat.ts +127 -0
  179. package/src/api/content.ts +258 -0
  180. package/src/api/geoIp.ts +12 -0
  181. package/src/api/index.ts +38 -0
  182. package/src/api/payment.ts +105 -0
  183. package/src/api/promocode.ts +18 -0
  184. package/src/api/push.ts +102 -0
  185. package/src/api/stat.ts +74 -0
  186. package/src/api/survey.ts +164 -0
  187. package/src/api/user.ts +176 -0
  188. package/src/eventBus/abstract.ts +33 -0
  189. package/src/eventBus/userLogin.ts +13 -0
  190. package/src/eventBus/userLogout.ts +12 -0
  191. package/src/http/apiError.ts +9 -0
  192. package/src/http/apiRoute.ts +234 -0
  193. package/src/index.ts +2 -0
  194. package/src/interfaces/BannerType.ts +6 -0
  195. package/src/interfaces/apiStatEvents.ts +18 -0
  196. package/src/interfaces/diplomaStatus.ts +10 -0
  197. package/src/interfaces/iAppStore.ts +1 -0
  198. package/src/interfaces/iArticle.ts +12 -0
  199. package/src/interfaces/iBalance.ts +6 -0
  200. package/src/interfaces/iBank.ts +4 -0
  201. package/src/interfaces/iBanner.ts +6 -0
  202. package/src/interfaces/iBookmark.ts +3 -0
  203. package/src/interfaces/iCity.ts +4 -0
  204. package/src/interfaces/iContentItem.ts +6 -0
  205. package/src/interfaces/iEnv.ts +6 -0
  206. package/src/interfaces/iFilter.ts +16 -0
  207. package/src/interfaces/iGetNodeListProps.ts +9 -0
  208. package/src/interfaces/iInstruction.ts +6 -0
  209. package/src/interfaces/iIntro.ts +6 -0
  210. package/src/interfaces/iMessage.ts +25 -0
  211. package/src/interfaces/iNode.ts +24 -0
  212. package/src/interfaces/iNodeTree.ts +14 -0
  213. package/src/interfaces/iPagingItems.ts +8 -0
  214. package/src/interfaces/iPayment.ts +28 -0
  215. package/src/interfaces/iPush.ts +15 -0
  216. package/src/interfaces/iQuestion.ts +4 -0
  217. package/src/interfaces/iSearchParams.ts +12 -0
  218. package/src/interfaces/iSorter.ts +10 -0
  219. package/src/interfaces/iSpecialization.ts +4 -0
  220. package/src/interfaces/iStatView.ts +4 -0
  221. package/src/interfaces/iStorage.ts +5 -0
  222. package/src/interfaces/iStories.ts +10 -0
  223. package/src/interfaces/iSubstance.ts +4 -0
  224. package/src/interfaces/iSurvey.ts +38 -0
  225. package/src/interfaces/iSurveyQuestion.ts +15 -0
  226. package/src/interfaces/iSymptoms.ts +4 -0
  227. package/src/interfaces/iTestQuestion.ts +21 -0
  228. package/src/interfaces/iTestResult.ts +20 -0
  229. package/src/interfaces/iText.ts +3 -0
  230. package/src/interfaces/iUser.ts +37 -0
  231. package/src/interfaces/iUserData.ts +10 -0
  232. package/src/interfaces/iUserEditProps.ts +16 -0
  233. package/src/interfaces/iUserStat.ts +8 -0
  234. package/src/interfaces/iUserSurvey.ts +23 -0
  235. package/src/interfaces/iUserTokens.ts +4 -0
  236. package/src/interfaces/intRange.ts +5 -0
  237. package/src/interfaces/itemType.ts +10 -0
  238. package/src/interfaces/paymentStatus.ts +8 -0
  239. package/src/interfaces/paymentType.ts +6 -0
  240. package/src/interfaces/payoutType.ts +6 -0
  241. package/src/interfaces/pushStatus.ts +7 -0
  242. package/src/interfaces/testStatus.ts +8 -0
  243. package/src/interfaces/userRole.ts +13 -0
  244. package/src/interfaces/userStatEvent.ts +6 -0
  245. package/src/interfaces/viewEventType.ts +17 -0
  246. package/src/service/webSocketClient.ts +94 -0
  247. package/src/storage/default.ts +7 -0
  248. package/src/storage/user.ts +109 -0
  249. package/src/utils/queryString.ts +22 -0
  250. package/tsconfig.json +27 -0
@@ -0,0 +1,164 @@
1
+ import { ApiAbstract } from "./abstract"
2
+ import { iSurvey } from "../interfaces/iSurvey"
3
+ import { iUserSurvey } from "../interfaces/iUserSurvey"
4
+ import { iPagingItems } from "../interfaces/iPagingItems"
5
+ import { ApiError } from "../http/apiError"
6
+ import {
7
+ apiRouteSurveyList,
8
+ apiRouteSurveyItem,
9
+ apiRouteSurveyStart,
10
+ apiRouteSurveySaveAnswer,
11
+ apiRouteSurveyCancel,
12
+ apiRouteSurveyHistory
13
+ } from "../http/apiRoute"
14
+
15
+ export class ApiSurvey extends ApiAbstract {
16
+ /**
17
+ * Получить список доступных опросов
18
+ * @param {number} page - номер страницы (с 1)
19
+ * @param {keyof iSurvey} select - выбор полей ответа
20
+ * @param {boolean} bookmarks - только избранные опросы
21
+ */
22
+ async getList<Keys extends keyof iSurvey>({
23
+ page = 1,
24
+ select,
25
+ bookmarks,
26
+ }: {
27
+ page: number
28
+ select?: Keys[]
29
+ bookmarks?: boolean
30
+ }) {
31
+ return await this.fetcher<iPagingItems<Pick<iSurvey, Keys>>>({
32
+ route: apiRouteSurveyList({
33
+ page,
34
+ sorters: ["priority asc", "id desc"],
35
+ select,
36
+ bookmarks
37
+ }),
38
+ options: { addToken: true }
39
+ })
40
+ }
41
+
42
+ /**
43
+ * Получить список избранных опросов
44
+ * @param {number} page - номер страницы (с 1)
45
+ * @param {keyof iSurvey} select - выбор полей ответа
46
+ */
47
+ async getBookmarks<Keys extends keyof iSurvey>({
48
+ page = 1,
49
+ select,
50
+ }: {
51
+ page: number
52
+ select?: Keys[]
53
+ }) {
54
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
55
+
56
+ return await this.fetcher<iPagingItems<Pick<iSurvey, Keys>>>({
57
+ route: apiRouteSurveyList({
58
+ page,
59
+ sorters: ["priority desc", "id desc"],
60
+ select,
61
+ bookmarks: true
62
+ }),
63
+ options: { addToken: true }
64
+ })
65
+ }
66
+
67
+ /**
68
+ * Получить один опрос с вопросами
69
+ * @param {number} id - id опроса
70
+ */
71
+ async getOne({ id }: { id: number }) {
72
+ return (await this.fetcher<{ item: iSurvey }>({
73
+ route: apiRouteSurveyItem(id),
74
+ options: { addToken: true }
75
+ })).item
76
+ }
77
+
78
+ /**
79
+ * Начать прохождение опроса
80
+ * @param {number} surveyId - id опроса
81
+ * @param {AbortSignal} signal
82
+ */
83
+ async start(surveyId: number, signal?: AbortSignal | null) {
84
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
85
+
86
+ return await this.fetcher<{ success: boolean, userSurvey: iUserSurvey }>({
87
+ route: apiRouteSurveyStart(surveyId),
88
+ postBody: {},
89
+ options: {
90
+ addToken: true,
91
+ signal
92
+ }
93
+ })
94
+ }
95
+
96
+ /**
97
+ * Сохранить ответ на вопрос
98
+ * @param {number} userSurveyId - id прохождения опроса
99
+ * @param {number} questionIndex - индекс вопроса
100
+ * @param {number | number[] | string} answer - ответ (для single: number, для multiple: number[], для text: string)
101
+ * @param {AbortSignal} signal
102
+ */
103
+ async saveAnswer({
104
+ userSurveyId,
105
+ questionIndex,
106
+ answer,
107
+ signal
108
+ }: {
109
+ userSurveyId: number
110
+ questionIndex: number
111
+ answer: number | number[] | string
112
+ signal?: AbortSignal | null
113
+ }) {
114
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
115
+
116
+ return await this.fetcher<{
117
+ success: boolean
118
+ completed: boolean
119
+ next_question_index: number | null
120
+ message: string
121
+ }>({
122
+ route: apiRouteSurveySaveAnswer(userSurveyId),
123
+ postBody: {
124
+ question_index: questionIndex,
125
+ answer
126
+ },
127
+ options: {
128
+ addToken: true,
129
+ signal
130
+ }
131
+ })
132
+ }
133
+
134
+ /**
135
+ * Отменить прохождение опроса
136
+ * @param {number} userSurveyId - id прохождения опроса
137
+ * @param {AbortSignal} signal
138
+ */
139
+ async cancel(userSurveyId: number, signal?: AbortSignal | null) {
140
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
141
+
142
+ return await this.fetcher<{ success: boolean, message: string }>({
143
+ route: apiRouteSurveyCancel(userSurveyId),
144
+ postBody: {},
145
+ options: {
146
+ addToken: true,
147
+ signal
148
+ }
149
+ })
150
+ }
151
+
152
+ /**
153
+ * Получить историю прохождений опросов пользователя
154
+ * @param {number} page - номер страницы (с 1)
155
+ */
156
+ async getHistory({ page = 1 }: { page?: number } = {}) {
157
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
158
+
159
+ return await this.fetcher<iPagingItems<iUserSurvey>>({
160
+ route: apiRouteSurveyHistory({ page }),
161
+ options: { addToken: true }
162
+ })
163
+ }
164
+ }
@@ -0,0 +1,176 @@
1
+
2
+ import { ApiError } from "../http/apiError"
3
+ import {
4
+ apiRouteUserDelete,
5
+ apiRouteUserEdit,
6
+ apiRouteUserGetMe,
7
+ apiRouteUserLoginWithCode,
8
+ apiRouteUserLogout,
9
+ apiRouteUserSetRef,
10
+ apiRouteUserDiplomaUpload,
11
+ apiRouteUserDiplomaStatus
12
+ } from "../http/apiRoute"
13
+ import { iUserEditProps } from "../interfaces/iUserEditProps"
14
+ import { iUser } from "../interfaces/iUser"
15
+ import { iUserTokens } from "../interfaces/iUserTokens"
16
+ import { DiplomaStatusValue } from "../interfaces/diplomaStatus"
17
+ import { ApiAbstract } from "./abstract"
18
+ import { eventBusUserLogin } from "../eventBus/userLogin"
19
+ import { eventBusUserLogout } from "../eventBus/userLogout"
20
+
21
+ export class ApiUser extends ApiAbstract {
22
+ /**
23
+ * получает пользователя из расшифрованного JWT токена без запроса на backend
24
+ */
25
+ get() {
26
+ return this.userStorage.getUser()
27
+ }
28
+ /**
29
+ * получает полную информацию о пользователе с сервера
30
+ */
31
+ async getFull() {
32
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
33
+ return this.fetcher<iUser>({ route: apiRouteUserGetMe, options: { addToken: true } })
34
+ }
35
+ /**
36
+ * 1ый этап регистрации или авторизации
37
+ */
38
+ async loginOrRegisterByPhone({ phone }: { phone: string }) {
39
+ try {
40
+ await this.fetcher({ route: apiRouteUserLoginWithCode, postBody: { login: phone } })
41
+ } catch (error) {
42
+ if (error instanceof ApiError && error.message == "confirm_phone") return
43
+ throw error
44
+ }
45
+ }
46
+ /**
47
+ * 2ой этап регистрации или авторизации - ввод кода подтверждения
48
+ */
49
+ async loginOrRegisterByPhoneConfirm({ phone, code }: { phone: string, code: string }) {
50
+ const data = await this.fetcher<iUserTokens>({
51
+ route: apiRouteUserLoginWithCode,
52
+ postBody: { login: phone, phone_code: code }
53
+ })
54
+ const user = await this.userStorage.setUser(data.accessToken, data.refreshToken)
55
+ if (user) eventBusUserLogin.broadcast(user)
56
+ return user
57
+ }
58
+ /**
59
+ * Ввод реферального кода другого пользователя
60
+ * @param {string} props.ref - реферальный код
61
+ */
62
+ async setRef({ ref }: { ref: string }) {
63
+ await this.fetcher({
64
+ route: apiRouteUserSetRef,
65
+ postBody: { ref },
66
+ options: { addToken: true }
67
+ })
68
+ }
69
+ /**
70
+ * редактирование пользователя
71
+ * если метод вернул false - то необходимо ввести код из email и передать его в data.email_code
72
+ * @param {string} props.email - опционально, для смены email. Если емейл не меняется то не передаем этот параметр или передаем пустую строку
73
+ * @param {number} props.city - id города
74
+ * @param {string} props.email_code - код отправленный на email. Первый раз метод вызывается без него, если метод вернул false необходимо вызвать повторно передав код из email
75
+ */
76
+ async editUser(data: iUserEditProps) {
77
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
78
+ try {
79
+ await this.fetcher({
80
+ route: apiRouteUserEdit,
81
+ postBody: data,
82
+ options: { addToken: true }
83
+ })
84
+ if (data.firstname?.length && data.lastname?.length) {
85
+ await this.userStorage.saveUser({ firstname: data.firstname, lastname: data.lastname })
86
+ }
87
+ return true
88
+ } catch (error) {
89
+ if (error instanceof ApiError && error.message == "confirm_email") return false
90
+ throw error
91
+ }
92
+
93
+ }
94
+ /**
95
+ * выход из ЛК
96
+ */
97
+ async logout() {
98
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
99
+ await this.userStorage.clearUser()
100
+ await eventBusUserLogout.broadcast()
101
+ }
102
+ /**
103
+ * выход из ЛК (выход со всех устройств, на сервере будет удален refresh token, accessToken продолжит действовать остаток своего времени. Другие устройства разлогинет в течении 5 минут)
104
+ */
105
+ async logoutAllDevice() {
106
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
107
+ await this.fetcher({
108
+ route: apiRouteUserLogout,
109
+ postBody: { logout: 1 },
110
+ options: { addToken: true }
111
+ })
112
+ await this.userStorage.clearUser()
113
+ await eventBusUserLogout.broadcast()
114
+ }
115
+ /**
116
+ * подписка на событие logout
117
+ */
118
+ onLogout = eventBusUserLogout.subscribe
119
+ /**
120
+ * удаление аккаунта пользователя, сделавшего запрос и всех связанных с ним сущностей (уведомлений, выплат, чеков, статистики и т.д.)
121
+ */
122
+ async delete() {
123
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
124
+ await this.fetcher({
125
+ route: apiRouteUserDelete,
126
+ postBody: { confirm: "1" },
127
+ options: { addToken: true }
128
+ })
129
+ await this.userStorage.clearUser()
130
+ await eventBusUserLogout.broadcast()
131
+ }
132
+
133
+ /**
134
+ * возвращает реф. код пользователя, который другие пользователя вводят при регистрации
135
+ */
136
+ async getMyReferer() {
137
+ return (await this.getFull())?.my_ref_code
138
+ }
139
+
140
+ // =====================================================
141
+ // Методы для работы с дипломом (Medotvet)
142
+ // =====================================================
143
+
144
+ /**
145
+ * Загрузить файлы диплома
146
+ * @param formData - FormData с файлами (ключ "diploma[]")
147
+ */
148
+ async uploadDiploma(formData: FormData) {
149
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
150
+ return await this.fetcher<{
151
+ success: boolean,
152
+ diploma_files: string[],
153
+ diploma_status: DiplomaStatusValue
154
+ }>({
155
+ route: apiRouteUserDiplomaUpload,
156
+ postBody: formData,
157
+ options: { addToken: true }
158
+ })
159
+ }
160
+
161
+ /**
162
+ * Получить статус диплома
163
+ * @returns diploma_status: 1-не загружен, 2-на проверке, 3-верифицирован, 4-отклонен
164
+ */
165
+ async getDiplomaStatus() {
166
+ if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
167
+ return await this.fetcher<{
168
+ diploma_status: DiplomaStatusValue,
169
+ diploma_files: string[],
170
+ diploma_reject_reason: string | null
171
+ }>({
172
+ route: apiRouteUserDiplomaStatus,
173
+ options: { addToken: true }
174
+ })
175
+ }
176
+ }
@@ -0,0 +1,33 @@
1
+ const subscriptions: { [key: string]: Set<(...args: any[]) => Promise<void>> } = {}
2
+
3
+ const subscribe = (eventName: string, callback: (...args: any[]) => Promise<void>) => {
4
+ if (!subscriptions[eventName]) {
5
+ subscriptions[eventName] = new Set()
6
+ }
7
+
8
+ const callbacks = subscriptions[eventName]
9
+ callbacks.add(callback)
10
+
11
+ return () => {
12
+ callbacks.delete(callback)
13
+
14
+ if (callbacks.size === 0) {
15
+ delete subscriptions[eventName]
16
+ }
17
+ }
18
+ }
19
+
20
+ const broadcast = async (eventName: string, ...args: any[]) => {
21
+ if (!subscriptions[eventName]) return
22
+
23
+ const callbacks = subscriptions[eventName]
24
+
25
+ for (const callback of Array.from(callbacks)) {
26
+ await callback(...args)
27
+ }
28
+ }
29
+
30
+ export const abstract = {
31
+ subscribe,
32
+ broadcast
33
+ }
@@ -0,0 +1,13 @@
1
+ import { abstract } from "./abstract"
2
+ import { iUserData } from "../interfaces/iUserData"
3
+
4
+ const eventName = "userLogin"
5
+
6
+ const subscribe = (callback: (user: iUserData) => Promise<void>) => abstract.subscribe(eventName, callback)
7
+
8
+ const broadcast = (user: iUserData) => abstract.broadcast(eventName, user)
9
+
10
+ export const eventBusUserLogin = {
11
+ subscribe,
12
+ broadcast
13
+ }
@@ -0,0 +1,12 @@
1
+ import { abstract } from "./abstract"
2
+
3
+ const eventName = "userLogout"
4
+
5
+ const subscribe = (callback: () => Promise<void>) => abstract.subscribe(eventName, callback)
6
+
7
+ const broadcast = () => abstract.broadcast(eventName)
8
+
9
+ export const eventBusUserLogout = {
10
+ subscribe,
11
+ broadcast
12
+ }
@@ -0,0 +1,9 @@
1
+ export class ApiError extends Error{
2
+ status:number;
3
+
4
+ constructor(status:number, message:string) {
5
+ super(message);
6
+ this.status = status;
7
+ }
8
+
9
+ }
@@ -0,0 +1,234 @@
1
+ import { iAppStore } from "../interfaces/iAppStore"
2
+ import { iFilter } from "../interfaces/iFilter"
3
+ import { iGetNodeListProps } from "../interfaces/iGetNodeListProps"
4
+ import { iPayment } from "../interfaces/iPayment"
5
+ import { iPush } from "../interfaces/iPush"
6
+ import { iSurvey } from "../interfaces/iSurvey"
7
+ import { queryString } from "../utils/queryString"
8
+
9
+ export const apiRouteEnv = "/env"
10
+ export const apiRouteCheckAppVersion = (appStore: iAppStore, appVersion: string) => `/env/check_app_version/${appStore}/${appVersion}`
11
+ export const apiRouteGetCloudVersion = (appStore: iAppStore) => `/env/get_cloud_version/${appStore}`
12
+
13
+ export const apiRouteList = <T>({
14
+ nodeCode,
15
+ nodeGenerator,
16
+ page = 1,//отсчет страниц с первой, чтобы не было путаницы
17
+ filters = undefined,
18
+ sorters = undefined,
19
+ select = undefined,
20
+ perPage = undefined,
21
+ subNodes = false,
22
+ }: {
23
+ nodeCode: string,
24
+ nodeGenerator?: string[]
25
+ page?: number,
26
+ filters?: iFilter<T>,
27
+ sorters?: string[]
28
+ select?: string[]
29
+ perPage?: number
30
+ subNodes?: boolean
31
+ }) => {
32
+ const hasFilters = filters && Object.keys(filters).length
33
+ if (!nodeCode.includes("/type") && !nodeCode.includes("/tag/")) {
34
+ nodeCode = nodeCode.replaceAll("/", ".")
35
+ }
36
+ const getParams: string[] = []
37
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
38
+ if (sorters) getParams.push(queryString({ sorter: sorters }))
39
+ if (select) getParams.push('select=' + select.join(","))
40
+ if (perPage) getParams.push('perpage=' + perPage)
41
+ if (subNodes) getParams.push('subnodes')
42
+ return `/content/${nodeCode}/list/${page}` +
43
+ (nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '') +
44
+ (getParams ? '?' : '') +
45
+ getParams.join("&")
46
+ }
47
+ //метод получает фильтры и доступные значения фильтра
48
+ export const apiRouteFilters = <T>({
49
+ nodeCode,
50
+ nodeGenerator,
51
+ filters = undefined,
52
+ subNodes = false,
53
+ }: {
54
+ nodeCode: string,
55
+ nodeGenerator?: string[]
56
+ filters?: iFilter<T>,
57
+ subNodes?: boolean
58
+ }) => {
59
+ if (!nodeCode.includes("/type") && !nodeCode.includes("/tag/")) {
60
+ nodeCode = nodeCode.replaceAll("/", ".")
61
+ }
62
+ const getParams: string[] = []
63
+ const hasFilters = filters && Object.keys(filters).length
64
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
65
+ if (subNodes) getParams.push('subnodes')
66
+ return `/content/${nodeCode}/filters` +
67
+ (nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '') +
68
+ (getParams ? '?' : '') +
69
+ getParams.join("&")
70
+ }
71
+ export const apiRouteItem = (nodeCode: string, itemCode: string) =>
72
+ `/content/${nodeCode.replaceAll("/", ".")}/item/code/${itemCode}`
73
+
74
+ export const apiRouteItemById = (nodeCode: string, itemId: number) =>
75
+ `/content/${nodeCode.replaceAll("/", ".")}/item/id/${itemId}`
76
+
77
+ export const apiRouteNodeTree = (parent: number = 0) => `/node/tree/${parent}`
78
+ //метод получает фильтры, возвращает подкатегории в которых есть товары по этим фильтрам
79
+ export const apiRouteNodeTreeContentByFilters = <T>({
80
+ parent,
81
+ filters = undefined,
82
+ subNodes,
83
+ }: {
84
+ parent: number,
85
+ filters?: iFilter<T>,
86
+ subNodes: boolean
87
+ }) => {
88
+ const getParams: string[] = []
89
+ const hasFilters = filters && Object.keys(filters).length
90
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
91
+ if (subNodes) getParams.push('subnodes')
92
+ return `/node/tree/by_content_filters/${parent}` +
93
+ (getParams ? '?' : '') +
94
+ getParams.join("&")
95
+ }
96
+ export const apiRouteNodeList = <T>({
97
+ page = 1,//отсчет страниц с первой, чтобы не было путаницы
98
+ filters = undefined,
99
+ sorter = undefined,
100
+ perPage = undefined,
101
+ setParams = false
102
+ }: iGetNodeListProps<T>) => {
103
+ const hasFilters = filters && Object.keys(filters).length
104
+ const getParams: string[] = []
105
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
106
+ if (sorter) getParams.push(queryString({ sorter: sorter }))
107
+ if (perPage) getParams.push('perpage=' + perPage)
108
+ if (setParams) getParams.push('set_params')
109
+ return `/node/list/${page}` +
110
+ (getParams ? '?' : '') +
111
+ getParams.join("&")
112
+ }
113
+ export const apiRouteNode = (nodeCode: string, nodeGenerator?: string[]) =>
114
+ `/node/item/${nodeCode.replaceAll("/", ".")}` +
115
+ (nodeGenerator?.length ? '/' + nodeGenerator.join(".") : '')
116
+ export const apiRouteNodeById = (nodeId: number) => `/node/item/id/${nodeId}`
117
+ export const apiRouteNodeGeneratedLinks = (nodeCode: string, pageIndex: number = 0, isAll: boolean = false) =>
118
+ `/content/${nodeCode.replaceAll("/", ".")}/generator_links/${pageIndex + 1}${isAll ? '/all' : ""}`
119
+
120
+ //basket
121
+ export const apiRouteBasketTotal = () => `/basket/total`
122
+ export const apiRouteBasketGet = () => `/basket/get`
123
+ export const apiRouteBasketMutate = () => `/basket/mutate`
124
+ export const apiRouteBasketMoveToDraft = () => `/basket/move_to_draft`
125
+ //geo
126
+ export const apiRouteGeoDetect = `/geo/detect`
127
+ //user
128
+ export const apiRouteUserGetMe = `/user/get_me`
129
+ export const apiRouteUserRefresh = `/user/refresh`
130
+ export const apiRouteUserLoginWithCode = `/user/login_with_code`
131
+ export const apiRouteUserEdit = '/user/edit'
132
+ export const apiRouteUserUploadPhoto = '/user/upload_photo'
133
+ export const apiRouteUserLogout = '/user/logout'
134
+ export const apiRouteUserDelete = '/user/delete'
135
+ export const apiRouteUserSetRef = '/user/set_ref'
136
+ // Диплом (Medotvet)
137
+ export const apiRouteUserDiplomaUpload = '/user/diploma'
138
+ export const apiRouteUserDiplomaStatus = '/user/diploma/status'
139
+ //survey
140
+ export const apiRouteSurveyList = ({
141
+ page = 1,
142
+ filters = undefined,
143
+ sorters = undefined,
144
+ select = undefined,
145
+ bookmarks = false,
146
+ }: {
147
+ page?: number,
148
+ filters?: iFilter<iSurvey>,
149
+ sorters?: string[],
150
+ select?: string[],
151
+ bookmarks?: boolean
152
+ }) => {
153
+ const hasFilters = filters && Object.keys(filters).length
154
+ const getParams: string[] = []
155
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
156
+ if (sorters) getParams.push(queryString({ sorter: sorters }))
157
+ if (select) getParams.push('select=' + select.join(","))
158
+ return `/survey/${bookmarks ? 'bookmarks' : 'list'}/${page}` +
159
+ (getParams.length ? '?' : '') +
160
+ getParams.join("&")
161
+ }
162
+ export const apiRouteSurveyItem = (id: number) => `/survey/item/${id}`
163
+ export const apiRouteSurveyStart = (surveyId: number) => `/survey/${surveyId}/start`
164
+ export const apiRouteSurveySaveAnswer = (userSurveyId: number) => `/survey/${userSurveyId}/answer`
165
+ export const apiRouteSurveyCancel = (userSurveyId: number) => `/survey/${userSurveyId}/cancel`
166
+ export const apiRouteSurveyHistory = ({ page = 1 }: { page?: number } = {}) => `/survey/history/${page}`
167
+ //payment
168
+ export const apiRoutePaymentAdd = '/payment/add'
169
+ export const apiRoutePaymentList = ({
170
+ page = 1,//отсчет страниц с первой, чтобы не было путаницы
171
+ filters = undefined,
172
+ sorters = undefined,
173
+ select = undefined,
174
+ }: {
175
+ page?: number,
176
+ filters?: iFilter<iPayment>,
177
+ sorters?: string[],
178
+ select?: string[]
179
+ }) => {
180
+ const hasFilters = filters && Object.keys(filters).length
181
+ const getParams: string[] = []
182
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
183
+ if (sorters) getParams.push(queryString({ sorter: sorters }))
184
+ if (select) getParams.push('select=' + select.join(","))
185
+ return `/payment/list/${page}` +
186
+ (getParams ? '?' : '') +
187
+ getParams.join("&")
188
+ }
189
+ export const apiRoutePaymentBalance = '/payment/balance'
190
+ export const apiRoutePaymentVerificationUrl = '/payment/verification_url'
191
+ export const apiRoutePaymentVerificationStatus = '/payment/verification_status'
192
+ //stat
193
+ export const apiRouteViewAdd = '/view/add'
194
+ export const apiRouteStatAdd = '/stat/add'
195
+ export const apiRouteStatGet = '/stat/get'
196
+ //bookmarks
197
+ export const apiRouteBookmarksGet = '/bookmarks/get'
198
+ export const apiRouteBookmarksAdd = '/bookmarks/add'
199
+ export const apiRouteBookmarksRemove = '/bookmarks/remove'
200
+ export const apiRouteBookmarksCount = '/bookmarks/count'
201
+ //banner
202
+ export const apiRouteBannerGetRand = (type: number) => `/banner/get_rand/${type}`
203
+ //push
204
+ export const apiRoutePushList = ({
205
+ page = 1,//отсчет страниц с первой, чтобы не было путаницы
206
+ filters = undefined,
207
+ sorters = undefined,
208
+ select = undefined,
209
+ }: {
210
+ page?: number,
211
+ filters?: iFilter<iPush>,
212
+ sorters?: string[],
213
+ select?: string[]
214
+ }) => {
215
+ const hasFilters = filters && Object.keys(filters).length
216
+ const getParams: string[] = []
217
+ if (hasFilters) getParams.push(queryString({ filters: filters }))
218
+ if (sorters) getParams.push(queryString({ sorter: sorters }))
219
+ if (select) getParams.push('select=' + select.join(","))
220
+ return `/push/list/${page}` +
221
+ (getParams ? '?' : '') +
222
+ getParams.join("&")
223
+ }
224
+ export const apiRoutePushCountNew = '/push/count_new'
225
+ export const apiRoutePushRegister = '/push/register'
226
+ export const apiRoutePushUnsubscribe = '/push/unsubscribe'
227
+ export const apiRoutePushIsSubscribed = '/push/is_subscribed'
228
+
229
+ export const apiRoutePushView = '/push/view'
230
+ export const apiRoutePushViewAll = '/push/view_all'
231
+
232
+ export const apiRouteChatUnread = '/chat/unread'
233
+
234
+ export const apiRoutePromocodeActivate = '/promocode/activate'
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { createClient } from "./api/index";
2
+ export { ApiError } from './http/apiError';
@@ -0,0 +1,6 @@
1
+ export const BannerType = {
2
+ horizontal: 14,
3
+ modal: 15,
4
+ }
5
+
6
+ export type BannerTypeKeys = keyof typeof BannerType;
@@ -0,0 +1,18 @@
1
+ export const apiStatEvents = [
2
+ "ARTICLES/VIEW",//открытие статьи
3
+ "ARTICLES/READ",//прочтение статьи
4
+ "ARTICLES/SKU_BTN",//клик по кнопке акции в статье
5
+
6
+ "CATALOG_SKU/VIEW", // открытие акции
7
+ "CATALOG_SKU/FAVORITE", //добавление акции в избранное
8
+ "CATALOG_SKU/PROMO_BLOCK", //клик по промоблоку
9
+ "CATALOG_SKU/PRESENTATION_CLICK", //клик по презентации
10
+ "CATALOG_SKU/PRESENTATION_SUCCESS", //полностью посмотрели презентацию
11
+ "CATALOG_SKU/QUESTIONS_CLICK",//клик по квизу (вопросам)
12
+ "CATALOG_SKU/QUESTIONS_SUCCESS",//ответили правильно на все вопросы
13
+
14
+ "BANNER/VIEW",//просмотр баннера
15
+ "BANNER/CLICK",//клик по баннеру
16
+
17
+ "STORIES/VIEW"//просмотр сториса
18
+ ] as const
@@ -0,0 +1,10 @@
1
+ export const DiplomaStatus = {
2
+ not_uploaded: 1,
3
+ pending: 2,
4
+ verified: 3,
5
+ rejected: 4,
6
+ } as const
7
+
8
+ export type DiplomaStatusKeys = keyof typeof DiplomaStatus
9
+ export type DiplomaStatusValue = typeof DiplomaStatus[DiplomaStatusKeys]
10
+