@tomorrowos/sdk 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/store/postgres-store.js +253 -253
- package/dist/store/sqlite-store.js +249 -249
- package/dist/tomorrowos.d.ts +14 -0
- package/dist/tomorrowos.d.ts.map +1 -1
- package/dist/tomorrowos.js +108 -0
- package/package.json +1 -1
- package/templates/cms-starter/.env.example +12 -12
- package/templates/cms-starter/package.json +2 -2
- package/templates/cms-starter/public/index.html +12 -0
- package/templates/cms-starter/public/methods.js +65 -0
- package/templates/cms-starter/public/panel.css +14 -0
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|