@proteinjs/user-server 1.13.0 → 1.15.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackfillUserStatusActive.js","sourceRoot":"","sources":["../../../src/migrations/BackfillUserStatusActive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAAsH;AACtH,4CAA2C;AAC3C,wCAAqD;AAErD;;;;;;;;;;;;;;GAcG;AACH;IAAA;QAAA,iBAuBC;QAtBC,UAAK,GAAG,WAAQ,CAAC,SAAS,CAAC;QAC3B,WAAM,GAAG;YACP,EAAE,EAAE,sCAAsC;YAC1C,WAAW,EAAE,6GAA6G;YAC1H,GAAG,EAAE;;;;;4BACG,MAAM,GAAG,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;4BACrD,EAAE,GAAG,IAAA,kBAAa,GAAE,CAAC;4BACrB,EAAE,GAAG,IAAI,wBAAmB,EAAE;iCACjC,eAAe,CAAC,aAAM,CAAC,IAAI,CAAC;iCAC5B,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;4BAC1C,qBAAM,EAAE,CAAC,KAAK,CAAC,aAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAA;;4BAAtC,IAAI,GAAG,SAA+B;4BAExC,UAAU,GAAG,CAAC,CAAC;kCACG,EAAJ,aAAI;;;iCAAJ,CAAA,kBAAI,CAAA;4BAAX,GAAG;4BACZ,qBAAM,EAAE,CAAC,MAAM,CAAC,aAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAsB,EAAE,CAAC,EAAA;;4BAA5E,SAA4E,CAAC;4BAC7E,UAAU,EAAE,CAAC;;;4BAFG,IAAI,CAAA;;;4BAKtB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,UAAU,YAAA,EAAE,EAAE,CAAC,CAAC;4BACxE,sBAAO,EAAE,UAAU,YAAA,EAAE,EAAC;;;iBACvB;SACF,CAAC;IACJ,CAAC;IAAD,+BAAC;AAAD,CAAC,AAvBD,IAuBC;AAvBY,4DAAwB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BackfillUserStatusActive.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackfillUserStatusActive.integration.test.d.ts","sourceRoot":"","sources":["../../test/BackfillUserStatusActive.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
40
+ var test_1 = require("@proteinjs/db-driver-spanner/test");
41
+ var reflection_1 = require("@proteinjs/reflection");
42
+ var user_1 = require("@proteinjs/user");
43
+ var BackfillUserStatusActive_1 = require("../src/migrations/BackfillUserStatusActive");
44
+ /**
45
+ * The user.status legacy-null retirement against a real Spanner emulator, simulating a deployed
46
+ * database: rows written before the status column existed read NULL — the standing every gate
47
+ * treats as active, but the stored state said nothing (the founder's v1.22 admin-review finding:
48
+ * active accounts showing no status on the user table).
49
+ *
50
+ * Pinned outcomes:
51
+ * - NULL-status rows become an explicit 'active'
52
+ * - an explicit 'deactivated' is NEVER touched (the one standing that must survive)
53
+ * - an explicit 'active' stays as-is
54
+ * - re-runs are clean no-ops (idempotent by shape: a write makes the row unmatchable)
55
+ */
56
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver({
57
+ projectId: 'proteinjs-test',
58
+ instanceName: 'proteinjs-test',
59
+ databaseName: 'test',
60
+ });
61
+ var DbDriverFactory = /** @class */ (function () {
62
+ function DbDriverFactory() {
63
+ }
64
+ DbDriverFactory.prototype.getDbDriver = function () {
65
+ return spannerDriver;
66
+ };
67
+ return DbDriverFactory;
68
+ }());
69
+ var dropTable = (0, test_1.getDropTestTable)(spannerDriver);
70
+ var runMigration = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
71
+ switch (_a.label) {
72
+ case 0: return [4 /*yield*/, new BackfillUserStatusActive_1.BackfillUserStatusActive().record.run()];
73
+ case 1: return [2 /*return*/, _a.sent()];
74
+ }
75
+ }); }); };
76
+ /** A pre-status-column row, exactly as deployed databases hold them: status NULL. */
77
+ var rawLegacyUserInsert = function (id) { return __awaiter(void 0, void 0, void 0, function () {
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0: return [4 /*yield*/, spannerDriver.runDml(function () { return ({
81
+ sql: "INSERT INTO ".concat(user_1.tables.User.name, " (id, name, email, password, email_verified, created, updated) ") +
82
+ "VALUES ('".concat(id, "', 'User ").concat(id, "', '").concat(id, "@test.local', 'test', false, ") +
83
+ "CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP())",
84
+ }); })];
85
+ case 1:
86
+ _a.sent();
87
+ return [2 /*return*/];
88
+ }
89
+ });
90
+ }); };
91
+ var rawStatusUpdate = function (id, status) { return __awaiter(void 0, void 0, void 0, function () {
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0: return [4 /*yield*/, spannerDriver.runDml(function () { return ({
95
+ sql: "UPDATE ".concat(user_1.tables.User.name, " SET status = '").concat(status, "' WHERE id = '").concat(id, "'"),
96
+ }); })];
97
+ case 1:
98
+ _a.sent();
99
+ return [2 /*return*/];
100
+ }
101
+ });
102
+ }); };
103
+ var rawStatus = function (id) { return __awaiter(void 0, void 0, void 0, function () {
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0: return [4 /*yield*/, spannerDriver.runQuery(function () { return ({
107
+ sql: "SELECT status FROM ".concat(user_1.tables.User.name, " WHERE id = '").concat(id, "'"),
108
+ }); })];
109
+ case 1: return [2 /*return*/, (_a.sent())[0].status];
110
+ }
111
+ });
112
+ }); };
113
+ describe('BackfillUserStatusActive — legacy NULL status → explicit active', function () {
114
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
115
+ return __generator(this, function (_a) {
116
+ switch (_a.label) {
117
+ case 0:
118
+ reflection_1.SourceRepository.get().objectCache['@proteinjs/db/DefaultDbDriverFactory'] = [new DbDriverFactory()];
119
+ return [4 /*yield*/, test_1.SpannerEmulatorProvisioner.ensureProvisioned({
120
+ projectId: 'proteinjs-test',
121
+ instanceName: 'proteinjs-test',
122
+ databaseName: 'test',
123
+ })];
124
+ case 1:
125
+ _a.sent();
126
+ return [4 /*yield*/, dropTable(user_1.tables.User)];
127
+ case 2:
128
+ _a.sent();
129
+ return [4 /*yield*/, spannerDriver.getTableManager().loadTable(user_1.tables.User)];
130
+ case 3:
131
+ _a.sent();
132
+ return [2 /*return*/];
133
+ }
134
+ });
135
+ }); }, 120000);
136
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
137
+ return __generator(this, function (_a) {
138
+ switch (_a.label) {
139
+ case 0: return [4 /*yield*/, dropTable(user_1.tables.User)];
140
+ case 1:
141
+ _a.sent();
142
+ return [4 /*yield*/, test_1.SpannerEmulatorProvisioner.release()];
143
+ case 2:
144
+ _a.sent();
145
+ return [2 /*return*/];
146
+ }
147
+ });
148
+ }); }, 60000);
149
+ it('backfills legacy NULLs, never touches explicit standings, re-runs clean', function () { return __awaiter(void 0, void 0, void 0, function () {
150
+ var _a, _b, _c, _d, _e, _f, _g;
151
+ return __generator(this, function (_h) {
152
+ switch (_h.label) {
153
+ case 0: return [4 /*yield*/, rawLegacyUserInsert('legacy-null-1')];
154
+ case 1:
155
+ _h.sent();
156
+ return [4 /*yield*/, rawLegacyUserInsert('legacy-null-2')];
157
+ case 2:
158
+ _h.sent();
159
+ return [4 /*yield*/, rawLegacyUserInsert('explicit-active')];
160
+ case 3:
161
+ _h.sent();
162
+ return [4 /*yield*/, rawStatusUpdate('explicit-active', 'active')];
163
+ case 4:
164
+ _h.sent();
165
+ return [4 /*yield*/, rawLegacyUserInsert('deactivated-user')];
166
+ case 5:
167
+ _h.sent();
168
+ return [4 /*yield*/, rawStatusUpdate('deactivated-user', 'deactivated')];
169
+ case 6:
170
+ _h.sent();
171
+ _a = expect;
172
+ return [4 /*yield*/, runMigration()];
173
+ case 7:
174
+ _a.apply(void 0, [_h.sent()]).toEqual({ backfilled: 2 });
175
+ _b = expect;
176
+ return [4 /*yield*/, rawStatus('legacy-null-1')];
177
+ case 8:
178
+ _b.apply(void 0, [_h.sent()]).toBe('active');
179
+ _c = expect;
180
+ return [4 /*yield*/, rawStatus('legacy-null-2')];
181
+ case 9:
182
+ _c.apply(void 0, [_h.sent()]).toBe('active');
183
+ _d = expect;
184
+ return [4 /*yield*/, rawStatus('explicit-active')];
185
+ case 10:
186
+ _d.apply(void 0, [_h.sent()]).toBe('active');
187
+ // The one standing that must survive a representation fix.
188
+ _e = expect;
189
+ return [4 /*yield*/, rawStatus('deactivated-user')];
190
+ case 11:
191
+ // The one standing that must survive a representation fix.
192
+ _e.apply(void 0, [_h.sent()]).toBe('deactivated');
193
+ // Re-run: nothing left to match.
194
+ _f = expect;
195
+ return [4 /*yield*/, runMigration()];
196
+ case 12:
197
+ // Re-run: nothing left to match.
198
+ _f.apply(void 0, [_h.sent()]).toEqual({ backfilled: 0 });
199
+ _g = expect;
200
+ return [4 /*yield*/, rawStatus('deactivated-user')];
201
+ case 13:
202
+ _g.apply(void 0, [_h.sent()]).toBe('deactivated');
203
+ return [2 /*return*/];
204
+ }
205
+ });
206
+ }); }, 120000);
207
+ });
208
+ //# sourceMappingURL=BackfillUserStatusActive.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackfillUserStatusActive.integration.test.js","sourceRoot":"","sources":["../../test/BackfillUserStatusActive.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SharedScopeEncryption.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedScopeEncryption.integration.test.d.ts","sourceRoot":"","sources":["../../test/SharedScopeEncryption.integration.test.ts"],"names":[],"mappings":""}