@pasosdejesus/m 0.27.1 → 0.28.0
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.
- package/README.md +2 -2
- package/dist/CHANGELOG.md +141 -0
- package/dist/compose/derive.d.ts +53 -0
- package/dist/compose/derive.d.ts.map +1 -0
- package/dist/compose/derive.js +128 -0
- package/dist/compose/derive.js.map +1 -0
- package/dist/compose/discover.d.ts +32 -0
- package/dist/compose/discover.d.ts.map +1 -0
- package/dist/compose/discover.js +96 -0
- package/dist/compose/discover.js.map +1 -0
- package/dist/compose/index.d.ts +17 -0
- package/dist/compose/index.d.ts.map +1 -0
- package/dist/compose/index.js +16 -0
- package/dist/compose/index.js.map +1 -0
- package/dist/compose/manifest.d.ts +89 -0
- package/dist/compose/manifest.d.ts.map +1 -0
- package/dist/compose/manifest.js +16 -0
- package/dist/compose/manifest.js.map +1 -0
- package/dist/compose/sync.d.ts +12 -0
- package/dist/compose/sync.d.ts.map +1 -0
- package/dist/compose/sync.js +27 -0
- package/dist/compose/sync.js.map +1 -0
- package/dist/compose/usage.d.ts +54 -0
- package/dist/compose/usage.d.ts.map +1 -0
- package/dist/compose/usage.js +167 -0
- package/dist/compose/usage.js.map +1 -0
- package/dist/compose/vendor.d.ts +45 -0
- package/dist/compose/vendor.d.ts.map +1 -0
- package/dist/compose/vendor.js +147 -0
- package/dist/compose/vendor.js.map +1 -0
- package/dist/compose/verify.d.ts +11 -0
- package/dist/compose/verify.d.ts.map +1 -0
- package/dist/compose/verify.js +74 -0
- package/dist/compose/verify.js.map +1 -0
- package/dist/e2e/env.d.ts +1 -1
- package/dist/e2e/env.js +3 -3
- package/dist/e2e/env.js.map +1 -1
- package/dist/e2e/local-node.js +1 -1
- package/dist/e2e/local-node.js.map +1 -1
- package/dist/e2e/wallet-mock.js +1 -1
- package/dist/e2e/wallet-mock.js.map +1 -1
- package/dist/e2e/warmup.js +1 -1
- package/dist/e2e/warmup.js.map +1 -1
- package/dist/engine.d.ts +3 -16
- package/dist/engine.d.ts.map +1 -1
- package/dist/i18n/locales/cli.d.ts.map +1 -1
- package/dist/i18n/locales/cli.js +16 -10
- package/dist/i18n/locales/cli.js.map +1 -1
- package/dist/m.js +13 -10
- package/dist/m.js.map +1 -1
- package/dist/shadcn_components/ui/button.d.ts +1 -1
- package/dist/tasks/create.d.ts +7 -2
- package/dist/tasks/create.d.ts.map +1 -1
- package/dist/tasks/create.js +13 -17
- package/dist/tasks/create.js.map +1 -1
- package/dist/tasks/db.d.ts +2 -1
- package/dist/tasks/db.d.ts.map +1 -1
- package/dist/tasks/db.js +14 -11
- package/dist/tasks/db.js.map +1 -1
- package/dist/tasks/e2e-summary.js +1 -1
- package/dist/tasks/e2e-summary.js.map +1 -1
- package/dist/tasks/e2e.js +1 -1
- package/dist/tasks/e2e.js.map +1 -1
- package/dist/tasks/engine.d.ts.map +1 -1
- package/dist/tasks/engine.js +246 -17
- package/dist/tasks/engine.js.map +1 -1
- package/dist/tasks/msip.d.ts +11 -0
- package/dist/tasks/msip.d.ts.map +1 -0
- package/dist/tasks/{base-model.js → msip.js} +161 -25
- package/dist/tasks/msip.js.map +1 -0
- package/dist/tasks/update.d.ts +16 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +61 -10
- package/dist/tasks/update.js.map +1 -1
- package/dist/tasks/warmup.js +1 -1
- package/dist/tasks/warmup.js.map +1 -1
- package/dist/templates/apps/hardhat/README.md +0 -8
- package/dist/templates/apps/nextjs/bin/m +3 -0
- package/dist/templates/apps/nextjs/package.json.hbs +1 -0
- package/dist/templates/apps/nextjs/tests/global-setup.ts +28 -0
- package/dist/templates/apps/nextjs/vitest.config.ts +3 -0
- package/dist/test-utils/console.d.ts +1 -1
- package/dist/test-utils/console.js +1 -1
- package/dist/test-utils/kysely-mocks.d.ts +1 -1
- package/dist/test-utils/kysely-mocks.js +1 -1
- package/dist/test-utils/wallet-mocks.js +1 -1
- package/dist/test-utils/wallet-setup.js +1 -1
- package/dist/util/engines.d.ts +4 -6
- package/dist/util/engines.d.ts.map +1 -1
- package/dist/util/engines.js +5 -38
- package/dist/util/engines.js.map +1 -1
- package/dist/util/msip.d.ts +17 -0
- package/dist/util/msip.d.ts.map +1 -0
- package/dist/util/msip.js +86 -0
- package/dist/util/msip.js.map +1 -0
- package/dist/wallet/index.js +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/next/i18n.d.ts +1 -1
- package/dist/wallet/next/i18n.js +1 -1
- package/dist/wallet/next/index.js +1 -1
- package/dist/wallet/next/index.js.map +1 -1
- package/dist/wallet/next/namespaces.d.ts +1 -1
- package/dist/wallet/next/namespaces.js +1 -1
- package/dist/wallet/storage/idb.d.ts +1 -1
- package/dist/wallet/storage/idb.js +1 -1
- package/package.json +4 -6
- package/src/e2e/README.md +6 -6
- package/src/tasks/README.md +3 -3
- package/src/test-utils/README.md +2 -2
- package/src/wallet/README.md +4 -4
- package/dist/base-model/baseline.generated.d.ts +0 -48
- package/dist/base-model/baseline.generated.d.ts.map +0 -1
- package/dist/base-model/baseline.generated.js +0 -930
- package/dist/base-model/baseline.generated.js.map +0 -1
- package/dist/base-model/check.d.ts +0 -6
- package/dist/base-model/check.d.ts.map +0 -1
- package/dist/base-model/check.js +0 -195
- package/dist/base-model/check.js.map +0 -1
- package/dist/base-model/forward/baseline_1_0_0.d.ts +0 -3
- package/dist/base-model/forward/baseline_1_0_0.d.ts.map +0 -1
- package/dist/base-model/forward/baseline_1_0_0.js +0 -23
- package/dist/base-model/forward/baseline_1_0_0.js.map +0 -1
- package/dist/base-model/forward/index.d.ts +0 -28
- package/dist/base-model/forward/index.d.ts.map +0 -1
- package/dist/base-model/forward/index.js +0 -126
- package/dist/base-model/forward/index.js.map +0 -1
- package/dist/base-model/forward/index.test.d.ts +0 -2
- package/dist/base-model/forward/index.test.d.ts.map +0 -1
- package/dist/base-model/forward/index.test.js +0 -65
- package/dist/base-model/forward/index.test.js.map +0 -1
- package/dist/base-model/forward/policy.d.ts +0 -16
- package/dist/base-model/forward/policy.d.ts.map +0 -1
- package/dist/base-model/forward/policy.js +0 -37
- package/dist/base-model/forward/policy.js.map +0 -1
- package/dist/base-model/forward/policy.test.d.ts +0 -2
- package/dist/base-model/forward/policy.test.d.ts.map +0 -1
- package/dist/base-model/forward/policy.test.js +0 -40
- package/dist/base-model/forward/policy.test.js.map +0 -1
- package/dist/base-model/forward/types.d.ts +0 -21
- package/dist/base-model/forward/types.d.ts.map +0 -1
- package/dist/base-model/forward/types.js +0 -2
- package/dist/base-model/forward/types.js.map +0 -1
- package/dist/base-model/generate.d.ts +0 -42
- package/dist/base-model/generate.d.ts.map +0 -1
- package/dist/base-model/generate.js +0 -241
- package/dist/base-model/generate.js.map +0 -1
- package/dist/base-model/guidelines.d.ts +0 -13
- package/dist/base-model/guidelines.d.ts.map +0 -1
- package/dist/base-model/guidelines.js +0 -61
- package/dist/base-model/guidelines.js.map +0 -1
- package/dist/base-model/index.d.ts +0 -24
- package/dist/base-model/index.d.ts.map +0 -1
- package/dist/base-model/index.js +0 -29
- package/dist/base-model/index.js.map +0 -1
- package/dist/base-model/parse-structure.d.ts +0 -4
- package/dist/base-model/parse-structure.d.ts.map +0 -1
- package/dist/base-model/parse-structure.js +0 -170
- package/dist/base-model/parse-structure.js.map +0 -1
- package/dist/base-model/queries.d.ts +0 -34
- package/dist/base-model/queries.d.ts.map +0 -1
- package/dist/base-model/queries.js +0 -118
- package/dist/base-model/queries.js.map +0 -1
- package/dist/base-model/references/learn-tg.d.ts +0 -21
- package/dist/base-model/references/learn-tg.d.ts.map +0 -1
- package/dist/base-model/references/learn-tg.js +0 -65
- package/dist/base-model/references/learn-tg.js.map +0 -1
- package/dist/base-model/references/msip.d.ts +0 -29
- package/dist/base-model/references/msip.d.ts.map +0 -1
- package/dist/base-model/references/msip.js +0 -33
- package/dist/base-model/references/msip.js.map +0 -1
- package/dist/base-model/types.d.ts +0 -207
- package/dist/base-model/types.d.ts.map +0 -1
- package/dist/base-model/types.js +0 -10
- package/dist/base-model/types.js.map +0 -1
- package/dist/base-model/version.d.ts +0 -19
- package/dist/base-model/version.d.ts.map +0 -1
- package/dist/base-model/version.js +0 -26
- package/dist/base-model/version.js.map +0 -1
- package/dist/base-model/wallet-link.d.ts +0 -69
- package/dist/base-model/wallet-link.d.ts.map +0 -1
- package/dist/base-model/wallet-link.js +0 -220
- package/dist/base-model/wallet-link.js.map +0 -1
- package/dist/base-model/wallet-link.test.d.ts +0 -2
- package/dist/base-model/wallet-link.test.d.ts.map +0 -1
- package/dist/base-model/wallet-link.test.js +0 -147
- package/dist/base-model/wallet-link.test.js.map +0 -1
- package/dist/e2e/env.test.d.ts +0 -2
- package/dist/e2e/env.test.d.ts.map +0 -1
- package/dist/e2e/env.test.js +0 -72
- package/dist/e2e/env.test.js.map +0 -1
- package/dist/e2e/full-wallet.test.d.ts +0 -2
- package/dist/e2e/full-wallet.test.d.ts.map +0 -1
- package/dist/e2e/full-wallet.test.js +0 -63
- package/dist/e2e/full-wallet.test.js.map +0 -1
- package/dist/e2e/in-app-wallet.test.d.ts +0 -2
- package/dist/e2e/in-app-wallet.test.d.ts.map +0 -1
- package/dist/e2e/in-app-wallet.test.js +0 -52
- package/dist/e2e/in-app-wallet.test.js.map +0 -1
- package/dist/e2e/local-node.test.d.ts +0 -2
- package/dist/e2e/local-node.test.d.ts.map +0 -1
- package/dist/e2e/local-node.test.js +0 -43
- package/dist/e2e/local-node.test.js.map +0 -1
- package/dist/e2e/retry.test.d.ts +0 -2
- package/dist/e2e/retry.test.d.ts.map +0 -1
- package/dist/e2e/retry.test.js +0 -43
- package/dist/e2e/retry.test.js.map +0 -1
- package/dist/e2e/signer.test.d.ts +0 -2
- package/dist/e2e/signer.test.d.ts.map +0 -1
- package/dist/e2e/signer.test.js +0 -57
- package/dist/e2e/signer.test.js.map +0 -1
- package/dist/e2e/siwe-optional.test.d.ts +0 -2
- package/dist/e2e/siwe-optional.test.d.ts.map +0 -1
- package/dist/e2e/siwe-optional.test.js +0 -13
- package/dist/e2e/siwe-optional.test.js.map +0 -1
- package/dist/e2e/wallet-mock.test.d.ts +0 -2
- package/dist/e2e/wallet-mock.test.d.ts.map +0 -1
- package/dist/e2e/wallet-mock.test.js +0 -28
- package/dist/e2e/wallet-mock.test.js.map +0 -1
- package/dist/e2e/warmup.test.d.ts +0 -2
- package/dist/e2e/warmup.test.d.ts.map +0 -1
- package/dist/e2e/warmup.test.js +0 -67
- package/dist/e2e/warmup.test.js.map +0 -1
- package/dist/engine.test.d.ts +0 -2
- package/dist/engine.test.d.ts.map +0 -1
- package/dist/engine.test.js +0 -35
- package/dist/engine.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -11
- package/dist/index.test.js.map +0 -1
- package/dist/tasks/base-model.d.ts +0 -5
- package/dist/tasks/base-model.d.ts.map +0 -1
- package/dist/tasks/base-model.js.map +0 -1
- package/dist/tasks/e2e.test.d.ts +0 -2
- package/dist/tasks/e2e.test.d.ts.map +0 -1
- package/dist/tasks/e2e.test.js +0 -108
- package/dist/tasks/e2e.test.js.map +0 -1
- package/dist/tasks/warmup.test.d.ts +0 -2
- package/dist/tasks/warmup.test.d.ts.map +0 -1
- package/dist/tasks/warmup.test.js +0 -40
- package/dist/tasks/warmup.test.js.map +0 -1
- package/dist/templates/apps/nextjs/tests/index.test.ts +0 -7
- package/dist/templates/apps/nextjs/tests/test-utils.example.test.ts +0 -169
- package/dist/templates/apps/nextjs/tsconfig.test.json +0 -38
- package/dist/test-utils/console.test.d.ts +0 -2
- package/dist/test-utils/console.test.d.ts.map +0 -1
- package/dist/test-utils/console.test.js +0 -70
- package/dist/test-utils/console.test.js.map +0 -1
- package/dist/test-utils/kysely-mocks.test.d.ts +0 -2
- package/dist/test-utils/kysely-mocks.test.d.ts.map +0 -1
- package/dist/test-utils/kysely-mocks.test.js +0 -126
- package/dist/test-utils/kysely-mocks.test.js.map +0 -1
- package/dist/test-utils/wallet-mocks.test.d.ts +0 -2
- package/dist/test-utils/wallet-mocks.test.d.ts.map +0 -1
- package/dist/test-utils/wallet-mocks.test.js +0 -55
- package/dist/test-utils/wallet-mocks.test.js.map +0 -1
- package/dist/test-utils/wallet-setup.test.d.ts +0 -2
- package/dist/test-utils/wallet-setup.test.d.ts.map +0 -1
- package/dist/test-utils/wallet-setup.test.js +0 -18
- package/dist/test-utils/wallet-setup.test.js.map +0 -1
- package/dist/util/engines.test.d.ts +0 -2
- package/dist/util/engines.test.d.ts.map +0 -1
- package/dist/util/engines.test.js +0 -79
- package/dist/util/engines.test.js.map +0 -1
- package/dist/wallet/biometric.test.d.ts +0 -2
- package/dist/wallet/biometric.test.d.ts.map +0 -1
- package/dist/wallet/biometric.test.js +0 -44
- package/dist/wallet/biometric.test.js.map +0 -1
- package/dist/wallet/crypto.test.d.ts +0 -2
- package/dist/wallet/crypto.test.d.ts.map +0 -1
- package/dist/wallet/crypto.test.js +0 -34
- package/dist/wallet/crypto.test.js.map +0 -1
- package/dist/wallet/destinations.test.d.ts +0 -2
- package/dist/wallet/destinations.test.d.ts.map +0 -1
- package/dist/wallet/destinations.test.js +0 -34
- package/dist/wallet/destinations.test.js.map +0 -1
- package/dist/wallet/external-provider.test.d.ts +0 -2
- package/dist/wallet/external-provider.test.d.ts.map +0 -1
- package/dist/wallet/external-provider.test.js +0 -44
- package/dist/wallet/external-provider.test.js.map +0 -1
- package/dist/wallet/indexeddb.test.d.ts +0 -2
- package/dist/wallet/indexeddb.test.d.ts.map +0 -1
- package/dist/wallet/indexeddb.test.js +0 -28
- package/dist/wallet/indexeddb.test.js.map +0 -1
- package/dist/wallet/kdf.test.d.ts +0 -2
- package/dist/wallet/kdf.test.d.ts.map +0 -1
- package/dist/wallet/kdf.test.js +0 -54
- package/dist/wallet/kdf.test.js.map +0 -1
- package/dist/wallet/next/components.test.d.ts +0 -2
- package/dist/wallet/next/components.test.d.ts.map +0 -1
- package/dist/wallet/next/components.test.js +0 -122
- package/dist/wallet/next/components.test.js.map +0 -1
- package/dist/wallet/next/useInAppWallet.test.d.ts +0 -2
- package/dist/wallet/next/useInAppWallet.test.d.ts.map +0 -1
- package/dist/wallet/next/useInAppWallet.test.js +0 -261
- package/dist/wallet/next/useInAppWallet.test.js.map +0 -1
- package/dist/wallet/provider.test.d.ts +0 -2
- package/dist/wallet/provider.test.d.ts.map +0 -1
- package/dist/wallet/provider.test.js +0 -170
- package/dist/wallet/provider.test.js.map +0 -1
- package/dist/wallet/signer.test.d.ts +0 -2
- package/dist/wallet/signer.test.d.ts.map +0 -1
- package/dist/wallet/signer.test.js +0 -62
- package/dist/wallet/signer.test.js.map +0 -1
- package/dist/wallet/storage.test.d.ts +0 -2
- package/dist/wallet/storage.test.d.ts.map +0 -1
- package/dist/wallet/storage.test.js +0 -103
- package/dist/wallet/storage.test.js.map +0 -1
- package/dist/wallet/wallet.test.d.ts +0 -2
- package/dist/wallet/wallet.test.d.ts.map +0 -1
- package/dist/wallet/wallet.test.js +0 -150
- package/dist/wallet/wallet.test.js.map +0 -1
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types of the base model (learn.tg REQ/260, Part A in `m`).
|
|
3
|
-
*
|
|
4
|
-
* The DB handle is injected through `SqlExecutor`: `m` never creates a
|
|
5
|
-
* connection and never depends on a query builder at runtime (decision D3).
|
|
6
|
-
* Consumers can pass a `pg` Pool/Client (its `query(text, values)` already has
|
|
7
|
-
* this shape) or a small adapter over Kysely's `executeQuery`.
|
|
8
|
-
*/
|
|
9
|
-
export interface SqlExecutor {
|
|
10
|
-
query<R = Record<string, unknown>>(text: string, params?: unknown[]): Promise<{
|
|
11
|
-
rows: R[];
|
|
12
|
-
}>;
|
|
13
|
-
}
|
|
14
|
-
export interface ColumnSpec {
|
|
15
|
-
name: string;
|
|
16
|
-
type: string;
|
|
17
|
-
notNull: boolean;
|
|
18
|
-
default?: string;
|
|
19
|
-
}
|
|
20
|
-
export interface ConstraintSpec {
|
|
21
|
-
name: string;
|
|
22
|
-
kind: 'primary-key' | 'unique' | 'foreign-key' | 'check';
|
|
23
|
-
definition: string;
|
|
24
|
-
columns: string[];
|
|
25
|
-
references?: {
|
|
26
|
-
table: string;
|
|
27
|
-
columns: string[];
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
export interface TableSpec {
|
|
31
|
-
name: string;
|
|
32
|
-
columns: ColumnSpec[];
|
|
33
|
-
constraints: ConstraintSpec[];
|
|
34
|
-
}
|
|
35
|
-
export interface SequenceSpec {
|
|
36
|
-
name: string;
|
|
37
|
-
definition: string;
|
|
38
|
-
ownedBy?: {
|
|
39
|
-
table: string;
|
|
40
|
-
column: string;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
export interface ServerDefaultSpec {
|
|
44
|
-
table: string;
|
|
45
|
-
column: string;
|
|
46
|
-
default: string;
|
|
47
|
-
}
|
|
48
|
-
export interface IndexSpec {
|
|
49
|
-
name: string;
|
|
50
|
-
table: string;
|
|
51
|
-
unique: boolean;
|
|
52
|
-
definition: string;
|
|
53
|
-
}
|
|
54
|
-
export interface ParsedStructure {
|
|
55
|
-
tables: Record<string, TableSpec>;
|
|
56
|
-
sequences: Record<string, SequenceSpec>;
|
|
57
|
-
serverDefaults: ServerDefaultSpec[];
|
|
58
|
-
indexes: IndexSpec[];
|
|
59
|
-
}
|
|
60
|
-
export interface BaselineInventory {
|
|
61
|
-
version: string;
|
|
62
|
-
tables: Record<string, {
|
|
63
|
-
columns: Record<string, ColumnSpec>;
|
|
64
|
-
constraints: ConstraintSpec[];
|
|
65
|
-
}>;
|
|
66
|
-
counts: Record<string, number>;
|
|
67
|
-
}
|
|
68
|
-
export interface BaselineExtensions {
|
|
69
|
-
/** "table.column" entries that belong to the consumer, not to the base. */
|
|
70
|
-
columns: string[];
|
|
71
|
-
/** "table.constraint" entries that belong to the consumer. */
|
|
72
|
-
constraints: string[];
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Entries the base model declares **beyond** its reference database.
|
|
76
|
-
*
|
|
77
|
-
* The reference (msip-2.2) is the source of truth for the shared columns; this
|
|
78
|
-
* list is the reviewed addition for everything the base model wants and the
|
|
79
|
-
* reference does not have yet: a whole table the consumer apps share (the wallet
|
|
80
|
-
* link), columns the base queries use, or an integrity rule. It is the mirror of
|
|
81
|
-
* `BaselineExtensions` when the reference is a superset: with a subset reference
|
|
82
|
-
* (msip) there is nothing to subtract, only something to add.
|
|
83
|
-
*/
|
|
84
|
-
export interface BaselineAdditions {
|
|
85
|
-
/** Tables the base declares although the reference does not have them. */
|
|
86
|
-
tables: TableSpec[];
|
|
87
|
-
/** Sequences those tables need (their `id` defaults). */
|
|
88
|
-
sequences: SequenceSpec[];
|
|
89
|
-
/** Columns added to tables that do exist in the reference. */
|
|
90
|
-
columns: Array<ColumnSpec & {
|
|
91
|
-
table: string;
|
|
92
|
-
}>;
|
|
93
|
-
/** Constraints added to tables that do exist in the reference. */
|
|
94
|
-
constraints: Array<ConstraintSpec & {
|
|
95
|
-
table: string;
|
|
96
|
-
}>;
|
|
97
|
-
}
|
|
98
|
-
export type CheckGrade = 'drift' | 'absent' | 'extra';
|
|
99
|
-
export interface CheckFinding {
|
|
100
|
-
table: string;
|
|
101
|
-
column?: string;
|
|
102
|
-
constraint?: string;
|
|
103
|
-
grade: CheckGrade;
|
|
104
|
-
detail: string;
|
|
105
|
-
}
|
|
106
|
-
export interface CheckReport {
|
|
107
|
-
ok: boolean;
|
|
108
|
-
baseModelVersion: string;
|
|
109
|
-
findings: CheckFinding[];
|
|
110
|
-
tablesChecked: number;
|
|
111
|
-
tablesAbsent: string[];
|
|
112
|
-
summary: {
|
|
113
|
-
drift: number;
|
|
114
|
-
absent: number;
|
|
115
|
-
extra: number;
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
/** Base columns of the learner (groups A and B of the upstream annex). */
|
|
119
|
-
export interface UsuarioBase {
|
|
120
|
-
id: number;
|
|
121
|
-
nusuario: string;
|
|
122
|
-
nombre?: string | null;
|
|
123
|
-
descripcion?: string | null;
|
|
124
|
-
email: string;
|
|
125
|
-
rol?: number | null;
|
|
126
|
-
idioma?: string | null;
|
|
127
|
-
pais_id?: number | null;
|
|
128
|
-
religion_id?: number | null;
|
|
129
|
-
oficina_id?: number | null;
|
|
130
|
-
tema_id?: number | null;
|
|
131
|
-
fechacreacion: string;
|
|
132
|
-
fechadeshabilitacion?: string | null;
|
|
133
|
-
created_at?: string | null;
|
|
134
|
-
updated_at?: string | null;
|
|
135
|
-
[extension: string]: unknown;
|
|
136
|
-
}
|
|
137
|
-
/** Legacy columns kept for the Rails backoffice; `m` types but never writes them. */
|
|
138
|
-
export interface UsuarioLegacy {
|
|
139
|
-
password?: string;
|
|
140
|
-
encrypted_password?: string;
|
|
141
|
-
reset_password_token?: string | null;
|
|
142
|
-
sign_in_count?: number;
|
|
143
|
-
failed_attempts?: number;
|
|
144
|
-
unlock_token?: string | null;
|
|
145
|
-
locked_at?: string | null;
|
|
146
|
-
}
|
|
147
|
-
export interface Usuario extends UsuarioBase, UsuarioLegacy {
|
|
148
|
-
}
|
|
149
|
-
export interface BilleteraUsuario {
|
|
150
|
-
id: number;
|
|
151
|
-
billetera: string;
|
|
152
|
-
usuario_id: number;
|
|
153
|
-
created_at: string;
|
|
154
|
-
updated_at: string;
|
|
155
|
-
[extension: string]: unknown;
|
|
156
|
-
}
|
|
157
|
-
export interface Pais {
|
|
158
|
-
id: number;
|
|
159
|
-
nombre: string;
|
|
160
|
-
alfa2?: string | null;
|
|
161
|
-
alfa3?: string | null;
|
|
162
|
-
fechacreacion?: string | null;
|
|
163
|
-
fechadeshabilitacion?: string | null;
|
|
164
|
-
[extension: string]: unknown;
|
|
165
|
-
}
|
|
166
|
-
export interface Departamento extends Pais {
|
|
167
|
-
}
|
|
168
|
-
export interface Municipio {
|
|
169
|
-
id: number;
|
|
170
|
-
nombre: string;
|
|
171
|
-
departamento_id?: number | null;
|
|
172
|
-
pais_id?: number | null;
|
|
173
|
-
fechacreacion?: string | null;
|
|
174
|
-
fechadeshabilitacion?: string | null;
|
|
175
|
-
[extension: string]: unknown;
|
|
176
|
-
}
|
|
177
|
-
export interface CentroPoblado {
|
|
178
|
-
id: number;
|
|
179
|
-
nombre: string;
|
|
180
|
-
municipio_id?: number | null;
|
|
181
|
-
departamento_id?: number | null;
|
|
182
|
-
pais_id?: number | null;
|
|
183
|
-
fechacreacion?: string | null;
|
|
184
|
-
fechadeshabilitacion?: string | null;
|
|
185
|
-
[extension: string]: unknown;
|
|
186
|
-
}
|
|
187
|
-
export interface VisibilityConfig {
|
|
188
|
-
/** Column that marks a row as publicly visible (e.g. `mostrar_cursos_publico`). */
|
|
189
|
-
columns: string[];
|
|
190
|
-
/** Value that means "public"; defaults to boolean true. */
|
|
191
|
-
publicValue?: unknown;
|
|
192
|
-
}
|
|
193
|
-
export interface GeoCascadeQuery {
|
|
194
|
-
q?: string;
|
|
195
|
-
municipalityId?: number;
|
|
196
|
-
departamentoId?: number;
|
|
197
|
-
limit?: number;
|
|
198
|
-
}
|
|
199
|
-
export interface TownResult {
|
|
200
|
-
id: number;
|
|
201
|
-
nombre: string;
|
|
202
|
-
municipio_id?: number | null;
|
|
203
|
-
municipio?: string | null;
|
|
204
|
-
departamento?: string | null;
|
|
205
|
-
pais?: string | null;
|
|
206
|
-
}
|
|
207
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/base-model/types.ts"],"names":[],"mappings":"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"}
|
package/dist/base-model/types.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types of the base model (learn.tg REQ/260, Part A in `m`).
|
|
3
|
-
*
|
|
4
|
-
* The DB handle is injected through `SqlExecutor`: `m` never creates a
|
|
5
|
-
* connection and never depends on a query builder at runtime (decision D3).
|
|
6
|
-
* Consumers can pass a `pg` Pool/Client (its `query(text, values)` already has
|
|
7
|
-
* this shape) or a small adapter over Kysely's `executeQuery`.
|
|
8
|
-
*/
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/base-model/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base model version published by `m`.
|
|
3
|
-
*
|
|
4
|
-
* Independent from `@pasosdejesus/m`'s own version: a change in the base
|
|
5
|
-
* columns is breaking for consumers even when `m`'s API does not change, so it
|
|
6
|
-
* has its own axis (learn.tg REQ/260, decision D1).
|
|
7
|
-
*/
|
|
8
|
-
export declare const BASE_MODEL_VERSION = "1.0.0";
|
|
9
|
-
/**
|
|
10
|
-
* Tables of the base model: those the reference (msip-2.2) has and the base
|
|
11
|
-
* publishes. `billetera_usuario` is **not** here because msip-2.2 does not have
|
|
12
|
-
* it: the wallet link is an optional extension (see `wallet-link.ts`). A table
|
|
13
|
-
* declared as an addition in `references/msip.ts` is also considered, so a
|
|
14
|
-
* future base table does not need a change here.
|
|
15
|
-
*/
|
|
16
|
-
export declare const BASE_MODEL_TABLES: readonly ["usuario", "msip_pais", "msip_departamento", "msip_municipio", "msip_centropoblado"];
|
|
17
|
-
export type BaseModelTable = (typeof BASE_MODEL_TABLES)[number];
|
|
18
|
-
export declare function isBaseModelTable(name: string): name is BaseModelTable;
|
|
19
|
-
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/base-model/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,gGAMpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAErE"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base model version published by `m`.
|
|
3
|
-
*
|
|
4
|
-
* Independent from `@pasosdejesus/m`'s own version: a change in the base
|
|
5
|
-
* columns is breaking for consumers even when `m`'s API does not change, so it
|
|
6
|
-
* has its own axis (learn.tg REQ/260, decision D1).
|
|
7
|
-
*/
|
|
8
|
-
export const BASE_MODEL_VERSION = '1.0.0';
|
|
9
|
-
/**
|
|
10
|
-
* Tables of the base model: those the reference (msip-2.2) has and the base
|
|
11
|
-
* publishes. `billetera_usuario` is **not** here because msip-2.2 does not have
|
|
12
|
-
* it: the wallet link is an optional extension (see `wallet-link.ts`). A table
|
|
13
|
-
* declared as an addition in `references/msip.ts` is also considered, so a
|
|
14
|
-
* future base table does not need a change here.
|
|
15
|
-
*/
|
|
16
|
-
export const BASE_MODEL_TABLES = [
|
|
17
|
-
'usuario',
|
|
18
|
-
'msip_pais',
|
|
19
|
-
'msip_departamento',
|
|
20
|
-
'msip_municipio',
|
|
21
|
-
'msip_centropoblado',
|
|
22
|
-
];
|
|
23
|
-
export function isBaseModelTable(name) {
|
|
24
|
-
return BASE_MODEL_TABLES.includes(name);
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=version.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/base-model/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,WAAW;IACX,mBAAmB;IACnB,gBAAgB;IAChB,oBAAoB;CACZ,CAAC;AAIX,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { SqlExecutor, Usuario } from './types.js';
|
|
2
|
-
/** Normaliza una dirección de billetera (las direcciones son case-insensitive). */
|
|
3
|
-
export declare function normalizeWallet(wallet: string): string;
|
|
4
|
-
/** DDL de referencia de la tabla del enlace (idempotente con IF NOT EXISTS). */
|
|
5
|
-
export declare const WALLET_LINK_DDL = "CREATE TABLE IF NOT EXISTS public.billetera_usuario (\n id bigint DEFAULT nextval('public.billetera_usuario_id_seq'::regclass) NOT NULL,\n billetera character varying(60) NOT NULL,\n usuario_id integer NOT NULL,\n nonce character varying(255),\n nonce_expires_at timestamp without time zone,\n linked_at timestamp without time zone,\n linked_by integer,\n created_at timestamp without time zone NOT NULL,\n updated_at timestamp without time zone NOT NULL,\n CONSTRAINT billetera_usuario_pkey PRIMARY KEY (id),\n CONSTRAINT billetera_usuario_usuario_id_fkey FOREIGN KEY (usuario_id) REFERENCES public.usuario(id),\n CONSTRAINT billetera_usuario_billetera_key UNIQUE (billetera),\n CONSTRAINT billetera_usuario_usuario_id_billetera_key UNIQUE (usuario_id, billetera)\n);\nCREATE INDEX IF NOT EXISTS billetera_usuario_usuario_id_idx ON public.billetera_usuario (usuario_id);";
|
|
6
|
-
/** Secuencia que necesita el `id` de `WALLET_LINK_DDL`. */
|
|
7
|
-
export declare const WALLET_LINK_SEQUENCE_DDL = "CREATE SEQUENCE IF NOT EXISTS public.billetera_usuario_id_seq\n START WITH 1\n INCREMENT BY 1\n NO MINVALUE\n NO MAXVALUE\n CACHE 1;";
|
|
8
|
-
/**
|
|
9
|
-
* DDL de las invitaciones. Los índices únicos son **parciales** (`pending`), para
|
|
10
|
-
* permitir re-invitar una dirección tras cancelar o expirar (la fila se conserva
|
|
11
|
-
* para auditoría). `now()` no puede aparecer en el predicado (no es IMMUTABLE): la
|
|
12
|
-
* expiración se aplica en la aplicación, que además marca `cancelled_at`.
|
|
13
|
-
*/
|
|
14
|
-
export declare const WALLET_INVITE_DDL = "CREATE TABLE IF NOT EXISTS public.billetera_invitada (\n id bigint DEFAULT nextval('public.billetera_invitada_id_seq'::regclass) NOT NULL,\n direccion_invitada character varying(60) NOT NULL,\n usuario_id integer NOT NULL,\n invited_by integer,\n used_at timestamp without time zone,\n cancelled_at timestamp without time zone,\n expires_at timestamp without time zone,\n created_at timestamp without time zone NOT NULL,\n updated_at timestamp without time zone NOT NULL,\n CONSTRAINT billetera_invitada_pkey PRIMARY KEY (id),\n CONSTRAINT billetera_invitada_usuario_id_fkey FOREIGN KEY (usuario_id) REFERENCES public.usuario(id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS billetera_invitada_pendiente_direccion_idx\n ON public.billetera_invitada (direccion_invitada)\n WHERE used_at IS NULL AND cancelled_at IS NULL;\nCREATE UNIQUE INDEX IF NOT EXISTS billetera_invitada_pendiente_usuario_idx\n ON public.billetera_invitada (usuario_id, direccion_invitada)\n WHERE used_at IS NULL AND cancelled_at IS NULL;";
|
|
15
|
-
/** Secuencia que necesita el `id` de `WALLET_INVITE_DDL`. */
|
|
16
|
-
export declare const WALLET_INVITE_SEQUENCE_DDL = "CREATE SEQUENCE IF NOT EXISTS public.billetera_invitada_id_seq\n START WITH 1\n INCREMENT BY 1\n NO MINVALUE\n NO MAXVALUE\n CACHE 1;";
|
|
17
|
-
export interface WalletLink {
|
|
18
|
-
id: number;
|
|
19
|
-
usuario_id: number;
|
|
20
|
-
billetera: string;
|
|
21
|
-
}
|
|
22
|
-
export interface WalletInvitation {
|
|
23
|
-
id: number;
|
|
24
|
-
direccion_invitada: string;
|
|
25
|
-
usuario_id: number;
|
|
26
|
-
used_at: string | null;
|
|
27
|
-
cancelled_at: string | null;
|
|
28
|
-
expires_at: string | null;
|
|
29
|
-
}
|
|
30
|
-
export declare function siweNusuario(wallet: string): string;
|
|
31
|
-
/** Busca el usuario por **cualquiera** de sus billeteras (case-insensitive). */
|
|
32
|
-
export declare function getUserByWallet(db: SqlExecutor, wallet: string): Promise<Usuario | null>;
|
|
33
|
-
/** Billeteras de un usuario (la más antigua primero). */
|
|
34
|
-
export declare function listWallets(db: SqlExecutor, usuarioId: number): Promise<WalletLink[]>;
|
|
35
|
-
/** Idempotente bajo los `UNIQUE`: una billetera, un enlace. */
|
|
36
|
-
export declare function ensureWalletLink(db: SqlExecutor, usuarioId: number, wallet: string): Promise<WalletLink>;
|
|
37
|
-
/**
|
|
38
|
-
* Enlaza una billetera **existente** a un usuario **existente** (no crea usuario).
|
|
39
|
-
* Si la billetera ya está enlazada, devuelve el enlace vigente.
|
|
40
|
-
*/
|
|
41
|
-
export declare function linkWallet(db: SqlExecutor, usuarioId: number, wallet: string): Promise<WalletLink>;
|
|
42
|
-
/** Desenlaza una billetera; se niega si es la **última** del usuario. */
|
|
43
|
-
export declare function unlinkWallet(db: SqlExecutor, usuarioId: number, wallet: string): Promise<boolean>;
|
|
44
|
-
export declare function upsertUserByWallet(db: SqlExecutor, wallet: string, options?: {
|
|
45
|
-
ip?: string;
|
|
46
|
-
}): Promise<{
|
|
47
|
-
usuario: Usuario;
|
|
48
|
-
created: boolean;
|
|
49
|
-
}>;
|
|
50
|
-
/** Invita una dirección a unirse a la cuenta (no crea enlace todavía). */
|
|
51
|
-
export declare function inviteWallet(db: SqlExecutor, usuarioId: number, address: string, options?: {
|
|
52
|
-
invitedBy?: number;
|
|
53
|
-
expiresAt?: Date;
|
|
54
|
-
}): Promise<WalletInvitation>;
|
|
55
|
-
/** Invitaciones **pendientes** de un usuario (ni usadas ni canceladas). */
|
|
56
|
-
export declare function listInvitations(db: SqlExecutor, usuarioId: number): Promise<WalletInvitation[]>;
|
|
57
|
-
/** Cancela una invitación pendiente (libera el índice parcial para re-invitar). */
|
|
58
|
-
export declare function cancelInvitation(db: SqlExecutor, usuarioId: number, address: string): Promise<boolean>;
|
|
59
|
-
/**
|
|
60
|
-
* Busca la invitación pendiente de una dirección. Si expiró, la marca
|
|
61
|
-
* `cancelled_at` (para que deje de bloquear el índice parcial) y devuelve `null`.
|
|
62
|
-
*/
|
|
63
|
-
export declare function findPendingInvitation(db: SqlExecutor, address: string): Promise<WalletInvitation | null>;
|
|
64
|
-
/**
|
|
65
|
-
* Acepta una invitación: enlaza la billetera al usuario de la invitación y la
|
|
66
|
-
* marca usada. Devuelve `null` si no hay invitación pendiente (o expiró).
|
|
67
|
-
*/
|
|
68
|
-
export declare function acceptInvitation(db: SqlExecutor, address: string): Promise<WalletLink | null>;
|
|
69
|
-
//# sourceMappingURL=wallet-link.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-link.d.ts","sourceRoot":"","sources":["../../src/base-model/wallet-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
// wallet-link.ts — enlace billetera ↔ usuario, **extensión opcional** del modelo base.
|
|
2
|
-
//
|
|
3
|
-
// `billetera_usuario` no está en la referencia del modelo base (msip-2.2 no la
|
|
4
|
-
// tiene) y por eso no forma parte del baseline: es una tabla que cada consumidor
|
|
5
|
-
// añade si ofrece inicio de sesión con billetera (learn.tg la tiene; sivel3, no).
|
|
6
|
-
// Este módulo agrupa lo que un consumidor necesita para eso, con el DDL de
|
|
7
|
-
// referencia para crearla igual en todas partes. Si el modelo base la declara
|
|
8
|
-
// algún día, se mueve a `references/msip.ts` y estas consultas pasan al modelo.
|
|
9
|
-
//
|
|
10
|
-
// Cardinalidad (m/REQ/38): un `usuario` tiene **N** billeteras. `UNIQUE (billetera)`
|
|
11
|
-
// (una billetera es de un solo usuario), `UNIQUE (usuario_id, billetera)` (sin
|
|
12
|
-
// duplicados) e `INDEX (usuario_id)` **no** único. Las direcciones se normalizan a
|
|
13
|
-
// minúsculas antes de escribir (EIP-55 es solo presentación).
|
|
14
|
-
//
|
|
15
|
-
// Declarar las tablas si no existen:
|
|
16
|
-
// WALLET_LINK_SEQUENCE_DDL + WALLET_LINK_DDL
|
|
17
|
-
// WALLET_INVITE_SEQUENCE_DDL + WALLET_INVITE_DDL
|
|
18
|
-
import { USUARIO_BASE_COLUMNS } from './queries.js';
|
|
19
|
-
/** Normaliza una dirección de billetera (las direcciones son case-insensitive). */
|
|
20
|
-
export function normalizeWallet(wallet) {
|
|
21
|
-
return wallet.toLowerCase();
|
|
22
|
-
}
|
|
23
|
-
/** DDL de referencia de la tabla del enlace (idempotente con IF NOT EXISTS). */
|
|
24
|
-
export const WALLET_LINK_DDL = `CREATE TABLE IF NOT EXISTS public.billetera_usuario (
|
|
25
|
-
id bigint DEFAULT nextval('public.billetera_usuario_id_seq'::regclass) NOT NULL,
|
|
26
|
-
billetera character varying(60) NOT NULL,
|
|
27
|
-
usuario_id integer NOT NULL,
|
|
28
|
-
nonce character varying(255),
|
|
29
|
-
nonce_expires_at timestamp without time zone,
|
|
30
|
-
linked_at timestamp without time zone,
|
|
31
|
-
linked_by integer,
|
|
32
|
-
created_at timestamp without time zone NOT NULL,
|
|
33
|
-
updated_at timestamp without time zone NOT NULL,
|
|
34
|
-
CONSTRAINT billetera_usuario_pkey PRIMARY KEY (id),
|
|
35
|
-
CONSTRAINT billetera_usuario_usuario_id_fkey FOREIGN KEY (usuario_id) REFERENCES public.usuario(id),
|
|
36
|
-
CONSTRAINT billetera_usuario_billetera_key UNIQUE (billetera),
|
|
37
|
-
CONSTRAINT billetera_usuario_usuario_id_billetera_key UNIQUE (usuario_id, billetera)
|
|
38
|
-
);
|
|
39
|
-
CREATE INDEX IF NOT EXISTS billetera_usuario_usuario_id_idx ON public.billetera_usuario (usuario_id);`;
|
|
40
|
-
/** Secuencia que necesita el `id` de `WALLET_LINK_DDL`. */
|
|
41
|
-
export const WALLET_LINK_SEQUENCE_DDL = `CREATE SEQUENCE IF NOT EXISTS public.billetera_usuario_id_seq
|
|
42
|
-
START WITH 1
|
|
43
|
-
INCREMENT BY 1
|
|
44
|
-
NO MINVALUE
|
|
45
|
-
NO MAXVALUE
|
|
46
|
-
CACHE 1;`;
|
|
47
|
-
/**
|
|
48
|
-
* DDL de las invitaciones. Los índices únicos son **parciales** (`pending`), para
|
|
49
|
-
* permitir re-invitar una dirección tras cancelar o expirar (la fila se conserva
|
|
50
|
-
* para auditoría). `now()` no puede aparecer en el predicado (no es IMMUTABLE): la
|
|
51
|
-
* expiración se aplica en la aplicación, que además marca `cancelled_at`.
|
|
52
|
-
*/
|
|
53
|
-
export const WALLET_INVITE_DDL = `CREATE TABLE IF NOT EXISTS public.billetera_invitada (
|
|
54
|
-
id bigint DEFAULT nextval('public.billetera_invitada_id_seq'::regclass) NOT NULL,
|
|
55
|
-
direccion_invitada character varying(60) NOT NULL,
|
|
56
|
-
usuario_id integer NOT NULL,
|
|
57
|
-
invited_by integer,
|
|
58
|
-
used_at timestamp without time zone,
|
|
59
|
-
cancelled_at timestamp without time zone,
|
|
60
|
-
expires_at timestamp without time zone,
|
|
61
|
-
created_at timestamp without time zone NOT NULL,
|
|
62
|
-
updated_at timestamp without time zone NOT NULL,
|
|
63
|
-
CONSTRAINT billetera_invitada_pkey PRIMARY KEY (id),
|
|
64
|
-
CONSTRAINT billetera_invitada_usuario_id_fkey FOREIGN KEY (usuario_id) REFERENCES public.usuario(id)
|
|
65
|
-
);
|
|
66
|
-
CREATE UNIQUE INDEX IF NOT EXISTS billetera_invitada_pendiente_direccion_idx
|
|
67
|
-
ON public.billetera_invitada (direccion_invitada)
|
|
68
|
-
WHERE used_at IS NULL AND cancelled_at IS NULL;
|
|
69
|
-
CREATE UNIQUE INDEX IF NOT EXISTS billetera_invitada_pendiente_usuario_idx
|
|
70
|
-
ON public.billetera_invitada (usuario_id, direccion_invitada)
|
|
71
|
-
WHERE used_at IS NULL AND cancelled_at IS NULL;`;
|
|
72
|
-
/** Secuencia que necesita el `id` de `WALLET_INVITE_DDL`. */
|
|
73
|
-
export const WALLET_INVITE_SEQUENCE_DDL = `CREATE SEQUENCE IF NOT EXISTS public.billetera_invitada_id_seq
|
|
74
|
-
START WITH 1
|
|
75
|
-
INCREMENT BY 1
|
|
76
|
-
NO MINVALUE
|
|
77
|
-
NO MAXVALUE
|
|
78
|
-
CACHE 1;`;
|
|
79
|
-
function selectUsuario() {
|
|
80
|
-
return `SELECT ${USUARIO_BASE_COLUMNS.map((column) => `u.${column}`).join(', ')}\n FROM usuario u`;
|
|
81
|
-
}
|
|
82
|
-
export function siweNusuario(wallet) {
|
|
83
|
-
return `${wallet.slice(0, 7)}...${wallet.slice(-5)}`;
|
|
84
|
-
}
|
|
85
|
-
/** Busca el usuario por **cualquiera** de sus billeteras (case-insensitive). */
|
|
86
|
-
export async function getUserByWallet(db, wallet) {
|
|
87
|
-
const result = await db.query(`${selectUsuario()}
|
|
88
|
-
JOIN billetera_usuario b ON b.usuario_id = u.id
|
|
89
|
-
WHERE LOWER(b.billetera) = $1
|
|
90
|
-
ORDER BY u.id
|
|
91
|
-
LIMIT 1`, [normalizeWallet(wallet)]);
|
|
92
|
-
return result.rows[0] ?? null;
|
|
93
|
-
}
|
|
94
|
-
/** Billeteras de un usuario (la más antigua primero). */
|
|
95
|
-
export async function listWallets(db, usuarioId) {
|
|
96
|
-
const result = await db.query(`SELECT id, usuario_id, billetera
|
|
97
|
-
FROM billetera_usuario
|
|
98
|
-
WHERE usuario_id = $1
|
|
99
|
-
ORDER BY linked_at NULLS LAST, id`, [usuarioId]);
|
|
100
|
-
return result.rows;
|
|
101
|
-
}
|
|
102
|
-
/** Idempotente bajo los `UNIQUE`: una billetera, un enlace. */
|
|
103
|
-
export async function ensureWalletLink(db, usuarioId, wallet) {
|
|
104
|
-
const lower = normalizeWallet(wallet);
|
|
105
|
-
const inserted = await db.query(`INSERT INTO billetera_usuario (usuario_id, billetera, linked_at, created_at, updated_at)
|
|
106
|
-
VALUES ($1, $2, now(), now(), now())
|
|
107
|
-
ON CONFLICT (billetera) DO UPDATE SET updated_at = now()
|
|
108
|
-
RETURNING id, usuario_id, billetera`, [usuarioId, lower]);
|
|
109
|
-
return inserted.rows[0];
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Enlaza una billetera **existente** a un usuario **existente** (no crea usuario).
|
|
113
|
-
* Si la billetera ya está enlazada, devuelve el enlace vigente.
|
|
114
|
-
*/
|
|
115
|
-
export async function linkWallet(db, usuarioId, wallet) {
|
|
116
|
-
const lower = normalizeWallet(wallet);
|
|
117
|
-
const inserted = await db.query(`INSERT INTO billetera_usuario (usuario_id, billetera, linked_at, created_at, updated_at)
|
|
118
|
-
VALUES ($1, $2, now(), now(), now())
|
|
119
|
-
ON CONFLICT (billetera) DO NOTHING
|
|
120
|
-
RETURNING id, usuario_id, billetera`, [usuarioId, lower]);
|
|
121
|
-
if (inserted.rows[0])
|
|
122
|
-
return inserted.rows[0];
|
|
123
|
-
const existing = await db.query('SELECT id, usuario_id, billetera FROM billetera_usuario WHERE billetera = $1 LIMIT 1', [lower]);
|
|
124
|
-
return existing.rows[0];
|
|
125
|
-
}
|
|
126
|
-
/** Desenlaza una billetera; se niega si es la **última** del usuario. */
|
|
127
|
-
export async function unlinkWallet(db, usuarioId, wallet) {
|
|
128
|
-
const lower = normalizeWallet(wallet);
|
|
129
|
-
const count = await db.query('SELECT count(*)::text AS total FROM billetera_usuario WHERE usuario_id = $1', [usuarioId]);
|
|
130
|
-
if (Number(count.rows[0]?.total ?? 0) <= 1)
|
|
131
|
-
return false;
|
|
132
|
-
const deleted = await db.query('DELETE FROM billetera_usuario WHERE usuario_id = $1 AND billetera = $2 RETURNING id', [usuarioId, lower]);
|
|
133
|
-
return deleted.rows.length > 0;
|
|
134
|
-
}
|
|
135
|
-
export async function upsertUserByWallet(db, wallet, options = {}) {
|
|
136
|
-
const ip = options.ip ?? '127.0.0.1';
|
|
137
|
-
const existing = await db.query(`${selectUsuario()}
|
|
138
|
-
JOIN billetera_usuario b ON b.usuario_id = u.id
|
|
139
|
-
WHERE LOWER(b.billetera) = $1
|
|
140
|
-
ORDER BY u.id
|
|
141
|
-
LIMIT 1`, [normalizeWallet(wallet)]);
|
|
142
|
-
if (!existing.rows[0]) {
|
|
143
|
-
const address15 = siweNusuario(wallet);
|
|
144
|
-
const created = await db.query(`INSERT INTO usuario (nombre, nusuario, email, fechacreacion, current_sign_in_at, current_sign_in_ip, created_at, updated_at)
|
|
145
|
-
VALUES ($1, $2, $3, now()::date, now(), $4, now(), now())
|
|
146
|
-
RETURNING ${USUARIO_BASE_COLUMNS.join(', ')}`, [wallet, address15, `${address15}@localhost`, ip]);
|
|
147
|
-
await ensureWalletLink(db, created.rows[0].id, wallet);
|
|
148
|
-
return { usuario: created.rows[0], created: true };
|
|
149
|
-
}
|
|
150
|
-
const previous = existing.rows[0];
|
|
151
|
-
const updated = await db.query(`UPDATE usuario
|
|
152
|
-
SET last_sign_in_ip = COALESCE(last_sign_in_ip, current_sign_in_ip),
|
|
153
|
-
last_sign_in_at = COALESCE(last_sign_in_at, current_sign_in_at),
|
|
154
|
-
current_sign_in_ip = $2,
|
|
155
|
-
current_sign_in_at = now(),
|
|
156
|
-
updated_at = now()
|
|
157
|
-
WHERE id = $1
|
|
158
|
-
RETURNING ${USUARIO_BASE_COLUMNS.join(', ')}`, [previous.id, ip]);
|
|
159
|
-
await db.query('UPDATE billetera_usuario SET updated_at = now() WHERE usuario_id = $1', [previous.id]);
|
|
160
|
-
return { usuario: updated.rows[0] ?? previous, created: false };
|
|
161
|
-
}
|
|
162
|
-
// ── Invitaciones (una segunda billetera se une a una cuenta existente) ──
|
|
163
|
-
/** Invita una dirección a unirse a la cuenta (no crea enlace todavía). */
|
|
164
|
-
export async function inviteWallet(db, usuarioId, address, options = {}) {
|
|
165
|
-
const result = await db.query(`INSERT INTO billetera_invitada
|
|
166
|
-
(direccion_invitada, usuario_id, invited_by, expires_at, created_at, updated_at)
|
|
167
|
-
VALUES ($1, $2, $3, $4, now(), now())
|
|
168
|
-
RETURNING id, direccion_invitada, usuario_id, used_at, cancelled_at, expires_at`, [normalizeWallet(address), usuarioId, options.invitedBy ?? null, options.expiresAt ?? null]);
|
|
169
|
-
return result.rows[0];
|
|
170
|
-
}
|
|
171
|
-
/** Invitaciones **pendientes** de un usuario (ni usadas ni canceladas). */
|
|
172
|
-
export async function listInvitations(db, usuarioId) {
|
|
173
|
-
const result = await db.query(`SELECT id, direccion_invitada, usuario_id, used_at, cancelled_at, expires_at
|
|
174
|
-
FROM billetera_invitada
|
|
175
|
-
WHERE usuario_id = $1 AND used_at IS NULL AND cancelled_at IS NULL
|
|
176
|
-
ORDER BY created_at, id`, [usuarioId]);
|
|
177
|
-
return result.rows;
|
|
178
|
-
}
|
|
179
|
-
/** Cancela una invitación pendiente (libera el índice parcial para re-invitar). */
|
|
180
|
-
export async function cancelInvitation(db, usuarioId, address) {
|
|
181
|
-
const result = await db.query(`UPDATE billetera_invitada
|
|
182
|
-
SET cancelled_at = now(), updated_at = now()
|
|
183
|
-
WHERE usuario_id = $1 AND direccion_invitada = $2
|
|
184
|
-
AND used_at IS NULL AND cancelled_at IS NULL
|
|
185
|
-
RETURNING id`, [usuarioId, normalizeWallet(address)]);
|
|
186
|
-
return result.rows.length > 0;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Busca la invitación pendiente de una dirección. Si expiró, la marca
|
|
190
|
-
* `cancelled_at` (para que deje de bloquear el índice parcial) y devuelve `null`.
|
|
191
|
-
*/
|
|
192
|
-
export async function findPendingInvitation(db, address) {
|
|
193
|
-
const lower = normalizeWallet(address);
|
|
194
|
-
const result = await db.query(`SELECT id, direccion_invitada, usuario_id, used_at, cancelled_at, expires_at
|
|
195
|
-
FROM billetera_invitada
|
|
196
|
-
WHERE direccion_invitada = $1 AND used_at IS NULL AND cancelled_at IS NULL
|
|
197
|
-
ORDER BY id
|
|
198
|
-
LIMIT 1`, [lower]);
|
|
199
|
-
const invitation = result.rows[0];
|
|
200
|
-
if (!invitation)
|
|
201
|
-
return null;
|
|
202
|
-
if (invitation.expires_at && new Date(invitation.expires_at).getTime() < Date.now()) {
|
|
203
|
-
await cancelInvitation(db, invitation.usuario_id, lower);
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
return invitation;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Acepta una invitación: enlaza la billetera al usuario de la invitación y la
|
|
210
|
-
* marca usada. Devuelve `null` si no hay invitación pendiente (o expiró).
|
|
211
|
-
*/
|
|
212
|
-
export async function acceptInvitation(db, address) {
|
|
213
|
-
const invitation = await findPendingInvitation(db, address);
|
|
214
|
-
if (!invitation)
|
|
215
|
-
return null;
|
|
216
|
-
const link = await linkWallet(db, invitation.usuario_id, address);
|
|
217
|
-
await db.query('UPDATE billetera_invitada SET used_at = now(), updated_at = now() WHERE id = $1', [invitation.id]);
|
|
218
|
-
return link;
|
|
219
|
-
}
|
|
220
|
-
//# sourceMappingURL=wallet-link.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-link.js","sourceRoot":"","sources":["../../src/base-model/wallet-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-link.test.d.ts","sourceRoot":"","sources":["../../src/base-model/wallet-link.test.ts"],"names":[],"mappings":""}
|