xync-db 0.0.2.dev2__tar.gz → 0.1.1__tar.gz

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 (46) hide show
  1. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/.gitignore +10 -4
  2. xync_db-0.1.1/PKG-INFO +348 -0
  3. xync_db-0.1.1/README.md +329 -0
  4. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/pyproject.toml +5 -0
  5. xync_db-0.1.1/src/xync_db/__init__.py +21 -0
  6. xync_db-0.1.1/src/xync_db/config.py +25 -0
  7. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/enums.py +2 -0
  8. xync_db-0.1.1/src/xync_db/exceptions.py +31 -0
  9. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/graph.py +1 -1
  10. xync_db-0.1.1/src/xync_db/i18n.py +39 -0
  11. xync_db-0.1.1/src/xync_db/migrations/CLAUDE.md +110 -0
  12. xync_db-0.1.1/src/xync_db/migrations/__init__.py +0 -0
  13. xync_db-0.1.1/src/xync_db/migrations/models/0001_initial.py +2492 -0
  14. xync_db-0.1.1/src/xync_db/migrations/models/0002_triggers.py +264 -0
  15. xync_db-0.1.1/src/xync_db/migrations/models/0003_files_seed.py +20 -0
  16. xync_db-0.1.1/src/xync_db/migrations/models/0004_all_seed.py +31 -0
  17. xync_db-0.1.1/src/xync_db/migrations/models/__init__.py +0 -0
  18. xync_db-0.1.1/src/xync_db/migrations/models/seed/__init__.py +0 -0
  19. xync_db-0.1.1/src/xync_db/migrations/models/seed/a_actor_seed.py +311 -0
  20. xync_db-0.1.1/src/xync_db/migrations/models/seed/a_tg_seed.py +145 -0
  21. xync_db-0.1.1/src/xync_db/migrations/models/seed/b_htx_seed.py +111 -0
  22. xync_db-0.1.1/src/xync_db/migrations/models/seed/xync_files.sql +4350 -0
  23. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/models/__init__.py +781 -411
  24. xync_db-0.1.1/src/xync_db/py.typed +0 -0
  25. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/shared.py +31 -3
  26. xync_db-0.1.1/src/xync_db/typs/__init__.py +51 -0
  27. xync_db-0.1.1/src/xync_db/typs/db/__init__.py +0 -0
  28. xync_db-0.1.1/src/xync_db/typs/db/actor.py +62 -0
  29. xync_db-0.1.1/src/xync_db/typs/db/ad.py +159 -0
  30. xync_db-0.1.1/src/xync_db/typs/db/common.py +102 -0
  31. xync_db-0.1.1/src/xync_db/typs/db/cred.py +115 -0
  32. xync_db-0.1.1/src/xync_db/typs/db/order.py +66 -0
  33. xync_db-0.1.1/src/xync_db/typs/db/pm.py +89 -0
  34. xync_db-0.0.2.dev2/PKG-INFO +0 -31
  35. xync_db-0.0.2.dev2/README.md +0 -17
  36. xync_db-0.0.2.dev2/migrations/models/0001_triggers.py +0 -111
  37. xync_db-0.0.2.dev2/migrations/models/__init__.py +0 -1
  38. xync_db-0.0.2.dev2/src/xync_db/__init__.py +0 -26
  39. xync_db-0.0.2.dev2/src/xync_db/config.py +0 -17
  40. xync_db-0.0.2.dev2/src/xync_db/exceptions.py +0 -18
  41. xync_db-0.0.2.dev2/src/xync_db/typs/__init__.py +0 -40
  42. xync_db-0.0.2.dev2/src/xync_db/typs/db/ad.py +0 -76
  43. xync_db-0.0.2.dev2/src/xync_db/typs/db/common.py +0 -24
  44. xync_db-0.0.2.dev2/src/xync_db/typs/db/order.py +0 -38
  45. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/logo.png +0 -0
  46. {xync_db-0.0.2.dev2 → xync_db-0.1.1}/src/xync_db/models/CLAUDE.md +0 -0
@@ -12,14 +12,16 @@ venv/
12
12
  htmlcov/
13
13
  dist/
14
14
  build/
15
+ *.log*
15
16
 
16
17
  # uv
17
18
  .uv-cache/
18
19
 
19
20
  # Node
20
21
  node_modules/
21
- packages/xync-web/dist/
22
- packages/xync-web/.vite/
22
+ packages/xync-coord/dist/
23
+ packages/xync-coord/.vite/
24
+ *.tsbuildinfo
23
25
 
24
26
  # Env
25
27
  .env
@@ -35,8 +37,12 @@ packages/xync-web/.vite/
35
37
  Thumbs.db
36
38
 
37
39
  # Generated
38
- packages/xync-web/src/api/schema.gen.ts
39
- openapi.json
40
+ # packages/xync-coord/src/api/schema.gen.ts is regenerated by `npm run codegen`
41
+ # (against the live API /schema/openapi.json), but stays tracked so `tsc -b`
42
+ # and CI work without a running API.
40
43
 
41
44
  # Claude state (board) — track this in git, but ignore live edits if user prefers:
42
45
  # .claude/state/log.md # uncomment to ignore the journal
46
+
47
+ packages/xync-web
48
+ packages/xync-chrome-ext
xync_db-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,348 @@
1
+ Metadata-Version: 2.4
2
+ Name: xync-db
3
+ Version: 0.1.1
4
+ Summary: Xync DB schema: Tortoise ORM models, enums, pydantic DTOs.
5
+ Author-email: Mike Artemiev <mixartemev@gmail.com>
6
+ License: LicenseRef-EULA
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: cryptography
9
+ Requires-Dist: pg-channel
10
+ Requires-Dist: pillow
11
+ Requires-Dist: pydantic-settings>=2.4
12
+ Requires-Dist: pypng
13
+ Requires-Dist: pyrogram-client
14
+ Requires-Dist: python-dotenv
15
+ Requires-Dist: qrcode[pil]
16
+ Requires-Dist: tortoise-orm[asyncpg]>=1.0
17
+ Requires-Dist: xn-auth
18
+ Description-Content-Type: text/markdown
19
+
20
+ # XyncDB
21
+ TortoiseORM models, enums, pydantic DTOs, and migrations для аггрегатора бирж/платформ p2p-торговли.
22
+ Single source of truth for data shape across the monorepo.
23
+
24
+ ### Основные db сущности:
25
+ - Ex: p2p биржа/платформа
26
+
27
+ - Person: сущность живого человека / физического лица
28
+ - User: Person являющийся нашим юзером (зареганный на нашей платформе xync)
29
+ - Actor: Person являющийся любым юзером на Ex (как 3-и лица: наши контрагенты в p2p-сделках, так и наши агенты)
30
+ - Agent: Actor xync-юзера с auth-доступами к Ex, может слать запросы. Сущность с помощью которой наши Users совершают действия на Ex. (Связь с User через Actor -> Person)
31
+ - Username: telegram id, nick-и, и возможно телефоны наших User-ов
32
+
33
+ - Cur: Фиатные(банковские) валюты
34
+ - CurEx: Cur на конкретной Ex, c minimum размером сделки в этой валюте, и ее десятичный scale-ом на этой Ex
35
+ - Coin: Крипто монеты
36
+ - CoinEx: Coin на конкретной Ex, c minimum размером сделки по этой монете, и ее десятичный scale-ом на этой Ex
37
+ - Pair: Все торговые пары Coin/Cur какие бывают
38
+ - PairEx: Pair которые есть на конкретной Ex
39
+ - PairSide: Направления is_sell(продажа или покупка) по каждой Pair
40
+ - Pm: Платежные системы (банки, кошельки, и тд) фиатных валют
41
+ - PmEx: Pm на конкретной бирже (содержимое таблицы pmex говорит о том, через какие Pm какие Ex поддерживают оплату сделок)
42
+ - PmCur: Пары Pm-Cur (таблица pmcur говорит какие Pm поддерживают какие Cur
43
+ - Cred: платежные реквизиты Person-a по конкретному PmCur
44
+ - Fiat: сумма на балансе конкретного Cred
45
+ - Addr: адрес по которому лежит определенный Coin конкретного Actor-a
46
+ - Asset: сумма, которая лежит на определенном Addr
47
+
48
+ - Ad: объявление maker-a (Actor) по PairSide (т.е: о покупке или продаже Coin за Cur) для конкретных Pm
49
+ - MyAd: Ad нашего Agent-a (Actor) по конкретным Fiat-ам
50
+ - Cond: текстовое описание условий сделки по Ad
51
+ - Order: сделка открытая taker-ом (Actor) по Ad, на определенную сумму на конкретный Cred того Actor-a, кто является продавцом в сделке
52
+ - Transfer: денежный перевод определенной сумму (amount) по конкретному Order-у
53
+ - Transaction: внутренний денежный перевод (на платформе xync) от User-а sender User-у receiver
54
+
55
+ ### Relations
56
+ ```mermaid
57
+ classDiagram
58
+ direction BT
59
+ class Actor {
60
+ uint8 exid
61
+ uint1 ex_id
62
+ varchar(63) name
63
+ integer person_id
64
+ integer id
65
+ }
66
+ class Ad {
67
+ uint8 exid
68
+ uint4 price
69
+ integer premium
70
+ uint4 amount
71
+ uint8 quantity
72
+ uint4 min_fiat
73
+ uint4 max_fiat
74
+ smallint status
75
+ boolean filtered
76
+ integer cond_id
77
+ integer maker_id
78
+ smallint pair_side_id
79
+ integer id
80
+ }
81
+ class ad_pm {
82
+ integer ad_id
83
+ integer pm_id
84
+ }
85
+ class Addr {
86
+ integer actor_id
87
+ smallint coin_id
88
+ integer id
89
+ }
90
+ class agent {
91
+ integer actor_id
92
+ jsonb auth
93
+ integer expire_at
94
+ smallint status
95
+ uint1 same_dir_ad
96
+ integer id
97
+ }
98
+ class Asset {
99
+ smallint typ
100
+ uint8 free
101
+ uint8 freeze
102
+ uint8 lock
103
+ uint8 target
104
+ integer addr_id
105
+ integer id
106
+ }
107
+ class coin {
108
+ varchar(15) ticker
109
+ uint1 scale
110
+ smallint typ
111
+ smallint id
112
+ }
113
+ class CoinEx {
114
+ varchar(32) exid
115
+ uint1 ex_id
116
+ smallint coin_id
117
+ bigint minimum
118
+ uint1 scale
119
+ boolean p2p
120
+ integer id
121
+ }
122
+ class cond {
123
+ varchar(4095) raw_txt
124
+ integer id
125
+ }
126
+ class Cred {
127
+ varchar(255) detail
128
+ varchar(127) name
129
+ integer pmcur_id
130
+ integer person_id
131
+ varchar(255) extra
132
+ integer ovr_pm_id
133
+ integer id
134
+ }
135
+ class CredEx {
136
+ uint8 exid
137
+ uint1 ex_id
138
+ integer cred_id
139
+ integer id
140
+ }
141
+ class Cur {
142
+ varchar(3) ticker
143
+ uint1 scale
144
+ uint1 id
145
+ }
146
+ class CurEx {
147
+ varchar(32) exid
148
+ uint1 cur_id
149
+ uint1 ex_id
150
+ uint4 minimum
151
+ uint1 scale
152
+ integer id
153
+ }
154
+ class Ex {
155
+ varchar(31) name
156
+ varchar(63) host
157
+ smallint typ
158
+ smallint status
159
+ varchar(511) logo
160
+ uint1 id
161
+ }
162
+ class Fiat {
163
+ uint4 amount
164
+ uint4 target
165
+ uint4 min_deposit
166
+ integer cred_id
167
+ integer id
168
+ }
169
+ class my_ad {
170
+ integer ad_id
171
+ uint1 target_place
172
+ bytea hex
173
+ timestamp(0) shared_at
174
+ boolean blocked
175
+ integer id
176
+ }
177
+ class myad_cred {
178
+ integer my_ad_id
179
+ integer credex_id
180
+ }
181
+ class Order {
182
+ uint8 exid
183
+ uint4 amount
184
+ uint8 quantity
185
+ smallint status
186
+ integer ad_id
187
+ integer cred_id
188
+ integer taker_id
189
+ uint2 maker_topic
190
+ uint2 taker_topic
191
+ timestamp updated_at
192
+ integer id
193
+ }
194
+ class Pair {
195
+ smallint coin_id
196
+ uint1 cur_id
197
+ bigint rate
198
+ smallint id
199
+ }
200
+ class pair_side {
201
+ smallint pair_id
202
+ boolean is_sell
203
+ smallint id
204
+ }
205
+ class PairEx {
206
+ smallint pair_id
207
+ uint1 ex_id
208
+ smallint fee
209
+ integer id
210
+ }
211
+ class person {
212
+ varchar(127) name
213
+ integer user_id
214
+ smallint status
215
+ varchar(255) note
216
+ integer id
217
+ }
218
+ class Pm {
219
+ varchar(255) norm
220
+ varchar(7) acronym
221
+ varchar(63) alias
222
+ boolean ok
223
+ boolean bank
224
+ boolean qr
225
+ uint2 fee
226
+ smallint typ
227
+ integer id
228
+ }
229
+ class PmCur {
230
+ uint1 cur_id
231
+ integer pm_id
232
+ integer id
233
+ }
234
+ class pmex {
235
+ varchar(63) exid
236
+ uint1 ex_id
237
+ integer pm_id
238
+ varchar(255) name
239
+ integer id
240
+ }
241
+ class transaction {
242
+ uint4 amount
243
+ smallint status
244
+ bytea proof
245
+ integer ts
246
+ uint1 cur_id
247
+ integer receiver_id
248
+ integer sender_id
249
+ uuid id
250
+ }
251
+ class transfer {
252
+ uint4 amount
253
+ varchar(32) pmid
254
+ varchar(63) sender_acc
255
+ integer order_id
256
+ integer file_id
257
+ integer id
258
+ }
259
+ class user {
260
+ varchar(63) first_name
261
+ varchar(31) last_name
262
+ varchar(127) pic
263
+ boolean blocked
264
+ smallint lang
265
+ smallint role
266
+ smallint status
267
+ uint2 bonus
268
+ smallint tz
269
+ bytea prv
270
+ bytea pub
271
+ integer ref_id
272
+ bigint username_id
273
+ integer id
274
+ }
275
+ class username {
276
+ varchar(127) username
277
+ uint8 phone
278
+ bigint id
279
+ }
280
+
281
+ Actor --> Ex : ex_id->ex.id
282
+ Actor --> person : person_id->person.id
283
+ Ad --> Actor : maker_id->maker.id
284
+ Ad --> cond : cond_id->cond.id
285
+ Ad --> pair_side : pair_side_id->pair_side.id
286
+ ad_pm --> Ad : ad_id->ad.id
287
+ ad_pm --> Pm : pm_id->pm.id
288
+ Addr --> Actor : actor_id->actor.id
289
+ Addr --> coin : coin_id->coin.id
290
+ agent --> Actor : actor_id->actor.id
291
+ Asset --> Addr : addr_id->addr.id
292
+ Asset --> agent : agent_id->agent.id
293
+ CoinEx --> coin : coin_id->coin.id
294
+ CoinEx --> Ex : ex_id->ex.id
295
+ Cred --> person : person_id->person.id
296
+ Cred --> Pm : ovr_pm_id->ovr_pm.id
297
+ Cred --> PmCur : pmcur_id->pmcur.id
298
+ CredEx --> Cred : cred_id->cred.id
299
+ CredEx --> Ex : ex_id->ex.id
300
+ CurEx --> Cur : cur_id->cur.id
301
+ CurEx --> Ex : ex_id->ex.id
302
+ Fiat --> Cred : cred_id->cred.id
303
+ my_ad --> Ad : ad_id->ad.id
304
+ myad_cred --> CredEx : credex_id->credex.id
305
+ myad_cred --> my_ad : my_ad_id->my_ad.id
306
+ Order --> Actor : taker_id->taker.id
307
+ Order --> Ad : ad_id->ad.id
308
+ Order --> Cred : cred_id->cred.id
309
+ Pair --> coin : coin_id->coin.id
310
+ Pair --> Cur : cur_id->cur.id
311
+ pair_side --> Pair : pair_id->pair.id
312
+ PairEx --> Ex : ex_id->ex.id
313
+ PairEx --> Pair : pair_id->pair.id
314
+ person --> user : user_id->user.id
315
+ Pm --> Cur : df_cur_id->df_cur.id
316
+ PmCur --> Cur : cur_id->cur.id
317
+ PmCur --> Pm : pm_id->pm.id
318
+ pmex --> Ex : ex_id->ex.id
319
+ pmex --> Pm : pm_id->pm.id
320
+ transaction --> Cur : cur_id->cur.id
321
+ transaction --> user : sender_id->sender.id
322
+ transaction --> user : receiver_id->receiver.id
323
+ transfer --> Order : order_id->order.id
324
+ user --> user : ref_id->ref.id
325
+ user --> username : username_id->username.id
326
+ ```
327
+
328
+ ###### Общее правило для всех сущностей, которые относятся к конкретной Ex:
329
+ `[Actor, CoinEx, CurEx, PmEx, CredEx, Ad, Order]`
330
+ - `id` - id сущности в нашей системе (в xync)
331
+ - `exid` - id сущности на этом `Ex`
332
+ - `ex_id` - id `Ex`-a которому принадлежит сущность
333
+
334
+ Исключение `Ad` и `Order`:
335
+ - в `Ad` нет непосредственно `ex_id`, у него есть `maker_id`, через которого получаем `actor.ex_id`
336
+ - а в `Order` соответственно через `ad_id` получаем `ad.actor.ex_id`
337
+
338
+
339
+ ## Migrations (native Tortoise CLI — no aerich)
340
+ ```bash
341
+ cd packages/xync-db
342
+ tortoise init # only once
343
+ tortoise makemigrations # detect changes
344
+ tortoise migrate # apply
345
+ tortoise downgrade models 0001_initial # roll back
346
+ tortoise sqlmigrate models 0001_initial # preview SQL
347
+ ```
348
+ Config lives in this package's `pyproject.toml` under `[tool.tortoise]`.
@@ -0,0 +1,329 @@
1
+ # XyncDB
2
+ TortoiseORM models, enums, pydantic DTOs, and migrations для аггрегатора бирж/платформ p2p-торговли.
3
+ Single source of truth for data shape across the monorepo.
4
+
5
+ ### Основные db сущности:
6
+ - Ex: p2p биржа/платформа
7
+
8
+ - Person: сущность живого человека / физического лица
9
+ - User: Person являющийся нашим юзером (зареганный на нашей платформе xync)
10
+ - Actor: Person являющийся любым юзером на Ex (как 3-и лица: наши контрагенты в p2p-сделках, так и наши агенты)
11
+ - Agent: Actor xync-юзера с auth-доступами к Ex, может слать запросы. Сущность с помощью которой наши Users совершают действия на Ex. (Связь с User через Actor -> Person)
12
+ - Username: telegram id, nick-и, и возможно телефоны наших User-ов
13
+
14
+ - Cur: Фиатные(банковские) валюты
15
+ - CurEx: Cur на конкретной Ex, c minimum размером сделки в этой валюте, и ее десятичный scale-ом на этой Ex
16
+ - Coin: Крипто монеты
17
+ - CoinEx: Coin на конкретной Ex, c minimum размером сделки по этой монете, и ее десятичный scale-ом на этой Ex
18
+ - Pair: Все торговые пары Coin/Cur какие бывают
19
+ - PairEx: Pair которые есть на конкретной Ex
20
+ - PairSide: Направления is_sell(продажа или покупка) по каждой Pair
21
+ - Pm: Платежные системы (банки, кошельки, и тд) фиатных валют
22
+ - PmEx: Pm на конкретной бирже (содержимое таблицы pmex говорит о том, через какие Pm какие Ex поддерживают оплату сделок)
23
+ - PmCur: Пары Pm-Cur (таблица pmcur говорит какие Pm поддерживают какие Cur
24
+ - Cred: платежные реквизиты Person-a по конкретному PmCur
25
+ - Fiat: сумма на балансе конкретного Cred
26
+ - Addr: адрес по которому лежит определенный Coin конкретного Actor-a
27
+ - Asset: сумма, которая лежит на определенном Addr
28
+
29
+ - Ad: объявление maker-a (Actor) по PairSide (т.е: о покупке или продаже Coin за Cur) для конкретных Pm
30
+ - MyAd: Ad нашего Agent-a (Actor) по конкретным Fiat-ам
31
+ - Cond: текстовое описание условий сделки по Ad
32
+ - Order: сделка открытая taker-ом (Actor) по Ad, на определенную сумму на конкретный Cred того Actor-a, кто является продавцом в сделке
33
+ - Transfer: денежный перевод определенной сумму (amount) по конкретному Order-у
34
+ - Transaction: внутренний денежный перевод (на платформе xync) от User-а sender User-у receiver
35
+
36
+ ### Relations
37
+ ```mermaid
38
+ classDiagram
39
+ direction BT
40
+ class Actor {
41
+ uint8 exid
42
+ uint1 ex_id
43
+ varchar(63) name
44
+ integer person_id
45
+ integer id
46
+ }
47
+ class Ad {
48
+ uint8 exid
49
+ uint4 price
50
+ integer premium
51
+ uint4 amount
52
+ uint8 quantity
53
+ uint4 min_fiat
54
+ uint4 max_fiat
55
+ smallint status
56
+ boolean filtered
57
+ integer cond_id
58
+ integer maker_id
59
+ smallint pair_side_id
60
+ integer id
61
+ }
62
+ class ad_pm {
63
+ integer ad_id
64
+ integer pm_id
65
+ }
66
+ class Addr {
67
+ integer actor_id
68
+ smallint coin_id
69
+ integer id
70
+ }
71
+ class agent {
72
+ integer actor_id
73
+ jsonb auth
74
+ integer expire_at
75
+ smallint status
76
+ uint1 same_dir_ad
77
+ integer id
78
+ }
79
+ class Asset {
80
+ smallint typ
81
+ uint8 free
82
+ uint8 freeze
83
+ uint8 lock
84
+ uint8 target
85
+ integer addr_id
86
+ integer id
87
+ }
88
+ class coin {
89
+ varchar(15) ticker
90
+ uint1 scale
91
+ smallint typ
92
+ smallint id
93
+ }
94
+ class CoinEx {
95
+ varchar(32) exid
96
+ uint1 ex_id
97
+ smallint coin_id
98
+ bigint minimum
99
+ uint1 scale
100
+ boolean p2p
101
+ integer id
102
+ }
103
+ class cond {
104
+ varchar(4095) raw_txt
105
+ integer id
106
+ }
107
+ class Cred {
108
+ varchar(255) detail
109
+ varchar(127) name
110
+ integer pmcur_id
111
+ integer person_id
112
+ varchar(255) extra
113
+ integer ovr_pm_id
114
+ integer id
115
+ }
116
+ class CredEx {
117
+ uint8 exid
118
+ uint1 ex_id
119
+ integer cred_id
120
+ integer id
121
+ }
122
+ class Cur {
123
+ varchar(3) ticker
124
+ uint1 scale
125
+ uint1 id
126
+ }
127
+ class CurEx {
128
+ varchar(32) exid
129
+ uint1 cur_id
130
+ uint1 ex_id
131
+ uint4 minimum
132
+ uint1 scale
133
+ integer id
134
+ }
135
+ class Ex {
136
+ varchar(31) name
137
+ varchar(63) host
138
+ smallint typ
139
+ smallint status
140
+ varchar(511) logo
141
+ uint1 id
142
+ }
143
+ class Fiat {
144
+ uint4 amount
145
+ uint4 target
146
+ uint4 min_deposit
147
+ integer cred_id
148
+ integer id
149
+ }
150
+ class my_ad {
151
+ integer ad_id
152
+ uint1 target_place
153
+ bytea hex
154
+ timestamp(0) shared_at
155
+ boolean blocked
156
+ integer id
157
+ }
158
+ class myad_cred {
159
+ integer my_ad_id
160
+ integer credex_id
161
+ }
162
+ class Order {
163
+ uint8 exid
164
+ uint4 amount
165
+ uint8 quantity
166
+ smallint status
167
+ integer ad_id
168
+ integer cred_id
169
+ integer taker_id
170
+ uint2 maker_topic
171
+ uint2 taker_topic
172
+ timestamp updated_at
173
+ integer id
174
+ }
175
+ class Pair {
176
+ smallint coin_id
177
+ uint1 cur_id
178
+ bigint rate
179
+ smallint id
180
+ }
181
+ class pair_side {
182
+ smallint pair_id
183
+ boolean is_sell
184
+ smallint id
185
+ }
186
+ class PairEx {
187
+ smallint pair_id
188
+ uint1 ex_id
189
+ smallint fee
190
+ integer id
191
+ }
192
+ class person {
193
+ varchar(127) name
194
+ integer user_id
195
+ smallint status
196
+ varchar(255) note
197
+ integer id
198
+ }
199
+ class Pm {
200
+ varchar(255) norm
201
+ varchar(7) acronym
202
+ varchar(63) alias
203
+ boolean ok
204
+ boolean bank
205
+ boolean qr
206
+ uint2 fee
207
+ smallint typ
208
+ integer id
209
+ }
210
+ class PmCur {
211
+ uint1 cur_id
212
+ integer pm_id
213
+ integer id
214
+ }
215
+ class pmex {
216
+ varchar(63) exid
217
+ uint1 ex_id
218
+ integer pm_id
219
+ varchar(255) name
220
+ integer id
221
+ }
222
+ class transaction {
223
+ uint4 amount
224
+ smallint status
225
+ bytea proof
226
+ integer ts
227
+ uint1 cur_id
228
+ integer receiver_id
229
+ integer sender_id
230
+ uuid id
231
+ }
232
+ class transfer {
233
+ uint4 amount
234
+ varchar(32) pmid
235
+ varchar(63) sender_acc
236
+ integer order_id
237
+ integer file_id
238
+ integer id
239
+ }
240
+ class user {
241
+ varchar(63) first_name
242
+ varchar(31) last_name
243
+ varchar(127) pic
244
+ boolean blocked
245
+ smallint lang
246
+ smallint role
247
+ smallint status
248
+ uint2 bonus
249
+ smallint tz
250
+ bytea prv
251
+ bytea pub
252
+ integer ref_id
253
+ bigint username_id
254
+ integer id
255
+ }
256
+ class username {
257
+ varchar(127) username
258
+ uint8 phone
259
+ bigint id
260
+ }
261
+
262
+ Actor --> Ex : ex_id->ex.id
263
+ Actor --> person : person_id->person.id
264
+ Ad --> Actor : maker_id->maker.id
265
+ Ad --> cond : cond_id->cond.id
266
+ Ad --> pair_side : pair_side_id->pair_side.id
267
+ ad_pm --> Ad : ad_id->ad.id
268
+ ad_pm --> Pm : pm_id->pm.id
269
+ Addr --> Actor : actor_id->actor.id
270
+ Addr --> coin : coin_id->coin.id
271
+ agent --> Actor : actor_id->actor.id
272
+ Asset --> Addr : addr_id->addr.id
273
+ Asset --> agent : agent_id->agent.id
274
+ CoinEx --> coin : coin_id->coin.id
275
+ CoinEx --> Ex : ex_id->ex.id
276
+ Cred --> person : person_id->person.id
277
+ Cred --> Pm : ovr_pm_id->ovr_pm.id
278
+ Cred --> PmCur : pmcur_id->pmcur.id
279
+ CredEx --> Cred : cred_id->cred.id
280
+ CredEx --> Ex : ex_id->ex.id
281
+ CurEx --> Cur : cur_id->cur.id
282
+ CurEx --> Ex : ex_id->ex.id
283
+ Fiat --> Cred : cred_id->cred.id
284
+ my_ad --> Ad : ad_id->ad.id
285
+ myad_cred --> CredEx : credex_id->credex.id
286
+ myad_cred --> my_ad : my_ad_id->my_ad.id
287
+ Order --> Actor : taker_id->taker.id
288
+ Order --> Ad : ad_id->ad.id
289
+ Order --> Cred : cred_id->cred.id
290
+ Pair --> coin : coin_id->coin.id
291
+ Pair --> Cur : cur_id->cur.id
292
+ pair_side --> Pair : pair_id->pair.id
293
+ PairEx --> Ex : ex_id->ex.id
294
+ PairEx --> Pair : pair_id->pair.id
295
+ person --> user : user_id->user.id
296
+ Pm --> Cur : df_cur_id->df_cur.id
297
+ PmCur --> Cur : cur_id->cur.id
298
+ PmCur --> Pm : pm_id->pm.id
299
+ pmex --> Ex : ex_id->ex.id
300
+ pmex --> Pm : pm_id->pm.id
301
+ transaction --> Cur : cur_id->cur.id
302
+ transaction --> user : sender_id->sender.id
303
+ transaction --> user : receiver_id->receiver.id
304
+ transfer --> Order : order_id->order.id
305
+ user --> user : ref_id->ref.id
306
+ user --> username : username_id->username.id
307
+ ```
308
+
309
+ ###### Общее правило для всех сущностей, которые относятся к конкретной Ex:
310
+ `[Actor, CoinEx, CurEx, PmEx, CredEx, Ad, Order]`
311
+ - `id` - id сущности в нашей системе (в xync)
312
+ - `exid` - id сущности на этом `Ex`
313
+ - `ex_id` - id `Ex`-a которому принадлежит сущность
314
+
315
+ Исключение `Ad` и `Order`:
316
+ - в `Ad` нет непосредственно `ex_id`, у него есть `maker_id`, через которого получаем `actor.ex_id`
317
+ - а в `Order` соответственно через `ad_id` получаем `ad.actor.ex_id`
318
+
319
+
320
+ ## Migrations (native Tortoise CLI — no aerich)
321
+ ```bash
322
+ cd packages/xync-db
323
+ tortoise init # only once
324
+ tortoise makemigrations # detect changes
325
+ tortoise migrate # apply
326
+ tortoise downgrade models 0001_initial # roll back
327
+ tortoise sqlmigrate models 0001_initial # preview SQL
328
+ ```
329
+ Config lives in this package's `pyproject.toml` under `[tool.tortoise]`.