@heyhru/business-dms-user 0.2.0

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/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # @heyhru/business-dms-user
2
+
3
+ DMS user domain logic: service, model, sql.
4
+
5
+ ## API
6
+
7
+ ### `getUserByUsername(username: string)`
8
+
9
+ Look up a user by username. Returns the full user row (including `password_hash`) or `undefined`.
10
+
11
+ Used by auth service for login and password change.
12
+
13
+ ### `updateUserPassword(id: string, hash: string)`
14
+
15
+ Update the `password_hash` for a user by ID.
16
+
17
+ ### Route handlers (Fastify)
18
+
19
+ The following functions are route-facing handlers with signature `(req: FastifyRequest, reply: FastifyReply)`. Register them directly on a Fastify instance.
20
+
21
+ | Function | Route action | Description |
22
+ | ------------ | -------------------- | -------------------------------- |
23
+ | `userList` | `POST /users/list` | List all users |
24
+ | `userGet` | `POST /users/get` | Get a user by `id` in body |
25
+ | `userCreate` | `POST /users/create` | Create a user, hashes password |
26
+ | `userUpdate` | `POST /users/update` | Update `email` or `role` by `id` |
27
+ | `userDelete` | `POST /users/delete` | Delete a user by `id` |
@@ -0,0 +1,2 @@
1
+ export { getUserByUsername, updateUserPassword, userList, userGet, userCreate, userUpdate, userDelete, } from "./users.service.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ getUserByUsername: () => getUserByUsername2,
24
+ updateUserPassword: () => updateUserPassword,
25
+ userCreate: () => userCreate,
26
+ userDelete: () => userDelete,
27
+ userGet: () => userGet,
28
+ userList: () => userList,
29
+ userUpdate: () => userUpdate
30
+ });
31
+ module.exports = __toCommonJS(index_exports);
32
+
33
+ // src/users.service.ts
34
+ var import_server_util_crypto = require("@heyhru/server-util-crypto");
35
+
36
+ // src/users.model.ts
37
+ var import_server_plugin_pg = require("@heyhru/server-plugin-pg");
38
+
39
+ // src/users.sql.ts
40
+ var LIST = `
41
+ SELECT id, username, email, role, created_at
42
+ FROM users
43
+ ORDER BY created_at DESC`;
44
+ var FIND_BY_ID = `
45
+ SELECT id, username, email, role, created_at
46
+ FROM users
47
+ WHERE id = ?`;
48
+ var FIND_BY_USERNAME = `
49
+ SELECT *
50
+ FROM users
51
+ WHERE username = ?`;
52
+ var CREATE = `
53
+ INSERT INTO users (username, email, password_hash, role)
54
+ VALUES (?, ?, ?, ?)
55
+ RETURNING id, username, email, role, created_at`;
56
+ var UPDATE_PASSWORD = () => `
57
+ UPDATE users
58
+ SET password_hash = ?, updated_at = NOW()
59
+ WHERE id = ?`;
60
+ var DELETE = `
61
+ DELETE FROM users
62
+ WHERE id = ?`;
63
+
64
+ // src/users.model.ts
65
+ function listUsers() {
66
+ return (0, import_server_plugin_pg.getPgDb)().query(LIST);
67
+ }
68
+ function getUserById(id) {
69
+ return (0, import_server_plugin_pg.getPgDb)().queryOne(FIND_BY_ID, [id]);
70
+ }
71
+ function getUserByUsername(username) {
72
+ return (0, import_server_plugin_pg.getPgDb)().queryOne(FIND_BY_USERNAME, [username]);
73
+ }
74
+ function createUserRow(username, email, hash, role) {
75
+ return (0, import_server_plugin_pg.getPgDb)().queryOne(CREATE, [username, email, hash, role]);
76
+ }
77
+ async function updateUserRow(id, data) {
78
+ const fields = [];
79
+ const values = [];
80
+ if (data.email) {
81
+ fields.push("email = ?");
82
+ values.push(data.email);
83
+ }
84
+ if (data.role) {
85
+ fields.push("role = ?");
86
+ values.push(data.role);
87
+ }
88
+ if (!fields.length) return getUserById(id);
89
+ fields.push("updated_at = NOW()");
90
+ values.push(id);
91
+ return (0, import_server_plugin_pg.getPgDb)().queryOne(
92
+ `UPDATE users SET ${fields.join(", ")} WHERE id = ? RETURNING id, username, email, role, created_at`,
93
+ values
94
+ );
95
+ }
96
+ function deleteUser(id) {
97
+ return (0, import_server_plugin_pg.getPgDb)().run(DELETE, [id]);
98
+ }
99
+ function updatePasswordHash(id, hash) {
100
+ return (0, import_server_plugin_pg.getPgDb)().run(UPDATE_PASSWORD(), [hash, id]);
101
+ }
102
+
103
+ // src/users.service.ts
104
+ function getUserByUsername2(username) {
105
+ return getUserByUsername(username);
106
+ }
107
+ function updateUserPassword(id, hash) {
108
+ return updatePasswordHash(id, hash);
109
+ }
110
+ async function userList(_req, reply) {
111
+ return reply.send(await listUsers());
112
+ }
113
+ async function userGet(req, reply) {
114
+ const { id } = req.body ?? {};
115
+ const user = await getUserById(id);
116
+ if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
117
+ return reply.send(user);
118
+ }
119
+ async function userCreate(req, reply) {
120
+ const body = req.body ?? {};
121
+ const hash = await (0, import_server_util_crypto.hashPassword)(body.password);
122
+ const user = await createUserRow(body.username, body.email, hash, body.role);
123
+ return reply.code(201).send(user);
124
+ }
125
+ async function userUpdate(req, reply) {
126
+ const { id, ...rest } = req.body ?? {};
127
+ const user = await updateUserRow(id, rest);
128
+ if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
129
+ return reply.send(user);
130
+ }
131
+ async function userDelete(req, reply) {
132
+ const { id } = req.body ?? {};
133
+ await deleteUser(id);
134
+ return reply.code(204).send();
135
+ }
136
+ // Annotate the CommonJS export names for ESM import in node:
137
+ 0 && (module.exports = {
138
+ getUserByUsername,
139
+ updateUserPassword,
140
+ userCreate,
141
+ userDelete,
142
+ userGet,
143
+ userList,
144
+ userUpdate
145
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,112 @@
1
+ // src/users.service.ts
2
+ import { hashPassword } from "@heyhru/server-util-crypto";
3
+
4
+ // src/users.model.ts
5
+ import { getPgDb } from "@heyhru/server-plugin-pg";
6
+
7
+ // src/users.sql.ts
8
+ var LIST = `
9
+ SELECT id, username, email, role, created_at
10
+ FROM users
11
+ ORDER BY created_at DESC`;
12
+ var FIND_BY_ID = `
13
+ SELECT id, username, email, role, created_at
14
+ FROM users
15
+ WHERE id = ?`;
16
+ var FIND_BY_USERNAME = `
17
+ SELECT *
18
+ FROM users
19
+ WHERE username = ?`;
20
+ var CREATE = `
21
+ INSERT INTO users (username, email, password_hash, role)
22
+ VALUES (?, ?, ?, ?)
23
+ RETURNING id, username, email, role, created_at`;
24
+ var UPDATE_PASSWORD = () => `
25
+ UPDATE users
26
+ SET password_hash = ?, updated_at = NOW()
27
+ WHERE id = ?`;
28
+ var DELETE = `
29
+ DELETE FROM users
30
+ WHERE id = ?`;
31
+
32
+ // src/users.model.ts
33
+ function listUsers() {
34
+ return getPgDb().query(LIST);
35
+ }
36
+ function getUserById(id) {
37
+ return getPgDb().queryOne(FIND_BY_ID, [id]);
38
+ }
39
+ function getUserByUsername(username) {
40
+ return getPgDb().queryOne(FIND_BY_USERNAME, [username]);
41
+ }
42
+ function createUserRow(username, email, hash, role) {
43
+ return getPgDb().queryOne(CREATE, [username, email, hash, role]);
44
+ }
45
+ async function updateUserRow(id, data) {
46
+ const fields = [];
47
+ const values = [];
48
+ if (data.email) {
49
+ fields.push("email = ?");
50
+ values.push(data.email);
51
+ }
52
+ if (data.role) {
53
+ fields.push("role = ?");
54
+ values.push(data.role);
55
+ }
56
+ if (!fields.length) return getUserById(id);
57
+ fields.push("updated_at = NOW()");
58
+ values.push(id);
59
+ return getPgDb().queryOne(
60
+ `UPDATE users SET ${fields.join(", ")} WHERE id = ? RETURNING id, username, email, role, created_at`,
61
+ values
62
+ );
63
+ }
64
+ function deleteUser(id) {
65
+ return getPgDb().run(DELETE, [id]);
66
+ }
67
+ function updatePasswordHash(id, hash) {
68
+ return getPgDb().run(UPDATE_PASSWORD(), [hash, id]);
69
+ }
70
+
71
+ // src/users.service.ts
72
+ function getUserByUsername2(username) {
73
+ return getUserByUsername(username);
74
+ }
75
+ function updateUserPassword(id, hash) {
76
+ return updatePasswordHash(id, hash);
77
+ }
78
+ async function userList(_req, reply) {
79
+ return reply.send(await listUsers());
80
+ }
81
+ async function userGet(req, reply) {
82
+ const { id } = req.body ?? {};
83
+ const user = await getUserById(id);
84
+ if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
85
+ return reply.send(user);
86
+ }
87
+ async function userCreate(req, reply) {
88
+ const body = req.body ?? {};
89
+ const hash = await hashPassword(body.password);
90
+ const user = await createUserRow(body.username, body.email, hash, body.role);
91
+ return reply.code(201).send(user);
92
+ }
93
+ async function userUpdate(req, reply) {
94
+ const { id, ...rest } = req.body ?? {};
95
+ const user = await updateUserRow(id, rest);
96
+ if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
97
+ return reply.send(user);
98
+ }
99
+ async function userDelete(req, reply) {
100
+ const { id } = req.body ?? {};
101
+ await deleteUser(id);
102
+ return reply.code(204).send();
103
+ }
104
+ export {
105
+ getUserByUsername2 as getUserByUsername,
106
+ updateUserPassword,
107
+ userCreate,
108
+ userDelete,
109
+ userGet,
110
+ userList,
111
+ userUpdate
112
+ };
@@ -0,0 +1,15 @@
1
+ export declare function listUsers(): Promise<Record<string, unknown>[]>;
2
+ export declare function getUserById(id: string): Promise<Record<string, unknown> | undefined>;
3
+ export declare function getUserByUsername(username: string): Promise<Record<string, unknown> | undefined>;
4
+ export declare function createUserRow(username: string, email: string, hash: string, role: string): Promise<Record<string, unknown> | undefined>;
5
+ export declare function updateUserRow(id: string, data: {
6
+ email?: string;
7
+ role?: string;
8
+ }): Promise<Record<string, unknown> | undefined>;
9
+ export declare function deleteUser(id: string): Promise<{
10
+ changes: number;
11
+ }>;
12
+ export declare function updatePasswordHash(id: string, hash: string): Promise<{
13
+ changes: number;
14
+ }>;
15
+ //# sourceMappingURL=users.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.model.d.ts","sourceRoot":"","sources":["../src/users.model.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,uCAExB;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,gDAErC;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,gDAEjD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gDAExF;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,gDAkBtF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM;;GAEpC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;GAE1D"}
@@ -0,0 +1,11 @@
1
+ import { type FastifyRequest, type FastifyReply } from "fastify";
2
+ export declare function getUserByUsername(username: string): Promise<Record<string, unknown> | undefined>;
3
+ export declare function updateUserPassword(id: string, hash: string): Promise<{
4
+ changes: number;
5
+ }>;
6
+ export declare function userList(_req: FastifyRequest, reply: FastifyReply): Promise<never>;
7
+ export declare function userGet(req: FastifyRequest, reply: FastifyReply): Promise<never>;
8
+ export declare function userCreate(req: FastifyRequest, reply: FastifyReply): Promise<never>;
9
+ export declare function userUpdate(req: FastifyRequest, reply: FastifyReply): Promise<never>;
10
+ export declare function userDelete(req: FastifyRequest, reply: FastifyReply): Promise<never>;
11
+ //# sourceMappingURL=users.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.service.d.ts","sourceRoot":"","sources":["../src/users.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAYjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,gDAEjD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;GAE1D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAEvE;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKrE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAUxE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKxE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAIxE"}
@@ -0,0 +1,7 @@
1
+ export declare const LIST = "\nSELECT id, username, email, role, created_at\nFROM users\nORDER BY created_at DESC";
2
+ export declare const FIND_BY_ID = "\nSELECT id, username, email, role, created_at\nFROM users\nWHERE id = ?";
3
+ export declare const FIND_BY_USERNAME = "\nSELECT *\nFROM users\nWHERE username = ?";
4
+ export declare const CREATE = "\nINSERT INTO users (username, email, password_hash, role)\nVALUES (?, ?, ?, ?)\nRETURNING id, username, email, role, created_at";
5
+ export declare const UPDATE_PASSWORD: () => string;
6
+ export declare const DELETE = "\nDELETE FROM users\nWHERE id = ?";
7
+ //# sourceMappingURL=users.sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.sql.d.ts","sourceRoot":"","sources":["../src/users.sql.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,yFAGQ,CAAC;AAE1B,eAAO,MAAM,UAAU,6EAGV,CAAC;AAEd,eAAO,MAAM,gBAAgB,+CAGV,CAAC;AAEpB,eAAO,MAAM,MAAM,qIAG6B,CAAC;AAEjD,eAAO,MAAM,eAAe,cAGf,CAAC;AAEd,eAAO,MAAM,MAAM,sCAEN,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@heyhru/business-dms-user",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.2.0",
7
+ "description": "DMS user domain logic: service, model, sql",
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.mjs",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.mjs",
15
+ "require": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsup && tsc --emitDeclarationOnly",
23
+ "dev": "tsup --watch",
24
+ "lint": "eslint src",
25
+ "test": "vitest run",
26
+ "clean": "rm -rf dist"
27
+ },
28
+ "dependencies": {
29
+ "@heyhru/server-plugin-pg": "0.2.0",
30
+ "@heyhru/server-util-crypto": "0.2.0",
31
+ "fastify": "^5.8.4"
32
+ },
33
+ "devDependencies": {
34
+ "tsup": "^8.5.1",
35
+ "typescript": "^6.0.2",
36
+ "vitest": "^4.1.2"
37
+ },
38
+ "gitHead": "52867b97f908359000f3b690daf2229921dcfd9a"
39
+ }