@helpio/common 1.0.5 → 1.0.7
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/build/events/publishers/worker-profile-updated-publisher.d.ts +2 -0
- package/build/events/publishers/worker-profile-updated-publisher.js +17 -0
- package/build/events/types/index.d.ts +3 -0
- package/build/events/types/index.js +1 -0
- package/build/events/types/worker-profile-events.d.ts +36 -0
- package/build/events/types/worker-profile-events.js +2 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +3 -0
- package/build/middlewares/require-role.d.ts +6 -0
- package/build/middlewares/require-role.js +44 -0
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.publishWorkerProfileUpdated = void 0;
|
|
13
|
+
const producer_1 = require("../producer");
|
|
14
|
+
const publishWorkerProfileUpdated = (data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
yield (0, producer_1.publishEvent)("worker.profile.updated", data);
|
|
16
|
+
});
|
|
17
|
+
exports.publishWorkerProfileUpdated = publishWorkerProfileUpdated;
|
|
@@ -2,6 +2,7 @@ import { UserCreatedEvent, UserUpdatedEvent } from "./user-events";
|
|
|
2
2
|
import { CountryCreatedEvent, CountryStatusChangedEvent, CountryUpdatedEvent } from "./country-events";
|
|
3
3
|
import { CityCreatedEvent, CityStatusChangedEvent, CityUpdatedEvent } from "./city-events";
|
|
4
4
|
import { KycDocumentDeletedEvent, KycDocumentRejectedEvent, KycDocumentUploadedEvent, KycDocumentVerifiedEvent } from "./kyc-document-events";
|
|
5
|
+
import { WorkerProfileUpdatedEvent } from "./worker-profile-events";
|
|
5
6
|
export interface EventMap {
|
|
6
7
|
"user.created": UserCreatedEvent;
|
|
7
8
|
"user.updated": UserUpdatedEvent;
|
|
@@ -15,8 +16,10 @@ export interface EventMap {
|
|
|
15
16
|
"kyc.document.verified": KycDocumentVerifiedEvent;
|
|
16
17
|
"kyc.document.rejected": KycDocumentRejectedEvent;
|
|
17
18
|
"kyc.document.deleted": KycDocumentDeletedEvent;
|
|
19
|
+
"worker.profile.updated": WorkerProfileUpdatedEvent;
|
|
18
20
|
}
|
|
19
21
|
export * from "./user-events";
|
|
20
22
|
export * from "./country-events";
|
|
21
23
|
export * from "./city-events";
|
|
22
24
|
export * from "./kyc-document-events";
|
|
25
|
+
export * from "./worker-profile-events";
|
|
@@ -15,3 +15,4 @@ __exportStar(require("./user-events"), exports);
|
|
|
15
15
|
__exportStar(require("./country-events"), exports);
|
|
16
16
|
__exportStar(require("./city-events"), exports);
|
|
17
17
|
__exportStar(require("./kyc-document-events"), exports);
|
|
18
|
+
__exportStar(require("./worker-profile-events"), exports);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare type WorkerProfileUpdatedEvent = {
|
|
2
|
+
workerId: string;
|
|
3
|
+
firstName?: string;
|
|
4
|
+
lastName?: string;
|
|
5
|
+
bio?: string;
|
|
6
|
+
avatarUrl?: string;
|
|
7
|
+
photoUrls?: string[];
|
|
8
|
+
countryCode?: string;
|
|
9
|
+
city?: string;
|
|
10
|
+
area?: string;
|
|
11
|
+
geo?: {
|
|
12
|
+
lat: number;
|
|
13
|
+
lng: number;
|
|
14
|
+
};
|
|
15
|
+
languages?: string[];
|
|
16
|
+
preferredCityIds?: string[];
|
|
17
|
+
workerCategories?: string[];
|
|
18
|
+
servicesOffered?: string[];
|
|
19
|
+
skillsByCategory?: Record<string, string[]>;
|
|
20
|
+
workArrangementPreference?: string;
|
|
21
|
+
yearsExperience?: number;
|
|
22
|
+
minimumRate?: number;
|
|
23
|
+
currency?: string;
|
|
24
|
+
isAvailable?: boolean;
|
|
25
|
+
isProfileComplete?: boolean;
|
|
26
|
+
kycStatus?: string;
|
|
27
|
+
verificationLevel?: string;
|
|
28
|
+
trustScore?: number;
|
|
29
|
+
kycPendingCount?: number;
|
|
30
|
+
kycVerifiedCount?: number;
|
|
31
|
+
kycRejectedCount?: number;
|
|
32
|
+
rating?: number;
|
|
33
|
+
ratingCount?: number;
|
|
34
|
+
rankScore?: number;
|
|
35
|
+
updatedAt?: string | Date;
|
|
36
|
+
};
|
package/build/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from "./types/auth";
|
|
|
8
8
|
export * from "./middlewares/current-user";
|
|
9
9
|
export * from "./middlewares/error-handler";
|
|
10
10
|
export * from "./middlewares/require-auth";
|
|
11
|
+
export * from "./middlewares/require-role";
|
|
11
12
|
export * from "./middlewares/validate-request";
|
|
12
13
|
export * from "./events/consumer";
|
|
13
14
|
export * from "./events/producer";
|
|
@@ -21,3 +22,4 @@ export * from "./events/publishers/user-updated-publisher";
|
|
|
21
22
|
export * from "./events/publishers/country-created-publisher";
|
|
22
23
|
export * from "./events/publishers/country-updated-publisher";
|
|
23
24
|
export * from "./events/publishers/country-status-changed-publisher";
|
|
25
|
+
export * from "./events/publishers/worker-profile-updated-publisher";
|
package/build/index.js
CHANGED
|
@@ -21,6 +21,7 @@ __exportStar(require("./types/auth"), exports);
|
|
|
21
21
|
__exportStar(require("./middlewares/current-user"), exports);
|
|
22
22
|
__exportStar(require("./middlewares/error-handler"), exports);
|
|
23
23
|
__exportStar(require("./middlewares/require-auth"), exports);
|
|
24
|
+
__exportStar(require("./middlewares/require-role"), exports);
|
|
24
25
|
__exportStar(require("./middlewares/validate-request"), exports);
|
|
25
26
|
__exportStar(require("./events/consumer"), exports);
|
|
26
27
|
__exportStar(require("./events/producer"), exports);
|
|
@@ -36,3 +37,5 @@ __exportStar(require("./events/publishers/user-updated-publisher"), exports);
|
|
|
36
37
|
__exportStar(require("./events/publishers/country-created-publisher"), exports);
|
|
37
38
|
__exportStar(require("./events/publishers/country-updated-publisher"), exports);
|
|
38
39
|
__exportStar(require("./events/publishers/country-status-changed-publisher"), exports);
|
|
40
|
+
// Profile event publishers
|
|
41
|
+
__exportStar(require("./events/publishers/worker-profile-updated-publisher"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from "express";
|
|
2
|
+
export declare const requireAnyRole: (allowedRoles: string[]) => (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
|
3
|
+
export declare const requireWorker: (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
|
4
|
+
export declare const requireEmployer: (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
|
5
|
+
export declare const requireOwner: (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
|
6
|
+
export declare const requireEmployerOrOwner: (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireEmployerOrOwner = exports.requireOwner = exports.requireEmployer = exports.requireWorker = exports.requireAnyRole = void 0;
|
|
4
|
+
const normalizeRole = (value) => {
|
|
5
|
+
if (typeof value !== "string")
|
|
6
|
+
return undefined;
|
|
7
|
+
const trimmed = value.trim();
|
|
8
|
+
return trimmed ? trimmed.toLowerCase() : undefined;
|
|
9
|
+
};
|
|
10
|
+
const getRoleCandidates = (req) => {
|
|
11
|
+
const currentUser = req.currentUser;
|
|
12
|
+
if (!currentUser)
|
|
13
|
+
return [];
|
|
14
|
+
const directRole = normalizeRole(currentUser.role);
|
|
15
|
+
const rolesArray = Array.isArray(currentUser.roles)
|
|
16
|
+
? currentUser.roles.map(normalizeRole).filter(Boolean)
|
|
17
|
+
: [];
|
|
18
|
+
const activeMode = normalizeRole(currentUser.activeMode);
|
|
19
|
+
return [directRole, activeMode, ...rolesArray].filter(Boolean);
|
|
20
|
+
};
|
|
21
|
+
const requireAnyRole = (allowedRoles) => {
|
|
22
|
+
const allowed = allowedRoles.map((r) => r.toLowerCase());
|
|
23
|
+
return (req, res, next) => {
|
|
24
|
+
const candidates = getRoleCandidates(req);
|
|
25
|
+
if (candidates.some((r) => allowed.includes(r))) {
|
|
26
|
+
return next();
|
|
27
|
+
}
|
|
28
|
+
return res.status(403).send({
|
|
29
|
+
error: "FORBIDDEN",
|
|
30
|
+
message: `Required role: ${allowedRoles.join(" | ")}`,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
exports.requireAnyRole = requireAnyRole;
|
|
35
|
+
exports.requireWorker = (0, exports.requireAnyRole)(["worker"]);
|
|
36
|
+
exports.requireEmployer = (0, exports.requireAnyRole)(["employer"]);
|
|
37
|
+
// Owner/admin access varies across deployments, so we accept a few common values.
|
|
38
|
+
exports.requireOwner = (0, exports.requireAnyRole)(["owner", "admin", "super_admin"]);
|
|
39
|
+
exports.requireEmployerOrOwner = (0, exports.requireAnyRole)([
|
|
40
|
+
"employer",
|
|
41
|
+
"owner",
|
|
42
|
+
"admin",
|
|
43
|
+
"super_admin",
|
|
44
|
+
]);
|