@tomorrowos/sdk 0.6.0 → 0.6.2

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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { TomorrowOS } from "./tomorrowos.js";
2
- export type { DeviceListItem, ListenOptions, TomorrowOSBrand, TomorrowOSOptions } from "./tomorrowos.js";
2
+ export type { DeviceListItem, DeviceScreenshotInfo, ListenOptions, TomorrowOSBrand, TomorrowOSOptions } from "./tomorrowos.js";
3
3
  export type { DevicePlaylistAssignment, DeviceRegistryRecord, PairedDeviceRecord, PendingCodeEntry, PendingCodeRecord, DeviceRegistryEntry, PlaylistItemRecord, PlaylistSchedule, PublishedPlaylistSnapshot, StoredPlaylist, TomorrowOSDataSnapshot, TomorrowOSMigratableStore, TomorrowOSStore } from "./store/types.js";
4
4
  export { PlaylistCatalog } from "./playlist-catalog.js";
5
5
  export type { BuiltDevicePolicy, SavePlaylistInput } from "./playlist-catalog.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -29,94 +29,94 @@ export class PostgresStore {
29
29
  this.pool = new Pool({ connectionString, ssl });
30
30
  }
31
31
  async init() {
32
- await this.pool.query(`
33
- CREATE TABLE IF NOT EXISTS schema_migrations (
34
- id INTEGER PRIMARY KEY,
35
- name TEXT NOT NULL UNIQUE,
36
- applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
37
- );
38
-
39
- CREATE TABLE IF NOT EXISTS pending_codes (
40
- code TEXT PRIMARY KEY,
41
- device_id TEXT NOT NULL,
42
- created_at BIGINT NOT NULL
43
- );
44
-
45
- CREATE TABLE IF NOT EXISTS device_registry (
46
- device_id TEXT PRIMARY KEY,
47
- permanent_pairing_code TEXT NOT NULL UNIQUE,
48
- code_created_at BIGINT NOT NULL,
49
- serial_number TEXT,
50
- first_seen_at BIGINT,
51
- last_hello_at BIGINT
52
- );
53
-
54
- CREATE TABLE IF NOT EXISTS paired_devices (
55
- device_id TEXT PRIMARY KEY,
56
- pairing_token TEXT NOT NULL,
57
- paired_at TEXT NOT NULL,
58
- device_name TEXT,
59
- platform TEXT,
60
- system TEXT,
61
- player_version TEXT,
62
- last_boot_at TEXT,
63
- last_online_at TEXT,
64
- last_offline_at TEXT,
65
- last_policy_push_at TEXT
66
- );
67
-
68
- CREATE TABLE IF NOT EXISTS playlists (
69
- id TEXT PRIMARY KEY,
70
- name TEXT NOT NULL,
71
- schedule_json TEXT,
72
- items_json TEXT NOT NULL DEFAULT '[]',
73
- version INTEGER NOT NULL,
74
- updated_at TEXT NOT NULL,
75
- retired BOOLEAN NOT NULL DEFAULT false,
76
- retired_at TEXT
77
- );
78
-
79
- CREATE UNIQUE INDEX IF NOT EXISTS playlists_active_name_unique
80
- ON playlists (lower(trim(name)))
81
- WHERE retired = false;
82
-
83
- CREATE TABLE IF NOT EXISTS device_assignments (
84
- device_id TEXT NOT NULL,
85
- playlist_id TEXT NOT NULL,
86
- sort_order INTEGER NOT NULL,
87
- published_version INTEGER NOT NULL,
88
- published_at TEXT NOT NULL,
89
- snapshot_json TEXT NOT NULL,
90
- PRIMARY KEY (device_id, playlist_id)
91
- );
92
-
93
- CREATE INDEX IF NOT EXISTS device_assignments_device_order_idx
94
- ON device_assignments (device_id, sort_order);
95
-
96
- CREATE TABLE IF NOT EXISTS uploaded_assets (
97
- id TEXT PRIMARY KEY,
98
- sha256 TEXT NOT NULL,
99
- storage_provider TEXT NOT NULL,
100
- storage_key TEXT NOT NULL,
101
- url TEXT NOT NULL,
102
- original_filename TEXT,
103
- mime_type TEXT,
104
- resource_type TEXT,
105
- bytes BIGINT,
106
- created_at TEXT NOT NULL,
107
- updated_at TEXT NOT NULL,
108
- UNIQUE (storage_provider, sha256)
109
- );
110
-
111
- CREATE INDEX IF NOT EXISTS uploaded_assets_sha256_idx
112
- ON uploaded_assets (sha256);
113
-
114
- INSERT INTO schema_migrations (id, name)
115
- VALUES (1, 'initial_tomorrowos_store')
116
- ON CONFLICT (id) DO NOTHING;
117
-
118
- ALTER TABLE paired_devices
119
- ADD COLUMN IF NOT EXISTS player_version TEXT;
32
+ await this.pool.query(`
33
+ CREATE TABLE IF NOT EXISTS schema_migrations (
34
+ id INTEGER PRIMARY KEY,
35
+ name TEXT NOT NULL UNIQUE,
36
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
37
+ );
38
+
39
+ CREATE TABLE IF NOT EXISTS pending_codes (
40
+ code TEXT PRIMARY KEY,
41
+ device_id TEXT NOT NULL,
42
+ created_at BIGINT NOT NULL
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS device_registry (
46
+ device_id TEXT PRIMARY KEY,
47
+ permanent_pairing_code TEXT NOT NULL UNIQUE,
48
+ code_created_at BIGINT NOT NULL,
49
+ serial_number TEXT,
50
+ first_seen_at BIGINT,
51
+ last_hello_at BIGINT
52
+ );
53
+
54
+ CREATE TABLE IF NOT EXISTS paired_devices (
55
+ device_id TEXT PRIMARY KEY,
56
+ pairing_token TEXT NOT NULL,
57
+ paired_at TEXT NOT NULL,
58
+ device_name TEXT,
59
+ platform TEXT,
60
+ system TEXT,
61
+ player_version TEXT,
62
+ last_boot_at TEXT,
63
+ last_online_at TEXT,
64
+ last_offline_at TEXT,
65
+ last_policy_push_at TEXT
66
+ );
67
+
68
+ CREATE TABLE IF NOT EXISTS playlists (
69
+ id TEXT PRIMARY KEY,
70
+ name TEXT NOT NULL,
71
+ schedule_json TEXT,
72
+ items_json TEXT NOT NULL DEFAULT '[]',
73
+ version INTEGER NOT NULL,
74
+ updated_at TEXT NOT NULL,
75
+ retired BOOLEAN NOT NULL DEFAULT false,
76
+ retired_at TEXT
77
+ );
78
+
79
+ CREATE UNIQUE INDEX IF NOT EXISTS playlists_active_name_unique
80
+ ON playlists (lower(trim(name)))
81
+ WHERE retired = false;
82
+
83
+ CREATE TABLE IF NOT EXISTS device_assignments (
84
+ device_id TEXT NOT NULL,
85
+ playlist_id TEXT NOT NULL,
86
+ sort_order INTEGER NOT NULL,
87
+ published_version INTEGER NOT NULL,
88
+ published_at TEXT NOT NULL,
89
+ snapshot_json TEXT NOT NULL,
90
+ PRIMARY KEY (device_id, playlist_id)
91
+ );
92
+
93
+ CREATE INDEX IF NOT EXISTS device_assignments_device_order_idx
94
+ ON device_assignments (device_id, sort_order);
95
+
96
+ CREATE TABLE IF NOT EXISTS uploaded_assets (
97
+ id TEXT PRIMARY KEY,
98
+ sha256 TEXT NOT NULL,
99
+ storage_provider TEXT NOT NULL,
100
+ storage_key TEXT NOT NULL,
101
+ url TEXT NOT NULL,
102
+ original_filename TEXT,
103
+ mime_type TEXT,
104
+ resource_type TEXT,
105
+ bytes BIGINT,
106
+ created_at TEXT NOT NULL,
107
+ updated_at TEXT NOT NULL,
108
+ UNIQUE (storage_provider, sha256)
109
+ );
110
+
111
+ CREATE INDEX IF NOT EXISTS uploaded_assets_sha256_idx
112
+ ON uploaded_assets (sha256);
113
+
114
+ INSERT INTO schema_migrations (id, name)
115
+ VALUES (1, 'initial_tomorrowos_store')
116
+ ON CONFLICT (id) DO NOTHING;
117
+
118
+ ALTER TABLE paired_devices
119
+ ADD COLUMN IF NOT EXISTS player_version TEXT;
120
120
  `);
121
121
  }
122
122
  async close() {
@@ -128,20 +128,20 @@ export class PostgresStore {
128
128
  }
129
129
  async setPendingCode(code, record) {
130
130
  await this.ensureReady();
131
- await this.pool.query(`
132
- INSERT INTO pending_codes (code, device_id, created_at)
133
- VALUES ($1, $2, $3)
134
- ON CONFLICT (code) DO UPDATE SET
135
- device_id = EXCLUDED.device_id,
136
- created_at = EXCLUDED.created_at
131
+ await this.pool.query(`
132
+ INSERT INTO pending_codes (code, device_id, created_at)
133
+ VALUES ($1, $2, $3)
134
+ ON CONFLICT (code) DO UPDATE SET
135
+ device_id = EXCLUDED.device_id,
136
+ created_at = EXCLUDED.created_at
137
137
  `, [code, record.deviceId, record.createdAt]);
138
138
  }
139
139
  async getPendingCode(code) {
140
140
  await this.ensureReady();
141
- const result = await this.pool.query(`
142
- SELECT device_id, created_at
143
- FROM pending_codes
144
- WHERE code = $1
141
+ const result = await this.pool.query(`
142
+ SELECT device_id, created_at
143
+ FROM pending_codes
144
+ WHERE code = $1
145
145
  `, [code]);
146
146
  const row = result.rows[0];
147
147
  if (!row)
@@ -154,10 +154,10 @@ export class PostgresStore {
154
154
  }
155
155
  async listPendingCodes() {
156
156
  await this.ensureReady();
157
- const result = await this.pool.query(`
158
- SELECT code, device_id, created_at
159
- FROM pending_codes
160
- ORDER BY created_at ASC
157
+ const result = await this.pool.query(`
158
+ SELECT code, device_id, created_at
159
+ FROM pending_codes
160
+ ORDER BY created_at ASC
161
161
  `);
162
162
  return result.rows.map((row) => ({
163
163
  code: row.code,
@@ -166,32 +166,32 @@ export class PostgresStore {
166
166
  }
167
167
  async getDeviceRegistry(deviceId) {
168
168
  await this.ensureReady();
169
- const result = await this.pool.query(`
170
- SELECT *
171
- FROM device_registry
172
- WHERE device_id = $1
169
+ const result = await this.pool.query(`
170
+ SELECT *
171
+ FROM device_registry
172
+ WHERE device_id = $1
173
173
  `, [deviceId]);
174
174
  const row = result.rows[0];
175
175
  return row ? this.mapDeviceRegistryRow(row) : undefined;
176
176
  }
177
177
  async setDeviceRegistry(deviceId, record) {
178
178
  await this.ensureReady();
179
- await this.pool.query(`
180
- INSERT INTO device_registry (
181
- device_id,
182
- permanent_pairing_code,
183
- code_created_at,
184
- serial_number,
185
- first_seen_at,
186
- last_hello_at
187
- )
188
- VALUES ($1, $2, $3, $4, $5, $6)
189
- ON CONFLICT (device_id) DO UPDATE SET
190
- permanent_pairing_code = EXCLUDED.permanent_pairing_code,
191
- code_created_at = EXCLUDED.code_created_at,
192
- serial_number = EXCLUDED.serial_number,
193
- first_seen_at = EXCLUDED.first_seen_at,
194
- last_hello_at = EXCLUDED.last_hello_at
179
+ await this.pool.query(`
180
+ INSERT INTO device_registry (
181
+ device_id,
182
+ permanent_pairing_code,
183
+ code_created_at,
184
+ serial_number,
185
+ first_seen_at,
186
+ last_hello_at
187
+ )
188
+ VALUES ($1, $2, $3, $4, $5, $6)
189
+ ON CONFLICT (device_id) DO UPDATE SET
190
+ permanent_pairing_code = EXCLUDED.permanent_pairing_code,
191
+ code_created_at = EXCLUDED.code_created_at,
192
+ serial_number = EXCLUDED.serial_number,
193
+ first_seen_at = EXCLUDED.first_seen_at,
194
+ last_hello_at = EXCLUDED.last_hello_at
195
195
  `, [
196
196
  deviceId,
197
197
  record.permanentPairingCode,
@@ -203,10 +203,10 @@ export class PostgresStore {
203
203
  }
204
204
  async getDeviceRegistryByCode(code) {
205
205
  await this.ensureReady();
206
- const result = await this.pool.query(`
207
- SELECT *
208
- FROM device_registry
209
- WHERE permanent_pairing_code = $1
206
+ const result = await this.pool.query(`
207
+ SELECT *
208
+ FROM device_registry
209
+ WHERE permanent_pairing_code = $1
210
210
  `, [code]);
211
211
  const row = result.rows[0];
212
212
  if (!row)
@@ -218,10 +218,10 @@ export class PostgresStore {
218
218
  }
219
219
  async listDeviceRegistry() {
220
220
  await this.ensureReady();
221
- const result = await this.pool.query(`
222
- SELECT *
223
- FROM device_registry
224
- ORDER BY code_created_at ASC
221
+ const result = await this.pool.query(`
222
+ SELECT *
223
+ FROM device_registry
224
+ ORDER BY code_created_at ASC
225
225
  `);
226
226
  return result.rows.map((row) => ({
227
227
  deviceId: row.device_id,
@@ -230,32 +230,32 @@ export class PostgresStore {
230
230
  }
231
231
  async setPairedDevice(deviceId, record) {
232
232
  await this.ensureReady();
233
- await this.pool.query(`
234
- INSERT INTO paired_devices (
235
- device_id,
236
- pairing_token,
237
- paired_at,
238
- device_name,
239
- platform,
240
- system,
241
- player_version,
242
- last_boot_at,
243
- last_online_at,
244
- last_offline_at,
245
- last_policy_push_at
246
- )
247
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
248
- ON CONFLICT (device_id) DO UPDATE SET
249
- pairing_token = EXCLUDED.pairing_token,
250
- paired_at = EXCLUDED.paired_at,
251
- device_name = EXCLUDED.device_name,
252
- platform = EXCLUDED.platform,
253
- system = EXCLUDED.system,
254
- player_version = EXCLUDED.player_version,
255
- last_boot_at = EXCLUDED.last_boot_at,
256
- last_online_at = EXCLUDED.last_online_at,
257
- last_offline_at = EXCLUDED.last_offline_at,
258
- last_policy_push_at = EXCLUDED.last_policy_push_at
233
+ await this.pool.query(`
234
+ INSERT INTO paired_devices (
235
+ device_id,
236
+ pairing_token,
237
+ paired_at,
238
+ device_name,
239
+ platform,
240
+ system,
241
+ player_version,
242
+ last_boot_at,
243
+ last_online_at,
244
+ last_offline_at,
245
+ last_policy_push_at
246
+ )
247
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
248
+ ON CONFLICT (device_id) DO UPDATE SET
249
+ pairing_token = EXCLUDED.pairing_token,
250
+ paired_at = EXCLUDED.paired_at,
251
+ device_name = EXCLUDED.device_name,
252
+ platform = EXCLUDED.platform,
253
+ system = EXCLUDED.system,
254
+ player_version = EXCLUDED.player_version,
255
+ last_boot_at = EXCLUDED.last_boot_at,
256
+ last_online_at = EXCLUDED.last_online_at,
257
+ last_offline_at = EXCLUDED.last_offline_at,
258
+ last_policy_push_at = EXCLUDED.last_policy_push_at
259
259
  `, [
260
260
  deviceId,
261
261
  record.pairingToken,
@@ -272,10 +272,10 @@ export class PostgresStore {
272
272
  }
273
273
  async getPairedDevice(deviceId) {
274
274
  await this.ensureReady();
275
- const result = await this.pool.query(`
276
- SELECT *
277
- FROM paired_devices
278
- WHERE device_id = $1
275
+ const result = await this.pool.query(`
276
+ SELECT *
277
+ FROM paired_devices
278
+ WHERE device_id = $1
279
279
  `, [deviceId]);
280
280
  const row = result.rows[0];
281
281
  return row ? this.mapPairedDeviceRow(row) : undefined;
@@ -288,10 +288,10 @@ export class PostgresStore {
288
288
  }
289
289
  async listPairedDevices() {
290
290
  await this.ensureReady();
291
- const result = await this.pool.query(`
292
- SELECT *
293
- FROM paired_devices
294
- ORDER BY paired_at ASC
291
+ const result = await this.pool.query(`
292
+ SELECT *
293
+ FROM paired_devices
294
+ ORDER BY paired_at ASC
295
295
  `);
296
296
  return result.rows.map((row) => ({
297
297
  deviceId: row.device_id,
@@ -300,45 +300,45 @@ export class PostgresStore {
300
300
  }
301
301
  async listPlaylists() {
302
302
  await this.ensureReady();
303
- const result = await this.pool.query(`
304
- SELECT *
305
- FROM playlists
306
- ORDER BY updated_at DESC
303
+ const result = await this.pool.query(`
304
+ SELECT *
305
+ FROM playlists
306
+ ORDER BY updated_at DESC
307
307
  `);
308
308
  return result.rows.map((row) => this.mapPlaylistRow(row));
309
309
  }
310
310
  async getPlaylist(id) {
311
311
  await this.ensureReady();
312
- const result = await this.pool.query(`
313
- SELECT *
314
- FROM playlists
315
- WHERE id = $1
312
+ const result = await this.pool.query(`
313
+ SELECT *
314
+ FROM playlists
315
+ WHERE id = $1
316
316
  `, [id]);
317
317
  const row = result.rows[0];
318
318
  return row ? this.mapPlaylistRow(row) : undefined;
319
319
  }
320
320
  async setPlaylist(record) {
321
321
  await this.ensureReady();
322
- await this.pool.query(`
323
- INSERT INTO playlists (
324
- id,
325
- name,
326
- schedule_json,
327
- items_json,
328
- version,
329
- updated_at,
330
- retired,
331
- retired_at
332
- )
333
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
334
- ON CONFLICT (id) DO UPDATE SET
335
- name = EXCLUDED.name,
336
- schedule_json = EXCLUDED.schedule_json,
337
- items_json = EXCLUDED.items_json,
338
- version = EXCLUDED.version,
339
- updated_at = EXCLUDED.updated_at,
340
- retired = EXCLUDED.retired,
341
- retired_at = EXCLUDED.retired_at
322
+ await this.pool.query(`
323
+ INSERT INTO playlists (
324
+ id,
325
+ name,
326
+ schedule_json,
327
+ items_json,
328
+ version,
329
+ updated_at,
330
+ retired,
331
+ retired_at
332
+ )
333
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
334
+ ON CONFLICT (id) DO UPDATE SET
335
+ name = EXCLUDED.name,
336
+ schedule_json = EXCLUDED.schedule_json,
337
+ items_json = EXCLUDED.items_json,
338
+ version = EXCLUDED.version,
339
+ updated_at = EXCLUDED.updated_at,
340
+ retired = EXCLUDED.retired,
341
+ retired_at = EXCLUDED.retired_at
342
342
  `, [
343
343
  record.id,
344
344
  record.name,
@@ -355,65 +355,65 @@ export class PostgresStore {
355
355
  const target = name.trim().toLowerCase();
356
356
  if (!target)
357
357
  return false;
358
- const result = await this.pool.query(`
359
- SELECT id
360
- FROM playlists
361
- WHERE retired = false
362
- AND lower(trim(name)) = $1
363
- AND ($2::text IS NULL OR id != $2)
364
- LIMIT 1
358
+ const result = await this.pool.query(`
359
+ SELECT id
360
+ FROM playlists
361
+ WHERE retired = false
362
+ AND lower(trim(name)) = $1
363
+ AND ($2::text IS NULL OR id != $2)
364
+ LIMIT 1
365
365
  `, [target, excludeId ?? null]);
366
366
  return result.rows.length > 0;
367
367
  }
368
368
  async getUploadedAsset(id) {
369
369
  await this.ensureReady();
370
- const result = await this.pool.query(`
371
- SELECT *
372
- FROM uploaded_assets
373
- WHERE id = $1
370
+ const result = await this.pool.query(`
371
+ SELECT *
372
+ FROM uploaded_assets
373
+ WHERE id = $1
374
374
  `, [id]);
375
375
  const row = result.rows[0];
376
376
  return row ? this.mapUploadedAssetRow(row) : undefined;
377
377
  }
378
378
  async getUploadedAssetBySha256(sha256, storageProvider) {
379
379
  await this.ensureReady();
380
- const result = await this.pool.query(`
381
- SELECT *
382
- FROM uploaded_assets
383
- WHERE sha256 = $1
384
- AND ($2::text IS NULL OR storage_provider = $2)
385
- LIMIT 1
380
+ const result = await this.pool.query(`
381
+ SELECT *
382
+ FROM uploaded_assets
383
+ WHERE sha256 = $1
384
+ AND ($2::text IS NULL OR storage_provider = $2)
385
+ LIMIT 1
386
386
  `, [sha256, storageProvider ?? null]);
387
387
  const row = result.rows[0];
388
388
  return row ? this.mapUploadedAssetRow(row) : undefined;
389
389
  }
390
390
  async setUploadedAsset(record) {
391
391
  await this.ensureReady();
392
- await this.pool.query(`
393
- INSERT INTO uploaded_assets (
394
- id,
395
- sha256,
396
- storage_provider,
397
- storage_key,
398
- url,
399
- original_filename,
400
- mime_type,
401
- resource_type,
402
- bytes,
403
- created_at,
404
- updated_at
405
- )
406
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
407
- ON CONFLICT (id) DO UPDATE SET
408
- sha256 = EXCLUDED.sha256,
409
- storage_provider = EXCLUDED.storage_provider,
410
- storage_key = EXCLUDED.storage_key,
411
- url = EXCLUDED.url,
412
- original_filename = EXCLUDED.original_filename,
413
- mime_type = EXCLUDED.mime_type,
414
- resource_type = EXCLUDED.resource_type,
415
- bytes = EXCLUDED.bytes,
416
- updated_at = EXCLUDED.updated_at
392
+ await this.pool.query(`
393
+ INSERT INTO uploaded_assets (
394
+ id,
395
+ sha256,
396
+ storage_provider,
397
+ storage_key,
398
+ url,
399
+ original_filename,
400
+ mime_type,
401
+ resource_type,
402
+ bytes,
403
+ created_at,
404
+ updated_at
405
+ )
406
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
407
+ ON CONFLICT (id) DO UPDATE SET
408
+ sha256 = EXCLUDED.sha256,
409
+ storage_provider = EXCLUDED.storage_provider,
410
+ storage_key = EXCLUDED.storage_key,
411
+ url = EXCLUDED.url,
412
+ original_filename = EXCLUDED.original_filename,
413
+ mime_type = EXCLUDED.mime_type,
414
+ resource_type = EXCLUDED.resource_type,
415
+ bytes = EXCLUDED.bytes,
416
+ updated_at = EXCLUDED.updated_at
417
417
  `, [
418
418
  record.id,
419
419
  record.sha256,
@@ -434,20 +434,20 @@ export class PostgresStore {
434
434
  }
435
435
  async listUploadedAssets() {
436
436
  await this.ensureReady();
437
- const result = await this.pool.query(`
438
- SELECT *
439
- FROM uploaded_assets
440
- ORDER BY created_at ASC
437
+ const result = await this.pool.query(`
438
+ SELECT *
439
+ FROM uploaded_assets
440
+ ORDER BY created_at ASC
441
441
  `);
442
442
  return result.rows.map((row) => this.mapUploadedAssetRow(row));
443
443
  }
444
444
  async getDeviceAssignments(deviceId) {
445
445
  await this.ensureReady();
446
- const result = await this.pool.query(`
447
- SELECT playlist_id, published_version, published_at, snapshot_json
448
- FROM device_assignments
449
- WHERE device_id = $1
450
- ORDER BY sort_order ASC
446
+ const result = await this.pool.query(`
447
+ SELECT playlist_id, published_version, published_at, snapshot_json
448
+ FROM device_assignments
449
+ WHERE device_id = $1
450
+ ORDER BY sort_order ASC
451
451
  `, [deviceId]);
452
452
  return result.rows.map((row) => ({
453
453
  playlistId: row.playlist_id,
@@ -470,16 +470,16 @@ export class PostgresStore {
470
470
  deviceId
471
471
  ]);
472
472
  for (const [index, assignment] of assignments.entries()) {
473
- await client.query(`
474
- INSERT INTO device_assignments (
475
- device_id,
476
- playlist_id,
477
- sort_order,
478
- published_version,
479
- published_at,
480
- snapshot_json
481
- )
482
- VALUES ($1, $2, $3, $4, $5, $6)
473
+ await client.query(`
474
+ INSERT INTO device_assignments (
475
+ device_id,
476
+ playlist_id,
477
+ sort_order,
478
+ published_version,
479
+ published_at,
480
+ snapshot_json
481
+ )
482
+ VALUES ($1, $2, $3, $4, $5, $6)
483
483
  `, [
484
484
  deviceId,
485
485
  assignment.playlistId,