autosync_backend2 1.0.74 → 1.0.75

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
@@ -1308,6 +1308,7 @@ declare const app: Elysia<"", {
1308
1308
  excel: {
1309
1309
  post: {
1310
1310
  body: {
1311
+ branchId?: string | undefined;
1311
1312
  file: File;
1312
1313
  };
1313
1314
  params: {};
@@ -1317,7 +1318,7 @@ declare const app: Elysia<"", {
1317
1318
  200: AsyncGenerator<{
1318
1319
  percent: number;
1319
1320
  status: string;
1320
- }, void, unknown>;
1321
+ }, import("elysia/dist/error").ElysiaCustomStatusResponse<"Bad Request", readonly import("@sinclair/typebox/build/cjs/errors").ValueError[], 400> | undefined, unknown>;
1321
1322
  422: {
1322
1323
  type: "validation";
1323
1324
  on: string;
package/dist/index.js CHANGED
@@ -95937,8 +95937,8 @@ var version2 = XLSX.version;
95937
95937
  // src/routes/inventory/log/logic.ts
95938
95938
  var InventoryLogLogic;
95939
95939
  ((InventoryLogLogic) => {
95940
- InventoryLogLogic.select = async (query) => {
95941
- const filter = and(eq(inventoryItemTable.supplierId, query.supplierId ?? "").if(query.supplierId), or(ilike(inventoryItemTable.name, `%${query.search}%`), ilike(inventoryItemTable.barCode, `%${query.search}%`), ilike(inventoryItemTable.oen, `%${query.search}%`), ilike(inventoryItemTable.partNumber, `%${query.search}%`))?.if(query.search), ilike(inventoryItemTable.shelfNumber, `%${query.shelfNumber}%`).if(query.shelfNumber), eq(inventoryLogTable.createdUserId, query.createdUserId ?? "").if(query.createdUserId), eq(sql`date(${inventoryLogTable.createdAt})`, query.createdAt ?? "").if(query.createdAt), eq(inventoryLogTable.sellPrice, query.sellPrice ?? 0).if(query.sellPrice));
95940
+ InventoryLogLogic.select = async (query, user2) => {
95941
+ const filter = and(logic_default.getInventoryItemFilter(query, user2), eq(inventoryLogTable.createdUserId, query.createdUserId ?? "").if(query.createdUserId), eq(sql`date(${inventoryLogTable.createdAt})`, query.createdAt ?? "").if(query.createdAt), eq(inventoryLogTable.sellPrice, query.sellPrice ?? 0).if(query.sellPrice));
95942
95942
  const columns = getTableColumns(inventoryLogTable);
95943
95943
  const base = db_default.select({
95944
95944
  ...columns,
@@ -95980,7 +95980,7 @@ var InventoryLogLogic;
95980
95980
  });
95981
95981
  };
95982
95982
  })(InventoryLogLogic ||= {});
95983
- var logic_default = InventoryLogLogic;
95983
+ var logic_default2 = InventoryLogLogic;
95984
95984
 
95985
95985
  // node_modules/drizzle-typebox/index.mjs
95986
95986
  var CONSTANTS = {
@@ -96300,7 +96300,8 @@ var selectInventoryItemSchema = t.Composite([
96300
96300
  PaginationSchema
96301
96301
  ]);
96302
96302
  var importInventoryItemSchema = t.Object({
96303
- file: t.File()
96303
+ file: t.File(),
96304
+ branchId: t.Optional(t.String({ format: "uuid" }))
96304
96305
  });
96305
96306
 
96306
96307
  // src/routes/inventory/item/logic.ts
@@ -96339,7 +96340,7 @@ var InventoryItemLogic;
96339
96340
  merchantId: body.merchantId ?? user2.merchantId
96340
96341
  }).returning();
96341
96342
  if (body.quantity) {
96342
- await logic_default.create({
96343
+ await logic_default2.create({
96343
96344
  itemId: inventoryItem.id,
96344
96345
  quantity: body.quantity,
96345
96346
  description: "\u0413\u0430\u0440\u0430\u0430\u0440 \u0431\u0430\u0440\u0430\u0430 \u043D\u044D\u043C\u0441\u044D\u043D.",
@@ -96364,21 +96365,27 @@ var InventoryItemLogic;
96364
96365
  throw new Error("\u0410\u0433\u0443\u0443\u043B\u0430\u0445\u044B\u043D \u0431\u0430\u0440\u0430\u0430 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439.");
96365
96366
  }
96366
96367
  };
96367
- InventoryItemLogic.importExcel = async function* ({ file }, user2) {
96368
+ InventoryItemLogic.importExcel = async function* ({ file, branchId }, user2) {
96368
96369
  const BATCH_SIZE = 1000;
96369
96370
  const buffer = await file.arrayBuffer();
96370
96371
  const workbook = readSync(buffer, { type: "buffer" });
96371
96372
  const sheetName = workbook.SheetNames[0];
96372
96373
  const sheet = workbook.Sheets[sheetName];
96373
96374
  const rows = utils.sheet_to_json(sheet, { defval: null });
96374
- const parsed = exports_value2.Parse(t.Array(createInventoryItemSchema), rows);
96375
+ let parsed = [];
96376
+ const validator = TypeCompiler.Compile(t.Array(createInventoryItemSchema));
96377
+ if (validator.Check(rows)) {
96378
+ parsed = rows;
96379
+ } else {
96380
+ return status("Bad Request", [...validator.Errors(rows)]);
96381
+ }
96375
96382
  for (let i2 = 0;i2 < parsed.length; i2 += BATCH_SIZE) {
96376
96383
  const batch = parsed.slice(i2, i2 + BATCH_SIZE);
96377
96384
  if (batch.length !== 0) {
96378
96385
  await db_default.insert(inventoryItemTable).values(batch.map((item) => ({
96379
96386
  ...item,
96380
- branchId: item.branchId ?? user2.branchId,
96381
- merchantId: item.merchantId ?? user2.merchantId
96387
+ branchId: branchId ?? user2.branchId,
96388
+ merchantId: user2.merchantId
96382
96389
  })));
96383
96390
  yield {
96384
96391
  percent: Math.round(batch.length / parsed.length * 100),
@@ -96406,7 +96413,7 @@ var InventoryItemLogic;
96406
96413
  if (!currentInventory) {
96407
96414
  return status("Not Found", "\u0410\u0433\u0443\u0443\u043B\u0430\u0445\u044B\u043D \u0431\u0430\u0440\u0430\u0430 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439.");
96408
96415
  }
96409
- await logic_default.create({
96416
+ await logic_default2.create({
96410
96417
  itemId: input.id,
96411
96418
  quantity: input.quantity,
96412
96419
  description: input.description,
@@ -96417,7 +96424,7 @@ var InventoryItemLogic;
96417
96424
  }).where(eq(inventoryItemTable.id, input.id));
96418
96425
  };
96419
96426
  })(InventoryItemLogic ||= {});
96420
- var logic_default2 = InventoryItemLogic;
96427
+ var logic_default = InventoryItemLogic;
96421
96428
 
96422
96429
  // src/routes/inventory/item/index.ts
96423
96430
  var itemRoutes = new Elysia({
@@ -96425,7 +96432,7 @@ var itemRoutes = new Elysia({
96425
96432
  }).use(better_auth_default).use(permission_default).guard({
96426
96433
  auth: true,
96427
96434
  tags: ["InventoryItem"]
96428
- }).get("/", async ({ query, user: user2 }) => await logic_default2.select(query, user2), {
96435
+ }).get("/", async ({ query, user: user2 }) => await logic_default.select(query, user2), {
96429
96436
  query: selectInventoryItemSchema,
96430
96437
  permission: ["INVENTORY_ITEM_SELECT_OWN", "INVENTORY_ITEM_SELECT_ADMIN"],
96431
96438
  beforeHandle({ status: status2, query, permissions }) {
@@ -96433,7 +96440,7 @@ var itemRoutes = new Elysia({
96433
96440
  return status2("Forbidden", "\u0417\u04E9\u0432\u0445\u04E9\u043D \u04E9\u04E9\u0440\u0438\u0439\u043D \u0441\u0430\u043B\u0431\u0430\u0440\u044B\u043D \u0431\u0430\u0440\u0430\u0430 \u0445\u0430\u0440\u0430\u0445 \u0431\u043E\u043B\u043E\u043C\u0436\u0442\u043E\u0439.");
96434
96441
  }
96435
96442
  }
96436
- }).post("/", async ({ body, user: user2 }) => await logic_default2.create(body, user2), {
96443
+ }).post("/", async ({ body, user: user2 }) => await logic_default.create(body, user2), {
96437
96444
  body: createInventoryItemSchema,
96438
96445
  permission: ["INVENTORY_ITEM_CREATE_OWN", "INVENTORY_ITEM_CREATE_ADMIN"],
96439
96446
  beforeHandle({ status: status2, body, permissions }) {
@@ -96441,15 +96448,23 @@ var itemRoutes = new Elysia({
96441
96448
  return status2("Forbidden", "\u0417\u04E9\u0432\u0445\u04E9\u043D \u04E9\u04E9\u0440\u0438\u0439\u043D \u0441\u0430\u043B\u0431\u0430\u0440\u044B\u043D \u0431\u0430\u0440\u0430\u0430 \u04AF\u04AF\u0441\u0433\u044D\u0445 \u0431\u043E\u043B\u043E\u043C\u0436\u0442\u043E\u0439.");
96442
96449
  }
96443
96450
  }
96444
- }).post("/excel", async ({ body, user: user2 }) => logic_default2.importExcel(body, user2), {
96451
+ }).post("/excel", async ({ body, user: user2 }) => logic_default.importExcel(body, user2), {
96445
96452
  body: importInventoryItemSchema,
96446
- permission: ["INVENTORY_ITEM_CREATE_OWN", "INVENTORY_ITEM_CREATE_ADMIN"]
96453
+ permission: ["INVENTORY_ITEM_CREATE_OWN", "INVENTORY_ITEM_CREATE_ADMIN"],
96454
+ beforeHandle: ({ permissions, body: { branchId } }) => {
96455
+ if (!permissions.includes("INVENTORY_ITEM_CREATE_ADMIN") && branchId) {
96456
+ return {
96457
+ status: "Forbidden",
96458
+ message: "\u0417\u04E9\u0432\u0445\u04E9\u043D \u04E9\u04E9\u0440\u0438\u0439\u043D \u0441\u0430\u043B\u0431\u0430\u0440\u044B\u043D \u0431\u0430\u0440\u0430\u0430 \u043D\u044D\u043C\u044D\u0445 \u0431\u043E\u043B\u043E\u043C\u0436\u0442\u043E\u0439."
96459
+ };
96460
+ }
96461
+ }
96447
96462
  }).get("/excel", async () => "").guard({
96448
96463
  params: IdSchema
96449
- }).put("/:id", async ({ params: { id }, body, user: user2, permissions }) => await logic_default2.update(id, body, user2, permissions), {
96464
+ }).put("/:id", async ({ params: { id }, body, user: user2, permissions }) => await logic_default.update(id, body, user2, permissions), {
96450
96465
  body: updateInventoryItemSchema,
96451
96466
  permission: ["INVENTORY_ITEM_UPDATE_OWN", "INVENTORY_ITEM_UPDATE_ADMIN"]
96452
- }).delete("/:id", async ({ params: { id }, user: user2, permissions }) => await logic_default2.remove(id, user2, permissions), {
96467
+ }).delete("/:id", async ({ params: { id }, user: user2, permissions }) => await logic_default.remove(id, user2, permissions), {
96453
96468
  permission: ["INVENTORY_ITEM_DELETE_OWN", "INVENTORY_ITEM_DELETE_ADMIN"]
96454
96469
  });
96455
96470
  var item_default = itemRoutes;
@@ -96466,7 +96481,7 @@ var selectInventoryLogSchema = t.Composite([
96466
96481
  // src/routes/inventory/log/index.ts
96467
96482
  var logRoutes = new Elysia({
96468
96483
  prefix: "/log"
96469
- }).use(better_auth_default).use(permission_default).guard({ auth: true, tags: ["InventoryLog"] }).get("/", ({ query }) => logic_default.select(query), {
96484
+ }).use(better_auth_default).use(permission_default).guard({ auth: true, tags: ["InventoryLog"] }).get("/", ({ query, user: user2 }) => logic_default2.select(query, user2), {
96470
96485
  query: selectInventoryLogSchema,
96471
96486
  permission: ["INVENTORY_LOG_SELECT_OWN", "INVENTORY_LOG_SELECT_ADMIN"],
96472
96487
  beforeHandle({ status: status2, query, permissions }) {
@@ -96864,13 +96879,13 @@ var permissionList = localPermissionList;
96864
96879
  // src/routes/permission/logic.ts
96865
96880
  var PermissionLogic;
96866
96881
  ((PermissionLogic) => {
96867
- PermissionLogic.addPermission = async (body) => {
96882
+ PermissionLogic.addPermission = async (body, tdb = db_default) => {
96868
96883
  const insert = body.permissions.map((permission) => ({
96869
96884
  userId: body.userId,
96870
96885
  code: permission
96871
96886
  }));
96872
- await db_default.delete(permissionTable).where(eq(permissionTable.userId, body.userId));
96873
- await db_default.insert(permissionTable).values(insert);
96887
+ await tdb.delete(permissionTable).where(eq(permissionTable.userId, body.userId));
96888
+ await tdb.insert(permissionTable).values(insert);
96874
96889
  };
96875
96890
  PermissionLogic.selectGroups = async (query) => {
96876
96891
  const columns = getTableColumns(permissionGroupTable);
@@ -97121,25 +97136,28 @@ var UserLogic;
97121
97136
  branchId
97122
97137
  }
97123
97138
  });
97124
- const insertPermissions = body.permissions.map((p) => ({
97125
- userId: result.user.id,
97126
- code: p
97127
- }));
97128
- if (insertPermissions.length > 0) {
97129
- await db_default.insert(permissionTable).values(insertPermissions);
97139
+ try {
97140
+ await logic_default4.addPermission({
97141
+ permissions: body.permissions,
97142
+ userId: result.user.id
97143
+ });
97144
+ } catch (err2) {
97145
+ await db_default.delete(user).where(eq(user.id, result.user.id));
97130
97146
  }
97131
97147
  return result.user;
97132
97148
  };
97133
97149
  UserLogic.update = async (id, body, user2, permissions) => {
97134
- const [updatedUser] = await db_default.update(user).set(body).where(and(eq(user.id, id), eq(user.merchantId, user2.merchantId).if(!permissions.some((p) => adminPermissions.includes(p))), eq(user.branchId, user2.branchId).if(!permissions.some((p) => adminPermissions.includes(p)) || !permissions.includes("USER_CREATE_ADMIN")))).returning();
97135
- if (!updatedUser) {
97136
- return status("Not Found", "\u0425\u044D\u0440\u044D\u0433\u043B\u044D\u0433\u0447 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439.");
97137
- }
97138
- await logic_default4.addPermission({
97139
- permissions: body.permissions,
97140
- userId: updatedUser.id
97150
+ return await db_default.transaction(async (db2) => {
97151
+ const [updatedUser] = await db2.update(user).set(body).where(and(eq(user.id, id), eq(user.merchantId, user2.merchantId).if(!permissions.some((p) => adminPermissions.includes(p))), eq(user.branchId, user2.branchId).if(!permissions.some((p) => adminPermissions.includes(p)) || permissions.includes("USER_CREATE_ADMIN")))).returning();
97152
+ if (!updatedUser) {
97153
+ return status("Not Found", "\u0425\u044D\u0440\u044D\u0433\u043B\u044D\u0433\u0447 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439.");
97154
+ }
97155
+ await logic_default4.addPermission({
97156
+ permissions: body.permissions,
97157
+ userId: updatedUser.id
97158
+ }, db2);
97159
+ return updatedUser;
97141
97160
  });
97142
- return updatedUser;
97143
97161
  };
97144
97162
  })(UserLogic ||= {});
97145
97163
  var logic_default5 = UserLogic;
@@ -97208,11 +97226,7 @@ var app = new Elysia().use(index_default({
97208
97226
  paths: await OpenAPI.getPaths(),
97209
97227
  tags: swagger_tags_default
97210
97228
  }
97211
- })).use(pino_logger_default).onError(({ error: error2, set: set2 }) => {
97212
- return status(set2.status ?? 500, {
97213
- error: error2
97214
- });
97215
- }).onAfterResponse(async ({ request, response, server, status: status2, set: set2, body, headers }) => {
97229
+ })).use(pino_logger_default).onAfterResponse(async ({ request, response, server, status: status3, set: set2, body, headers }) => {
97216
97230
  const log = {
97217
97231
  userId: (await auth2.api.getSession({ headers: request.headers }))?.user.id,
97218
97232
  request: {
@@ -97224,7 +97238,7 @@ var app = new Elysia().use(index_default({
97224
97238
  method: request.method,
97225
97239
  path: request.url,
97226
97240
  statusCode: set2.status?.toString() ?? "200",
97227
- error: status2
97241
+ error: status3
97228
97242
  };
97229
97243
  await db_default.insert(logTable).values(log);
97230
97244
  }).mount(auth2.handler).use(routes_default).listen(env_default.PORT);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autosync_backend2",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "module": "src/index.ts",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,7 +13,8 @@
13
13
  "db:migrate": "bunx --bun drizzle-kit migrate",
14
14
  "db:generate": "bunx --bun drizzle-kit generate",
15
15
  "biome:check": "bunx biome check --write",
16
- "email": "email dev --dir src/lib/emails"
16
+ "email": "email dev --dir src/lib/emails",
17
+ "prepare": "husky"
17
18
  },
18
19
  "dependencies": {
19
20
  "@bogeychan/elysia-logger": "^0.1.8",
@@ -45,6 +46,7 @@
45
46
  "@types/react-dom": "^19.1.5",
46
47
  "bun-types": "latest",
47
48
  "drizzle-kit": "^0.31.1",
49
+ "husky": "^9.1.7",
48
50
  "react-email": "^4.0.15"
49
51
  },
50
52
  "files": [