@udhuong/admin-core 0.1.2 → 0.1.4
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/server/auth/infrastructure/services/root-account.service.d.ts +1 -0
- package/dist/server/auth/infrastructure/services/root-account.service.d.ts.map +1 -1
- package/dist/server/auth/infrastructure/services/root-account.service.js +31 -24
- package/dist/server/auth/infrastructure/services/root-account.service.js.map +1 -1
- package/package.json +1 -1
- package/src/client/styles/globals.css +2 -1
|
@@ -15,5 +15,6 @@ export declare class RootAccountService implements OnModuleInit {
|
|
|
15
15
|
constructor(authUserService: AuthUserService, coreOptions: AdminCoreOptions, authUserRepo: Repository<AuthUserEntity>, roleRepo: Repository<RoleEntity>, userRoleRepo: Repository<UserRoleEntity>);
|
|
16
16
|
onModuleInit(): Promise<void>;
|
|
17
17
|
private seedRootAccount;
|
|
18
|
+
private ensureSuperAdminRole;
|
|
18
19
|
}
|
|
19
20
|
//# sourceMappingURL=root-account.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-account.service.d.ts","sourceRoot":"","sources":["../../../../../src/server/auth/infrastructure/services/root-account.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAU,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAsB,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ7F,qBACa,kBAAmB,YAAW,YAAY;IAInD,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAX/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAG3C,eAAe,EAAE,eAAe,EAEhC,WAAW,EAAE,gBAAgB,EAE7B,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,EAExC,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAEhC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC;IAGrD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAIrB,eAAe;
|
|
1
|
+
{"version":3,"file":"root-account.service.d.ts","sourceRoot":"","sources":["../../../../../src/server/auth/infrastructure/services/root-account.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAU,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAsB,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ7F,qBACa,kBAAmB,YAAW,YAAY;IAInD,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAX/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAG3C,eAAe,EAAE,eAAe,EAEhC,WAAW,EAAE,gBAAgB,EAE7B,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,EAExC,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAEhC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC;IAGrD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAIrB,eAAe;YA0Cf,oBAAoB;CAenC"}
|
|
@@ -45,36 +45,43 @@ let RootAccountService = RootAccountService_1 = class RootAccountService {
|
|
|
45
45
|
const existing = await this.authUserRepo.findOne({
|
|
46
46
|
where: { email: rootEmail },
|
|
47
47
|
});
|
|
48
|
+
let rootUserId;
|
|
48
49
|
if (existing) {
|
|
49
50
|
this.logger.log(`Root account already exists: ${rootEmail}`);
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
const rootPassword = this.coreOptions.rootPassword ?? process.env.ROOT_PASSWORD;
|
|
53
|
-
if (!rootPassword || rootPassword.length < 12) {
|
|
54
|
-
throw new Error(`[RootAccountService] Thiếu hoặc quá ngắn (<12 ký tự) rootPassword. ` +
|
|
55
|
-
`Cung cấp qua AdminCoreOptions.rootPassword hoặc env var ROOT_PASSWORD. ` +
|
|
56
|
-
`Gợi ý: dùng mật khẩu strong (ví dụ \`openssl rand -base64 24\`).`);
|
|
51
|
+
rootUserId = existing.id;
|
|
57
52
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
userId: rootUser.id,
|
|
71
|
-
roleId: superAdminRole.id,
|
|
53
|
+
else {
|
|
54
|
+
const rootPassword = this.coreOptions.rootPassword ?? process.env.ROOT_PASSWORD;
|
|
55
|
+
if (!rootPassword || rootPassword.length < 12) {
|
|
56
|
+
throw new Error(`[RootAccountService] Thiếu hoặc quá ngắn (<12 ký tự) rootPassword. ` +
|
|
57
|
+
`Cung cấp qua AdminCoreOptions.rootPassword hoặc env var ROOT_PASSWORD. ` +
|
|
58
|
+
`Gợi ý: dùng mật khẩu strong (ví dụ \`openssl rand -base64 24\`).`);
|
|
59
|
+
}
|
|
60
|
+
const rootUser = await this.authUserService.create({
|
|
61
|
+
email: rootEmail,
|
|
62
|
+
password: rootPassword,
|
|
63
|
+
displayName: 'Root',
|
|
64
|
+
username: 'root',
|
|
72
65
|
});
|
|
73
|
-
this.
|
|
66
|
+
await this.authUserService.verifyEmail(rootUser.id);
|
|
67
|
+
rootUserId = rootUser.id;
|
|
68
|
+
this.logger.log(`Root account created: ${rootEmail}`);
|
|
74
69
|
}
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
await this.ensureSuperAdminRole(rootUserId, rootEmail);
|
|
71
|
+
}
|
|
72
|
+
async ensureSuperAdminRole(userId, email) {
|
|
73
|
+
const superAdminRole = await this.roleRepo.findOne({ where: { name: ROOT_ROLE } });
|
|
74
|
+
if (!superAdminRole) {
|
|
75
|
+
this.logger.warn(`Role "${ROOT_ROLE}" not found. Root account may lack permissions.`);
|
|
76
|
+
return;
|
|
77
77
|
}
|
|
78
|
+
const existing = await this.userRoleRepo.findOne({
|
|
79
|
+
where: { userId, roleId: superAdminRole.id },
|
|
80
|
+
});
|
|
81
|
+
if (existing)
|
|
82
|
+
return;
|
|
83
|
+
await this.userRoleRepo.save({ userId, roleId: superAdminRole.id });
|
|
84
|
+
this.logger.log(`Assigned role "${ROOT_ROLE}" to root account: ${email}`);
|
|
78
85
|
}
|
|
79
86
|
};
|
|
80
87
|
exports.RootAccountService = RootAccountService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-account.service.js","sourceRoot":"","sources":["../../../../../src/server/auth/infrastructure/services/root-account.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA0E;AAC1E,6CAAmD;AACnD,qCAAqC;AACrC,oFAA+E;AAC/E,sDAAyD;AACzD,sDAAqD;AACrD,sDAAyD;AACzD,wFAA6F;AAE7F,MAAM,SAAS,GAAG,aAAa,CAAC;AAOzB,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAIV;IAEA;IAEA;IAEA;IAEA;IAXF,MAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;IAE9D,YACmB,eAAgC,EAEhC,WAA6B,EAE7B,YAAwC,EAExC,QAAgC,EAEhC,YAAwC;QARxC,oBAAe,GAAf,eAAe,CAAiB;QAEhC,gBAAW,GAAX,WAAW,CAAkB;QAE7B,iBAAY,GAAZ,YAAY,CAA4B;QAExC,aAAQ,GAAR,QAAQ,CAAwB;QAEhC,iBAAY,GAAZ,YAAY,CAA4B;IACxD,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QAG7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC/C,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SAC5B,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;YAC7D,
|
|
1
|
+
{"version":3,"file":"root-account.service.js","sourceRoot":"","sources":["../../../../../src/server/auth/infrastructure/services/root-account.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@udhuong/admin-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Reusable admin core (client + server) — auth, RBAC, OAuth, user management. Built với NestJS + Next.js, ship trong 1 package với subpath exports.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "udhuong <l19htm4n@gmail.com>",
|