File size: 2,208 Bytes
bff1056
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import fs from 'fs/promises';
import path from 'path';
import { DATA_ROOT, isPostgresStorageMode } from './dataPaths.js';
import {
  decryptJsonPayload,
  encryptJsonPayload,
  makeLookupToken,
  pgQuery,
} from './postgres.js';

const VERSION_FILE = path.join(DATA_ROOT, 'version.json');

function versionLookup(publicUrl) {
  return makeLookupToken('app-version', publicUrl);
}

function versionAad(publicUrl) {
  return `app-version:${publicUrl}`;
}

export async function loadStoredSHA(publicUrl) {
  if (isPostgresStorageMode()) {
    const { rows } = await pgQuery(
      'SELECT payload FROM app_versions WHERE public_url_lookup = $1',
      [versionLookup(publicUrl)]
    );
    const payload = rows[0]
      ? decryptJsonPayload(rows[0].payload, versionAad(publicUrl))
      : null;
    return payload?.sha || null;
  }

  try {
    await fs.mkdir(DATA_ROOT, { recursive: true });
    const raw = await fs.readFile(VERSION_FILE, 'utf8');
    const data = JSON.parse(raw);
    const obj = Array.isArray(data) ? data.find((item) => item[publicUrl]) : null;
    return obj ? obj[publicUrl] : null;
  } catch {
    return null;
  }
}

export async function saveStoredSHA(publicUrl, sha) {
  if (isPostgresStorageMode()) {
    await pgQuery(
      `INSERT INTO app_versions (public_url_lookup, updated_at, payload)
       VALUES ($1, $2, $3::jsonb)
       ON CONFLICT (public_url_lookup)
       DO UPDATE SET updated_at = EXCLUDED.updated_at, payload = EXCLUDED.payload`,
      [
        versionLookup(publicUrl),
        new Date().toISOString(),
        JSON.stringify(encryptJsonPayload({ publicUrl, sha }, versionAad(publicUrl))),
      ]
    );
    return;
  }

  await fs.mkdir(DATA_ROOT, { recursive: true });

  let data = [];
  try {
    const raw = await fs.readFile(VERSION_FILE, 'utf8');
    const parsed = JSON.parse(raw);
    data = Array.isArray(parsed) ? parsed : [];
  } catch {
    data = [];
  }

  let found = false;
  for (const entry of data) {
    if (entry[publicUrl]) {
      entry[publicUrl] = sha;
      found = true;
      break;
    }
  }

  if (!found) {
    data.push({ [publicUrl]: sha });
  }

  await fs.writeFile(VERSION_FILE, JSON.stringify(data, null, 2), 'utf8');
}