@naisys/erp 3.0.0-beta.9 → 3.0.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/.env.example +5 -0
- package/client-dist/assets/index-CSiMTJfw.css +14 -0
- package/client-dist/assets/index-D5R6NBeW.js +11177 -0
- package/client-dist/assets/rolldown-runtime-B-1-B7_t.js +33 -0
- package/client-dist/assets/vendor-CbiEATh3.js +73851 -0
- package/client-dist/assets/vendor-D8d_HnwE.css +9604 -0
- package/client-dist/favicon-16x16.png +0 -0
- package/client-dist/favicon-32x32.png +0 -0
- package/client-dist/favicon.ico +0 -0
- package/client-dist/index.html +17 -2
- package/dist/{dbConfig.js → database/dbConfig.js} +1 -1
- package/dist/{erpDb.js → database/erpDb.js} +1 -1
- package/dist/erpRoutes.js +115 -0
- package/dist/erpServer.js +92 -162
- package/dist/error-handler.js +3 -0
- package/dist/generated/prisma/internal/class.js +6 -6
- package/dist/generated/prisma/internal/prismaNamespace.js +7 -5
- package/dist/middleware/auth-middleware.js +146 -0
- package/dist/route-helpers.js +2 -2
- package/dist/routes/admin.js +15 -7
- package/dist/routes/audit.js +1 -1
- package/dist/routes/{item-fields.js → items/item-fields.js} +24 -22
- package/dist/routes/{item-instances.js → items/item-instances.js} +42 -24
- package/dist/routes/{items.js → items/items.js} +35 -33
- package/dist/routes/{operation-dependencies.js → operations/operation-dependencies.js} +6 -6
- package/dist/routes/{operation-field-refs.js → operations/operation-field-refs.js} +6 -6
- package/dist/routes/{operation-run-comments.js → operations/operation-run-comments.js} +5 -5
- package/dist/routes/{operation-run-transitions.js → operations/operation-run-transitions.js} +29 -13
- package/dist/routes/{operation-runs.js → operations/operation-runs.js} +48 -10
- package/dist/routes/{operations.js → operations/operations.js} +6 -6
- package/dist/routes/{order-revision-transitions.js → orders/order-revision-transitions.js} +4 -4
- package/dist/routes/{order-revisions.js → orders/order-revisions.js} +6 -6
- package/dist/routes/{order-run-transitions.js → orders/order-run-transitions.js} +11 -5
- package/dist/routes/{order-runs.js → orders/order-runs.js} +7 -5
- package/dist/routes/{orders.js → orders/orders.js} +15 -11
- package/dist/routes/{dispatch.js → production/dispatch.js} +88 -7
- package/dist/routes/{inventory.js → production/inventory.js} +33 -10
- package/dist/routes/{labor-tickets.js → production/labor-tickets.js} +7 -7
- package/dist/routes/{work-centers.js → production/work-centers.js} +29 -29
- package/dist/routes/root.js +1 -1
- package/dist/routes/{step-field-attachments.js → steps/step-field-attachments.js} +8 -8
- package/dist/routes/{step-fields.js → steps/step-fields.js} +6 -6
- package/dist/routes/{step-run-fields.js → steps/step-run-fields.js} +9 -9
- package/dist/routes/{step-run-transitions.js → steps/step-run-transitions.js} +6 -6
- package/dist/routes/{step-runs.js → steps/step-runs.js} +7 -7
- package/dist/routes/{steps.js → steps/steps.js} +5 -5
- package/dist/routes/{auth.js → users/auth.js} +11 -23
- package/dist/routes/{user-permissions.js → users/user-permissions.js} +21 -7
- package/dist/routes/{users.js → users/users.js} +42 -20
- package/dist/services/attachment-service.js +2 -2
- package/dist/services/{item-instance-service.js → inventory/item-instance-service.js} +2 -2
- package/dist/services/{item-service.js → inventory/item-service.js} +2 -2
- package/dist/services/{operation-dependency-service.js → operations/operation-dependency-service.js} +1 -1
- package/dist/services/{operation-run-comment-service.js → operations/operation-run-comment-service.js} +1 -1
- package/dist/services/{operation-run-service.js → operations/operation-run-service.js} +15 -4
- package/dist/services/{operation-service.js → operations/operation-service.js} +2 -2
- package/dist/services/{step-run-service.js → operations/step-run-service.js} +1 -1
- package/dist/services/{step-service.js → operations/step-service.js} +2 -2
- package/dist/services/{order-revision-service.js → orders/order-revision-service.js} +4 -5
- package/dist/services/{order-run-service.js → orders/order-run-service.js} +68 -22
- package/dist/services/{order-service.js → orders/order-service.js} +11 -2
- package/dist/services/{revision-diff-service.js → orders/revision-diff-service.js} +11 -10
- package/dist/services/{field-ref-service.js → production/field-ref-service.js} +1 -1
- package/dist/services/{field-service.js → production/field-service.js} +2 -2
- package/dist/services/{field-value-service.js → production/field-value-service.js} +27 -3
- package/dist/services/production/labor-ticket-backfill.js +67 -0
- package/dist/services/{labor-ticket-service.js → production/labor-ticket-service.js} +21 -15
- package/dist/services/{work-center-service.js → production/work-center-service.js} +2 -2
- package/dist/services/user-service.js +94 -28
- package/dist/version.js +12 -0
- package/npm-shrinkwrap.json +2941 -0
- package/package.json +26 -24
- package/prisma/migrations/20260427010000_hash_user_api_keys/migration.sql +10 -0
- package/prisma/migrations/20260427020000_nullable_user_password_hash/migration.sql +39 -0
- package/prisma/migrations/20260517000000_add_op_run_tokens/migration.sql +2 -0
- package/prisma/schema.prisma +4 -2
- package/client-dist/assets/index-45dVo30p.css +0 -1
- package/client-dist/assets/index-C9uuPHLH.js +0 -168
- package/dist/auth-middleware.js +0 -203
- package/dist/userService.js +0 -118
- /package/bin/{naisys-erp → naisys-erp.js} +0 -0
- /package/dist/{supervisorAuth.js → middleware/supervisorAuth.js} +0 -0
- /package/dist/{audit.js → services/audit.js} +0 -0
package/package.json
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naisys/erp",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "NAISYS ERP - Web UI for AI-driven order and work management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/erpServer.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"naisys-erp": "bin/naisys-erp"
|
|
8
|
+
"naisys-erp": "bin/naisys-erp.js"
|
|
9
9
|
},
|
|
10
10
|
"exports": {
|
|
11
11
|
".": "./dist/erpServer.js"
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
14
|
-
"clean": "rimraf dist client-dist .test-naisys",
|
|
14
|
+
"clean": "npx rimraf dist client-dist .test-naisys",
|
|
15
15
|
"dev": "tsx watch src/erpServer.ts",
|
|
16
16
|
"build": "prisma generate && tsc",
|
|
17
17
|
"bundle": "npx shx rm -rf client-dist && npx shx cp -r ../client/dist client-dist",
|
|
18
18
|
"start": "node dist/erpServer.js",
|
|
19
|
-
"start:reset-password": "node dist/erpServer.js --reset-password",
|
|
20
19
|
"type-check": "tsc --noEmit",
|
|
21
20
|
"npm:publish:dryrun": "npm publish --dry-run",
|
|
22
21
|
"npm:publish": "npm publish --access public",
|
|
@@ -26,9 +25,11 @@
|
|
|
26
25
|
"test": "vitest run && npx playwright test"
|
|
27
26
|
},
|
|
28
27
|
"files": [
|
|
28
|
+
"npm-shrinkwrap.json",
|
|
29
29
|
"dist",
|
|
30
30
|
"client-dist",
|
|
31
31
|
"bin",
|
|
32
|
+
".env.example",
|
|
32
33
|
"prisma.config.ts",
|
|
33
34
|
"prisma/schema.prisma",
|
|
34
35
|
"prisma/migrations",
|
|
@@ -41,33 +42,34 @@
|
|
|
41
42
|
"dependencies": {
|
|
42
43
|
"@fastify/cookie": "^11.0.2",
|
|
43
44
|
"@fastify/cors": "^11.2.0",
|
|
44
|
-
"@fastify/multipart": "^
|
|
45
|
+
"@fastify/multipart": "^10.0.0",
|
|
45
46
|
"@fastify/rate-limit": "^10.3.0",
|
|
46
|
-
"@fastify/static": "^9.
|
|
47
|
+
"@fastify/static": "^9.1.3",
|
|
47
48
|
"@fastify/swagger": "^9.7.0",
|
|
48
|
-
"@naisys/
|
|
49
|
-
"@naisys/common": "3.0.
|
|
50
|
-
"@naisys/
|
|
51
|
-
"@naisys/hub-database": "3.0.
|
|
52
|
-
"@naisys/supervisor-database": "3.0.
|
|
53
|
-
"@prisma/adapter-better-sqlite3": "^7.
|
|
54
|
-
"@prisma/client": "^7.
|
|
55
|
-
"@scalar/fastify-api-reference": "^1.
|
|
56
|
-
"bcryptjs": "^3.0.
|
|
57
|
-
"dotenv": "^17.
|
|
58
|
-
"fastify": "^5.8.
|
|
49
|
+
"@naisys/common": "3.0.1",
|
|
50
|
+
"@naisys/common-node": "3.0.1",
|
|
51
|
+
"@naisys/erp-shared": "3.0.1",
|
|
52
|
+
"@naisys/hub-database": "3.0.1",
|
|
53
|
+
"@naisys/supervisor-database": "3.0.1",
|
|
54
|
+
"@prisma/adapter-better-sqlite3": "^7.8.0",
|
|
55
|
+
"@prisma/client": "^7.8.0",
|
|
56
|
+
"@scalar/fastify-api-reference": "^1.57.5",
|
|
57
|
+
"bcryptjs": "^3.0.3",
|
|
58
|
+
"dotenv": "^17.4.2",
|
|
59
|
+
"fastify": "^5.8.5",
|
|
59
60
|
"fastify-plugin": "^5.1.0",
|
|
60
61
|
"fastify-type-provider-zod": "^6.1.0",
|
|
61
|
-
"zod": "^4.3
|
|
62
|
+
"zod": "^4.4.3"
|
|
62
63
|
},
|
|
63
64
|
"devDependencies": {
|
|
64
|
-
"@playwright/test": "^1.
|
|
65
|
+
"@playwright/test": "^1.60.0",
|
|
65
66
|
"@types/better-sqlite3": "^7.6.13",
|
|
66
|
-
"@types/node": "^25.
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
67
|
+
"@types/node": "^25.9.1",
|
|
68
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
69
|
+
"prisma": "^7.8.0",
|
|
70
|
+
"tsx": "^4.22.3",
|
|
71
|
+
"typescript": "^6.0.3",
|
|
72
|
+
"vitest": "^4.1.7"
|
|
71
73
|
},
|
|
72
74
|
"engines": {
|
|
73
75
|
"node": ">=22.0.0"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- Replace persisted plaintext user API keys with nullable hashes.
|
|
2
|
+
-- Existing plaintext keys are intentionally discarded.
|
|
3
|
+
|
|
4
|
+
DROP INDEX IF EXISTS "users_api_key_key";
|
|
5
|
+
|
|
6
|
+
ALTER TABLE "users" RENAME COLUMN "api_key" TO "api_key_hash";
|
|
7
|
+
|
|
8
|
+
UPDATE "users" SET "api_key_hash" = NULL;
|
|
9
|
+
|
|
10
|
+
CREATE UNIQUE INDEX "users_api_key_hash_key" ON "users"("api_key_hash");
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
-- Make users.password_hash nullable. NULL means the user is not
|
|
2
|
+
-- password-authable (passkey-only, API-key-only, or agent).
|
|
3
|
+
-- Existing sentinel values are converted to NULL.
|
|
4
|
+
|
|
5
|
+
PRAGMA foreign_keys=OFF;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE "users_new" (
|
|
8
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
9
|
+
"uuid" TEXT NOT NULL,
|
|
10
|
+
"username" TEXT NOT NULL,
|
|
11
|
+
"password_hash" TEXT,
|
|
12
|
+
"is_agent" INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
14
|
+
"updated_at" DATETIME NOT NULL,
|
|
15
|
+
"deleted_at" DATETIME,
|
|
16
|
+
"api_key_hash" TEXT
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
INSERT INTO "users_new" ("id", "uuid", "username", "password_hash", "is_agent", "created_at", "updated_at", "deleted_at", "api_key_hash")
|
|
20
|
+
SELECT
|
|
21
|
+
"id",
|
|
22
|
+
"uuid",
|
|
23
|
+
"username",
|
|
24
|
+
CASE WHEN "password_hash" IN ('!sso-passkey-only', '!api-key-only', '') THEN NULL ELSE "password_hash" END,
|
|
25
|
+
"is_agent",
|
|
26
|
+
"created_at",
|
|
27
|
+
"updated_at",
|
|
28
|
+
"deleted_at",
|
|
29
|
+
"api_key_hash"
|
|
30
|
+
FROM "users";
|
|
31
|
+
|
|
32
|
+
DROP TABLE "users";
|
|
33
|
+
ALTER TABLE "users_new" RENAME TO "users";
|
|
34
|
+
|
|
35
|
+
CREATE UNIQUE INDEX "users_uuid_key" ON "users"("uuid");
|
|
36
|
+
CREATE UNIQUE INDEX "users_username_key" ON "users"("username");
|
|
37
|
+
CREATE UNIQUE INDEX "users_api_key_hash_key" ON "users"("api_key_hash");
|
|
38
|
+
|
|
39
|
+
PRAGMA foreign_keys=ON;
|
package/prisma/schema.prisma
CHANGED
|
@@ -307,6 +307,7 @@ model OperationRun {
|
|
|
307
307
|
status OperationRunStatus @default(pending)
|
|
308
308
|
assignedToId Int? @map("assigned_to_id")
|
|
309
309
|
cost Float?
|
|
310
|
+
tokens Int?
|
|
310
311
|
statusNote String? @map("status_note")
|
|
311
312
|
completedAt DateTime? @map("completed_at")
|
|
312
313
|
createdAt DateTime @default(now()) @map("created_at")
|
|
@@ -418,8 +419,8 @@ model User {
|
|
|
418
419
|
id Int @id @default(autoincrement())
|
|
419
420
|
uuid String @unique
|
|
420
421
|
username String @unique
|
|
421
|
-
passwordHash String
|
|
422
|
-
|
|
422
|
+
passwordHash String? @map("password_hash")
|
|
423
|
+
apiKeyHash String? @unique @map("api_key_hash")
|
|
423
424
|
isAgent Boolean @default(false) @map("is_agent")
|
|
424
425
|
createdAt DateTime @default(now()) @map("created_at")
|
|
425
426
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
@@ -518,6 +519,7 @@ model LaborTicket {
|
|
|
518
519
|
clockIn DateTime @map("clock_in")
|
|
519
520
|
clockOut DateTime? @map("clock_out")
|
|
520
521
|
cost Float?
|
|
522
|
+
tokens Int?
|
|
521
523
|
createdAt DateTime @default(now()) @map("created_at")
|
|
522
524
|
createdById Int @map("created_by")
|
|
523
525
|
updatedAt DateTime @updatedAt @map("updated_at")
|