Skip to content

Commit d17b112

Browse files
committed
Adding download controller
1 parent e9ae6fc commit d17b112

File tree

6 files changed

+50
-3
lines changed

6 files changed

+50
-3
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "labelzoom-cf-api-proxy",
33
"description": "A Cloudflare Worker that serves as a reverse proxy for LabelZoom's public REST API",
4-
"version": "1.1.3",
4+
"version": "1.2.0",
55
"private": true,
66
"dependencies": {
77
"hono": "4.7.7",

src/worker/constants.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export const GET_LATEST_VERSION_SQL = `
2+
SELECT
3+
pvv.*
4+
FROM
5+
products_variants_versions pvv
6+
JOIN products_variants pv
7+
ON
8+
pv.id = pvv.variant_id
9+
JOIN products p
10+
ON
11+
p.id = pv.product_id
12+
WHERE
13+
p.name = 'LabelZoom Studio'
14+
ORDER BY
15+
pvv.major DESC,
16+
pvv.minor DESC,
17+
pvv.revision DESC
18+
LIMIT 1;
19+
`;
20+
21+
export const VERIFY_LICENSE_SQL = "SELECT 1 FROM licenses WHERE id = ? AND license_secret = ?;";

src/worker/index.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { every } from "hono/combine";
1111
import { hyperdriveMysql } from "./middleware/hyperdrive-mysql";
1212
import { bearerAuth } from "hono/bearer-auth";
1313
import { logger } from "hono/logger";
14+
import { GET_LATEST_VERSION_SQL, VERIFY_LICENSE_SQL } from "./constants";
1415

1516
async function verifyTokenAndLicense(token: string, c: Context) {
1617
const db = c.get('db');
@@ -23,7 +24,7 @@ async function verifyTokenAndLicense(token: string, c: Context) {
2324
// Verify license
2425
const licenseId = payload.lic;
2526
const licenseKey = payload.secret;
26-
const [results] = await db.query("SELECT * FROM licenses WHERE id = ? AND license_secret = ?;", [licenseId, licenseKey]);
27+
const [results] = await db.query(VERIFY_LICENSE_SQL, [licenseId, licenseKey]);
2728
return (results as mysql.RowDataPacket[]).length === 1;
2829
} catch (err) {
2930
console.warn('error verifying token', err);
@@ -88,6 +89,25 @@ app.use("/api/v2/convert/:sourceFormat/to/:targetFormat", (c, next) => {
8889
});
8990
//#endregion
9091

92+
//#region Download redirects
93+
app.use("/download/*", (c, next) => {
94+
return hyperdriveMysql({
95+
config: c.env.DB,
96+
})(c, next);
97+
});
98+
app.get("/download/:version/:packageName", async (c) => {
99+
let { version, packageName } = c.req.param();
100+
if (version === 'latest') {
101+
const db = c.get('db');
102+
if (!db) throw new Error('download controller must be used with (and sequenced after) the hyperdrive middleware');
103+
const [results] = await db.query(GET_LATEST_VERSION_SQL);
104+
const rows = results as mysql.RowDataPacket[];
105+
version = `${rows[0].major}.${rows[0].minor}.${rows[0].revision}`;
106+
}
107+
return c.redirect(`${c.env.S3_BUCKET}/${version}/${packageName}`);
108+
});
109+
//#endregion
110+
91111
//#region All other requests
92112
app.use(forceRelativeRedirects());
93113
app.use(async (c, next) => {

src/worker/middleware/hyperdrive-mysql/hyperdrive-mysql.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { MiddlewareHandler } from "hono";
1010
* @todo TODO: Get rid of this once Cloudflare adds this type to the output of `wrangler types`
1111
*/
1212
export type Connection = mysql.Connection & {
13-
query(sql: string, values: any): Promise<[mysql.OkPacket | mysql.ResultSetHeader | mysql.RowDataPacket[] | mysql.RowDataPacket[][] | mysql.OkPacket[], mysql.FieldPacket[]]>;
13+
query(sql: string, values?: any): Promise<[mysql.OkPacket | mysql.ResultSetHeader | mysql.RowDataPacket[] | mysql.RowDataPacket[][] | mysql.OkPacket[], mysql.FieldPacket[]]>;
1414
};
1515

1616
function getConnection(hyperdrive: Hyperdrive): Promise<Connection> {

worker-configuration.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ declare namespace Cloudflare {
1313
LZ_PUBLIC_KEY: string;
1414
LZ_R2_BUCKET: R2Bucket;
1515
DB: Hyperdrive;
16+
S3_BUCKET: string;
1617
}
1718
}
1819
interface Env extends Cloudflare.Env {}

wrangler.jsonc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"LZ_ERROR_SAMPLE_RATE": 1,
6363
"LZ_PROD_API_BASE_URL": "http://localhost:5000",
6464
"ENVIRONMENT": "dev",
65+
"S3_BUCKET": "https://labelzoom-packages.s3.us-east-2.amazonaws.com",
6566
},
6667
"env": {
6768
"beta": {
@@ -76,6 +77,7 @@
7677
"LZ_ERROR_SAMPLE_RATE": 1,
7778
"LZ_PROD_API_BASE_URL": "https://api-backend.labelzoom.net",
7879
"ENVIRONMENT": "staging",
80+
"S3_BUCKET": "https://labelzoom-packages.s3.us-east-2.amazonaws.com",
7981
},
8082
"limits": {
8183
"cpu_ms": 100
@@ -117,6 +119,7 @@
117119
"LZ_ERROR_SAMPLE_RATE": 0,
118120
"LZ_PROD_API_BASE_URL": "https://api-backend.labelzoom.net",
119121
"ENVIRONMENT": "production",
122+
"S3_BUCKET": "https://labelzoom-packages.s3.us-east-2.amazonaws.com",
120123
},
121124
"limits": {
122125
"cpu_ms": 100
@@ -159,6 +162,7 @@
159162
"LZ_ERROR_SAMPLE_RATE": 0,
160163
"LZ_PROD_API_BASE_URL": "https://prod-api-eus1-backend.labelzoom.net",
161164
"ENVIRONMENT": "production",
165+
"S3_BUCKET": "https://labelzoom-packages.s3.us-east-2.amazonaws.com",
162166
},
163167
"limits": {
164168
"cpu_ms": 100
@@ -201,6 +205,7 @@
201205
"LZ_ERROR_SAMPLE_RATE": 1,
202206
"LZ_PROD_API_BASE_URL": "https://prod-api-eus2-backend.labelzoom.net",
203207
"ENVIRONMENT": "production",
208+
"S3_BUCKET": "https://labelzoom-packages.s3.us-east-2.amazonaws.com",
204209
},
205210
"limits": {
206211
"cpu_ms": 100

0 commit comments

Comments
 (0)