@access-dlsu/leapify 0.260601.2 → 0.260602.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.js CHANGED
@@ -1,10 +1,10 @@
1
- import { createTurnstileMiddleware, TURNSTILE_VERIFY_PATH, handleTurnstileVerify } from './chunk-2JEY6TSO.js';
1
+ import { createTurnstileMiddleware, TURNSTILE_VERIFY_PATH, handleTurnstileVerify } from './chunk-WTA2QGY5.js';
2
2
  import { __export } from './chunk-PZ5AY32C.js';
3
3
  import { Hono } from 'hono';
4
4
  import { cors } from 'hono/cors';
5
5
  import { drizzle } from 'drizzle-orm/d1';
6
6
  import { sqliteTable, integer, text, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
7
- import { sql, relations, eq, and, count, isNotNull, lte } from 'drizzle-orm';
7
+ import { sql, relations, eq, and, asc, count, isNotNull, lte } from 'drizzle-orm';
8
8
  import { createMiddleware } from 'hono/factory';
9
9
  import { betterAuth } from 'better-auth';
10
10
  import { drizzleAdapter } from 'better-auth/adapters/drizzle';
@@ -20,8 +20,6 @@ var LeapifyError = class extends Error {
20
20
  this.code = code;
21
21
  this.name = "LeapifyError";
22
22
  }
23
- statusCode;
24
- code;
25
23
  };
26
24
  var unauthorized = (message = "Unauthorized") => new LeapifyError(401, "UNAUTHORIZED", message);
27
25
  var domainRestricted = () => new LeapifyError(
@@ -87,6 +85,10 @@ var themes = sqliteTable("themes", {
87
85
  name: text("name").notNull().unique(),
88
86
  path: text("path").notNull().unique(),
89
87
  // e.g. "/pirates-cove"
88
+ imageUrl: text("image_url"),
89
+ descriptionEn: text("description_en"),
90
+ descriptionFil: text("description_fil"),
91
+ sortOrder: integer("sort_order").notNull().default(0),
90
92
  createdAt: integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3)),
91
93
  updatedAt: integer("updated_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
92
94
  });
@@ -748,7 +750,6 @@ var CacheService = class {
748
750
  constructor(kv) {
749
751
  this.kv = kv;
750
752
  }
751
- kv;
752
753
  async get(key) {
753
754
  return this.kv.get(key, "json");
754
755
  }
@@ -794,8 +795,6 @@ var SlotsService = class {
794
795
  this.db = db;
795
796
  this.cache = cache;
796
797
  }
797
- db;
798
- cache;
799
798
  kvKey(slug) {
800
799
  return `${SLOT_KV_PREFIX}${slug}`;
801
800
  }
@@ -1453,7 +1452,7 @@ faqsRoute.get("/", async (c) => {
1453
1452
  const data = await cache.getOrSet(
1454
1453
  FAQS_KV_KEY,
1455
1454
  () => db.query.faqs.findMany({
1456
- orderBy: (t, { asc }) => [asc(t.sortOrder), asc(t.createdAt)]
1455
+ orderBy: (t, { asc: asc2 }) => [asc2(t.sortOrder), asc2(t.createdAt)]
1457
1456
  }),
1458
1457
  FAQS_TTL
1459
1458
  );
@@ -1844,14 +1843,27 @@ function extensionFromMime(mime) {
1844
1843
  };
1845
1844
  return map[mime] ?? "bin";
1846
1845
  }
1846
+ function generatePath(name) {
1847
+ return name.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
1848
+ }
1847
1849
  var createThemeSchema = z.object({
1848
1850
  name: z.string().min(1),
1849
- path: z.string().min(1)
1851
+ imageUrl: z.string().url().nullable().optional(),
1852
+ descriptionEn: z.string().nullable().optional(),
1853
+ descriptionFil: z.string().nullable().optional(),
1854
+ sortOrder: z.number().int().default(0)
1855
+ });
1856
+ z.object({
1857
+ name: z.string().min(1).optional(),
1858
+ imageUrl: z.string().url().nullable().optional(),
1859
+ descriptionEn: z.string().nullable().optional(),
1860
+ descriptionFil: z.string().nullable().optional(),
1861
+ sortOrder: z.number().int().optional()
1850
1862
  });
1851
1863
  var themesRoute = new Hono();
1852
1864
  themesRoute.get("/", async (c) => {
1853
1865
  const db = createDb(c.env.DB);
1854
- const data = await db.select().from(themes);
1866
+ const data = await db.select().from(themes).orderBy(asc(themes.sortOrder), asc(themes.createdAt));
1855
1867
  return c.json({ data });
1856
1868
  });
1857
1869
  themesRoute.post(
@@ -1862,8 +1874,9 @@ themesRoute.post(
1862
1874
  async (c) => {
1863
1875
  const body = c.req.valid("json");
1864
1876
  const db = createDb(c.env.DB);
1877
+ const path = generatePath(body.name);
1865
1878
  try {
1866
- const [created] = await db.insert(themes).values(body).returning();
1879
+ const [created] = await db.insert(themes).values({ ...body, path }).returning();
1867
1880
  return c.json({ data: created }, 201);
1868
1881
  } catch (err) {
1869
1882
  if (err.message && err.message.includes("UNIQUE constraint failed")) {
@@ -1881,8 +1894,12 @@ themesRoute.patch(
1881
1894
  const { id } = c.req.param();
1882
1895
  const body = await c.req.json();
1883
1896
  const db = createDb(c.env.DB);
1897
+ const update = { ...body };
1898
+ if (body.name) {
1899
+ update.path = generatePath(body.name);
1900
+ }
1884
1901
  try {
1885
- const [updated] = await db.update(themes).set(body).where(eq(themes.id, id)).returning();
1902
+ const [updated] = await db.update(themes).set(update).where(eq(themes.id, id)).returning();
1886
1903
  if (!updated) throw notFound("Theme");
1887
1904
  return c.json({ data: updated });
1888
1905
  } catch (err) {
@@ -2120,7 +2137,6 @@ var SesError = class extends Error {
2120
2137
  this.status = status;
2121
2138
  this.name = "SesError";
2122
2139
  }
2123
- status;
2124
2140
  /**
2125
2141
  * True for errors that are permanent (not worth retrying via SES again).
2126
2142
  * 400 BadRequest, 403 Forbidden, 404 NotFound → non-retryable.