@rapidrest/auth 1.0.0-beta.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/LICENSE +21 -0
- package/README.md +75 -0
- package/dist/lib/auth/BasicStrategy.js +82 -0
- package/dist/lib/auth/BasicStrategy.js.map +1 -0
- package/dist/lib/auth/FIDO2Strategy.js +179 -0
- package/dist/lib/auth/FIDO2Strategy.js.map +1 -0
- package/dist/lib/auth/MFAStrategy.js +219 -0
- package/dist/lib/auth/MFAStrategy.js.map +1 -0
- package/dist/lib/auth/OIDCStrategy.js +397 -0
- package/dist/lib/auth/OIDCStrategy.js.map +1 -0
- package/dist/lib/auth/OTPStrategy.js +143 -0
- package/dist/lib/auth/OTPStrategy.js.map +1 -0
- package/dist/lib/auth/PasskeyStrategy.js +185 -0
- package/dist/lib/auth/PasskeyStrategy.js.map +1 -0
- package/dist/lib/auth/TOTPStrategy.js +84 -0
- package/dist/lib/auth/TOTPStrategy.js.map +1 -0
- package/dist/lib/auth/index.js +10 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/auth/shared.js +431 -0
- package/dist/lib/auth/shared.js.map +1 -0
- package/dist/lib/auth/types.js +12 -0
- package/dist/lib/auth/types.js.map +1 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/models/index.js +2 -0
- package/dist/lib/models/index.js.map +1 -0
- package/dist/lib/models/mongo/AliasMongo.js +77 -0
- package/dist/lib/models/mongo/AliasMongo.js.map +1 -0
- package/dist/lib/models/mongo/ProfileMongo.js +99 -0
- package/dist/lib/models/mongo/ProfileMongo.js.map +1 -0
- package/dist/lib/models/mongo/SecretMongo.js +71 -0
- package/dist/lib/models/mongo/SecretMongo.js.map +1 -0
- package/dist/lib/models/mongo/UserMongo.js +71 -0
- package/dist/lib/models/mongo/UserMongo.js.map +1 -0
- package/dist/lib/models/mongo/index.js +5 -0
- package/dist/lib/models/mongo/index.js.map +1 -0
- package/dist/lib/models/mongo.js +2 -0
- package/dist/lib/models/mongo.js.map +1 -0
- package/dist/lib/models/sql/AliasSQL.js +77 -0
- package/dist/lib/models/sql/AliasSQL.js.map +1 -0
- package/dist/lib/models/sql/ProfileSQL.js +99 -0
- package/dist/lib/models/sql/ProfileSQL.js.map +1 -0
- package/dist/lib/models/sql/SecretSQL.js +71 -0
- package/dist/lib/models/sql/SecretSQL.js.map +1 -0
- package/dist/lib/models/sql/UserSQL.js +68 -0
- package/dist/lib/models/sql/UserSQL.js.map +1 -0
- package/dist/lib/models/sql/index.js +5 -0
- package/dist/lib/models/sql/index.js.map +1 -0
- package/dist/lib/models/sql.js +2 -0
- package/dist/lib/models/sql.js.map +1 -0
- package/dist/lib/models/types.js +35 -0
- package/dist/lib/models/types.js.map +1 -0
- package/dist/lib/mongo.js +3 -0
- package/dist/lib/mongo.js.map +1 -0
- package/dist/lib/routes/BaseAliasRoute.js +10 -0
- package/dist/lib/routes/BaseAliasRoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthBasicRoute.js +132 -0
- package/dist/lib/routes/BaseAuthBasicRoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthFIDO2Route.js +191 -0
- package/dist/lib/routes/BaseAuthFIDO2Route.js.map +1 -0
- package/dist/lib/routes/BaseAuthMFARoute.js +310 -0
- package/dist/lib/routes/BaseAuthMFARoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthOIDCRoute.js +231 -0
- package/dist/lib/routes/BaseAuthOIDCRoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthOTPRoute.js +214 -0
- package/dist/lib/routes/BaseAuthOTPRoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthPasskeyRoute.js +182 -0
- package/dist/lib/routes/BaseAuthPasskeyRoute.js.map +1 -0
- package/dist/lib/routes/BaseAuthTOTPRoute.js +133 -0
- package/dist/lib/routes/BaseAuthTOTPRoute.js.map +1 -0
- package/dist/lib/routes/BaseProfileRoute.js +10 -0
- package/dist/lib/routes/BaseProfileRoute.js.map +1 -0
- package/dist/lib/routes/BaseSecretRoute.js +399 -0
- package/dist/lib/routes/BaseSecretRoute.js.map +1 -0
- package/dist/lib/routes/BaseUserRoute.js +10 -0
- package/dist/lib/routes/BaseUserRoute.js.map +1 -0
- package/dist/lib/routes/UserUtils.js +78 -0
- package/dist/lib/routes/UserUtils.js.map +1 -0
- package/dist/lib/routes/index.js +13 -0
- package/dist/lib/routes/index.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAliasRouteMongo.js +20 -0
- package/dist/lib/routes/mongo/BaseAliasRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthBasicRouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthBasicRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthFIDO2RouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthFIDO2RouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthMFARouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthMFARouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthOIDCRouteMongo.js +11 -0
- package/dist/lib/routes/mongo/BaseAuthOIDCRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthOTPRouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthOTPRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthPasskeyRouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthPasskeyRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseAuthTOTPRouteMongo.js +14 -0
- package/dist/lib/routes/mongo/BaseAuthTOTPRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseProfileRouteMongo.js +20 -0
- package/dist/lib/routes/mongo/BaseProfileRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseSecretRouteMongo.js +20 -0
- package/dist/lib/routes/mongo/BaseSecretRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/BaseUserRouteMongo.js +20 -0
- package/dist/lib/routes/mongo/BaseUserRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/index.js +12 -0
- package/dist/lib/routes/mongo/index.js.map +1 -0
- package/dist/lib/routes/mongo.js +2 -0
- package/dist/lib/routes/mongo.js.map +1 -0
- package/dist/lib/routes/sql/BaseAliasRouteSQL.js +20 -0
- package/dist/lib/routes/sql/BaseAliasRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthBasicRouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthBasicRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthFIDO2RouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthFIDO2RouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthMFARouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthMFARouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthOIDCRouteSQL.js +11 -0
- package/dist/lib/routes/sql/BaseAuthOIDCRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthOTPRouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthOTPRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthPasskeyRouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthPasskeyRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseAuthTOTPRouteSQL.js +14 -0
- package/dist/lib/routes/sql/BaseAuthTOTPRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseProfileRouteSQL.js +20 -0
- package/dist/lib/routes/sql/BaseProfileRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseSecretRouteSQL.js +20 -0
- package/dist/lib/routes/sql/BaseSecretRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/BaseUserRouteSQL.js +20 -0
- package/dist/lib/routes/sql/BaseUserRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/index.js +12 -0
- package/dist/lib/routes/sql/index.js.map +1 -0
- package/dist/lib/routes/sql.js +2 -0
- package/dist/lib/routes/sql.js.map +1 -0
- package/dist/lib/sql.js +3 -0
- package/dist/lib/sql.js.map +1 -0
- package/dist/types/auth/BasicStrategy.d.ts +39 -0
- package/dist/types/auth/FIDO2Strategy.d.ts +85 -0
- package/dist/types/auth/MFAStrategy.d.ts +110 -0
- package/dist/types/auth/OIDCStrategy.d.ts +188 -0
- package/dist/types/auth/OTPStrategy.d.ts +88 -0
- package/dist/types/auth/PasskeyStrategy.d.ts +81 -0
- package/dist/types/auth/TOTPStrategy.d.ts +49 -0
- package/dist/types/auth/index.d.ts +9 -0
- package/dist/types/auth/shared.d.ts +136 -0
- package/dist/types/auth/types.d.ts +127 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/models/index.d.ts +1 -0
- package/dist/types/models/mongo/AliasMongo.d.ts +15 -0
- package/dist/types/models/mongo/ProfileMongo.d.ts +17 -0
- package/dist/types/models/mongo/SecretMongo.d.ts +14 -0
- package/dist/types/models/mongo/UserMongo.d.ts +14 -0
- package/dist/types/models/mongo/index.d.ts +4 -0
- package/dist/types/models/mongo.d.ts +1 -0
- package/dist/types/models/sql/AliasSQL.d.ts +15 -0
- package/dist/types/models/sql/ProfileSQL.d.ts +17 -0
- package/dist/types/models/sql/SecretSQL.d.ts +14 -0
- package/dist/types/models/sql/UserSQL.d.ts +14 -0
- package/dist/types/models/sql/index.d.ts +4 -0
- package/dist/types/models/sql.d.ts +1 -0
- package/dist/types/models/types.d.ts +136 -0
- package/dist/types/mongo.d.ts +2 -0
- package/dist/types/routes/BaseAliasRoute.d.ts +7 -0
- package/dist/types/routes/BaseAuthBasicRoute.d.ts +27 -0
- package/dist/types/routes/BaseAuthFIDO2Route.d.ts +50 -0
- package/dist/types/routes/BaseAuthMFARoute.d.ts +61 -0
- package/dist/types/routes/BaseAuthOIDCRoute.d.ts +33 -0
- package/dist/types/routes/BaseAuthOTPRoute.d.ts +53 -0
- package/dist/types/routes/BaseAuthPasskeyRoute.d.ts +41 -0
- package/dist/types/routes/BaseAuthTOTPRoute.d.ts +38 -0
- package/dist/types/routes/BaseProfileRoute.d.ts +7 -0
- package/dist/types/routes/BaseSecretRoute.d.ts +89 -0
- package/dist/types/routes/BaseUserRoute.d.ts +7 -0
- package/dist/types/routes/UserUtils.d.ts +21 -0
- package/dist/types/routes/index.d.ts +12 -0
- package/dist/types/routes/mongo/BaseAliasRouteMongo.d.ts +4 -0
- package/dist/types/routes/mongo/BaseAuthBasicRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthFIDO2RouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthMFARouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthOIDCRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthOTPRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthPasskeyRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseAuthTOTPRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/BaseProfileRouteMongo.d.ts +4 -0
- package/dist/types/routes/mongo/BaseSecretRouteMongo.d.ts +4 -0
- package/dist/types/routes/mongo/BaseUserRouteMongo.d.ts +4 -0
- package/dist/types/routes/mongo/index.d.ts +11 -0
- package/dist/types/routes/mongo.d.ts +1 -0
- package/dist/types/routes/sql/BaseAliasRouteSQL.d.ts +4 -0
- package/dist/types/routes/sql/BaseAuthBasicRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthFIDO2RouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthMFARouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthOIDCRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthOTPRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthPasskeyRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseAuthTOTPRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/BaseProfileRouteSQL.d.ts +4 -0
- package/dist/types/routes/sql/BaseSecretRouteSQL.d.ts +4 -0
- package/dist/types/routes/sql/BaseUserRouteSQL.d.ts +4 -0
- package/dist/types/routes/sql/index.d.ts +11 -0
- package/dist/types/routes/sql.d.ts +1 -0
- package/dist/types/sql.d.ts +2 -0
- package/package.json +138 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
15
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
+
import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
|
|
17
|
+
import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
|
|
18
|
+
import { AliasType, AuthResult } from "../models/types.js";
|
|
19
|
+
import { OTPStrategy, OTPStrategyOptions } from "../auth/OTPStrategy.js";
|
|
20
|
+
import { OTPContactType } from "../auth/types.js";
|
|
21
|
+
import { UserUtils } from "./UserUtils.js";
|
|
22
|
+
const { Config, Init, Inject } = ObjectDecorators;
|
|
23
|
+
const { Summary, Description, Returns } = DocDecorators;
|
|
24
|
+
const { Auth, Get, Post } = RouteDecorators;
|
|
25
|
+
const AuthUser = RouteDecorators.User;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
*
|
|
29
|
+
* @author Jean-Philippe Steinmetz
|
|
30
|
+
*/
|
|
31
|
+
export class BaseAuthOTPRoute {
|
|
32
|
+
constructor() {
|
|
33
|
+
/** The name of the messaging template to use for sending notifications. */
|
|
34
|
+
this.template = "login-otp";
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Called on server startup to initialize the route with any defaults.
|
|
38
|
+
*/
|
|
39
|
+
async initialize() {
|
|
40
|
+
if (!this.authMiddleware) {
|
|
41
|
+
throw new Error("authMiddleware is not set.");
|
|
42
|
+
}
|
|
43
|
+
if (!this.objectFactory) {
|
|
44
|
+
throw new Error("objectFactory is not set.");
|
|
45
|
+
}
|
|
46
|
+
if (!this.aliasRepo && this.aliasClass) {
|
|
47
|
+
this.aliasRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
48
|
+
name: this.aliasClass.name,
|
|
49
|
+
args: [this.aliasClass],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (!this.secretRepo && this.secretClass) {
|
|
53
|
+
this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
54
|
+
name: this.secretClass.name,
|
|
55
|
+
args: [this.secretClass],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!this.userRepo && this.userClass) {
|
|
59
|
+
this.userRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
60
|
+
name: this.userClass.name,
|
|
61
|
+
args: [this.userClass],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (!this.userUtils && this.userClass && this.aliasClass) {
|
|
65
|
+
this.userUtils = await this.objectFactory.newInstance(UserUtils, {
|
|
66
|
+
name: "default",
|
|
67
|
+
args: [this.userClass, this.aliasClass],
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const options = new OTPStrategyOptions();
|
|
71
|
+
options.getContact = this.getContact.bind(this);
|
|
72
|
+
options.getContacts = this.getContacts.bind(this);
|
|
73
|
+
options.getUser = this.getUser.bind(this);
|
|
74
|
+
options.notifyContact = this.notifyContact.bind(this);
|
|
75
|
+
const strategy = await this.objectFactory.newInstance(OTPStrategy, {
|
|
76
|
+
name: "default",
|
|
77
|
+
args: [options],
|
|
78
|
+
});
|
|
79
|
+
this.authMiddleware.register(strategy.name, strategy);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Authenticates the user using OTP and returns a JSON Web Token access token to be used with future API requests.
|
|
83
|
+
*/
|
|
84
|
+
async authenticate(user) {
|
|
85
|
+
const token = await JWTUtils.createToken(this.jwtConfig, user);
|
|
86
|
+
return new AuthResult({
|
|
87
|
+
token,
|
|
88
|
+
user,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
convertAliasType(type) {
|
|
92
|
+
switch (type) {
|
|
93
|
+
case AliasType.EMAIL:
|
|
94
|
+
return OTPContactType.EMAIL;
|
|
95
|
+
case AliasType.PHONE:
|
|
96
|
+
return OTPContactType.SMS;
|
|
97
|
+
default:
|
|
98
|
+
throw new Error("Unsupported type: " + type);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Retrieves the alias with the given unique id.
|
|
103
|
+
* @param id The unique id of the alias to retrieve.
|
|
104
|
+
* @returns The alias if found, otherwise `undefined`.
|
|
105
|
+
*/
|
|
106
|
+
async getContact(id) {
|
|
107
|
+
if (!this.aliasRepo) {
|
|
108
|
+
throw new Error("aliasRepo is not set.");
|
|
109
|
+
}
|
|
110
|
+
const alias = await this.aliasRepo.findOne(id, { ignoreACL: true });
|
|
111
|
+
return alias
|
|
112
|
+
? {
|
|
113
|
+
contact: alias.alias,
|
|
114
|
+
type: this.convertAliasType(alias.type),
|
|
115
|
+
verified: alias.verified,
|
|
116
|
+
}
|
|
117
|
+
: undefined;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Retrieves all aliases for the user with the given id.
|
|
121
|
+
*
|
|
122
|
+
* @param id The unique id of the user to lookup.
|
|
123
|
+
*/
|
|
124
|
+
async getContacts(id) {
|
|
125
|
+
if (!this.aliasRepo) {
|
|
126
|
+
throw new Error("aliasRepo is not set.");
|
|
127
|
+
}
|
|
128
|
+
if (!this.userRepo) {
|
|
129
|
+
throw new Error("userRepo is not set.");
|
|
130
|
+
}
|
|
131
|
+
// The provided id may be the user's uid or an alias itself. First attempt to retrieve a user
|
|
132
|
+
// and if found use that id. Otherwise, try looking up the alias itself. Once at least one alias
|
|
133
|
+
// is found we can use it to look-up all others for a given userUid.
|
|
134
|
+
let user = await this.userRepo.findOne(id, { ignoreACL: true });
|
|
135
|
+
let aliases = await this.aliasRepo.find(user ? { userUid: user.uid } : { alias: id }, {
|
|
136
|
+
ignoreACL: true,
|
|
137
|
+
});
|
|
138
|
+
if (!user && aliases.length > 0) {
|
|
139
|
+
aliases = await this.aliasRepo.find({ userUid: aliases[0].userUid }, { ignoreACL: true });
|
|
140
|
+
user = aliases.length > 0 ? await this.userRepo.findOne(aliases[0].userUid) : undefined;
|
|
141
|
+
}
|
|
142
|
+
// Filter aliases to only those that can be notified
|
|
143
|
+
aliases.filter((alias) => [AliasType.EMAIL, AliasType.PHONE].includes(alias.type));
|
|
144
|
+
const results = [];
|
|
145
|
+
for (const alias of aliases) {
|
|
146
|
+
results.push({
|
|
147
|
+
contact: alias.alias,
|
|
148
|
+
type: this.convertAliasType(alias.type),
|
|
149
|
+
verified: alias.verified,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Retrieves the user with the given unique id.
|
|
156
|
+
* @param uid The unique id of the user to retrieve.
|
|
157
|
+
* @returns The user if found, otherwise `undefined`.
|
|
158
|
+
*/
|
|
159
|
+
async getUser(uid) {
|
|
160
|
+
if (!this.userUtils) {
|
|
161
|
+
throw new Error("userUtils is not set.");
|
|
162
|
+
}
|
|
163
|
+
return this.userUtils.lookup(uid);
|
|
164
|
+
}
|
|
165
|
+
async notifyContact(contact, totp) {
|
|
166
|
+
switch (contact.type) {
|
|
167
|
+
case OTPContactType.EMAIL:
|
|
168
|
+
void this.messagingUtils?.sendEmail(this.template, { totp }, {
|
|
169
|
+
to: contact.contact,
|
|
170
|
+
});
|
|
171
|
+
break;
|
|
172
|
+
case OTPContactType.SMS:
|
|
173
|
+
void this.messagingUtils?.sendSMS(this.template, { totp }, {
|
|
174
|
+
to: contact.contact,
|
|
175
|
+
});
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
__decorate([
|
|
181
|
+
Inject(AuthMiddleware),
|
|
182
|
+
__metadata("design:type", AuthMiddleware)
|
|
183
|
+
], BaseAuthOTPRoute.prototype, "authMiddleware", void 0);
|
|
184
|
+
__decorate([
|
|
185
|
+
Config("auth"),
|
|
186
|
+
__metadata("design:type", Object)
|
|
187
|
+
], BaseAuthOTPRoute.prototype, "jwtConfig", void 0);
|
|
188
|
+
__decorate([
|
|
189
|
+
Inject(ObjectFactory),
|
|
190
|
+
__metadata("design:type", ObjectFactory)
|
|
191
|
+
], BaseAuthOTPRoute.prototype, "objectFactory", void 0);
|
|
192
|
+
__decorate([
|
|
193
|
+
Inject(MessagingUtils),
|
|
194
|
+
__metadata("design:type", MessagingUtils)
|
|
195
|
+
], BaseAuthOTPRoute.prototype, "messagingUtils", void 0);
|
|
196
|
+
__decorate([
|
|
197
|
+
Init,
|
|
198
|
+
__metadata("design:type", Function),
|
|
199
|
+
__metadata("design:paramtypes", []),
|
|
200
|
+
__metadata("design:returntype", Promise)
|
|
201
|
+
], BaseAuthOTPRoute.prototype, "initialize", null);
|
|
202
|
+
__decorate([
|
|
203
|
+
Summary("Authenticate OTP"),
|
|
204
|
+
Description("Authenticates the user using TOTP and returns a JSON Web Token access token to be used with future API requests."),
|
|
205
|
+
Returns([AuthResult, undefined]),
|
|
206
|
+
Auth(["otp"]),
|
|
207
|
+
Get(),
|
|
208
|
+
Post(),
|
|
209
|
+
__param(0, AuthUser),
|
|
210
|
+
__metadata("design:type", Function),
|
|
211
|
+
__metadata("design:paramtypes", [Object]),
|
|
212
|
+
__metadata("design:returntype", Promise)
|
|
213
|
+
], BaseAuthOTPRoute.prototype, "authenticate", null);
|
|
214
|
+
//# sourceMappingURL=BaseAuthOTPRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseAuthOTPRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthOTPRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
15
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
+
import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
|
|
17
|
+
import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
|
|
18
|
+
import { AuthResult, SecretType } from "../models/types.js";
|
|
19
|
+
import { PasskeyStrategy, PasskeyStrategyOptions } from "../auth/PasskeyStrategy.js";
|
|
20
|
+
import { UserUtils } from "./UserUtils.js";
|
|
21
|
+
const { Config, Init, Inject } = ObjectDecorators;
|
|
22
|
+
const { Summary, Description, Returns } = DocDecorators;
|
|
23
|
+
const { Auth, Get, Post } = RouteDecorators;
|
|
24
|
+
const AuthUser = RouteDecorators.User;
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
*
|
|
28
|
+
* @author Jean-Philippe Steinmetz
|
|
29
|
+
*/
|
|
30
|
+
export class BaseAuthPasskeyRoute {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.passkeyConfig = {
|
|
33
|
+
rpName: "rapidrest",
|
|
34
|
+
rpID: "rapidrest",
|
|
35
|
+
origin: "http://localhost:3000",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Called on server startup to initialize the route with any defaults.
|
|
40
|
+
*/
|
|
41
|
+
async initialize() {
|
|
42
|
+
if (!this.authMiddleware) {
|
|
43
|
+
throw new Error("authMiddleware is not set.");
|
|
44
|
+
}
|
|
45
|
+
if (!this.objectFactory) {
|
|
46
|
+
throw new Error("objectFactory is not set.");
|
|
47
|
+
}
|
|
48
|
+
if (!this.aliasRepo && this.aliasClass) {
|
|
49
|
+
this.aliasRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
50
|
+
name: this.aliasClass.name,
|
|
51
|
+
args: [this.aliasClass],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (!this.secretRepo && this.secretClass) {
|
|
55
|
+
this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
56
|
+
name: this.secretClass.name,
|
|
57
|
+
args: [this.secretClass],
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (!this.userRepo && this.userClass) {
|
|
61
|
+
this.userRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
62
|
+
name: this.userClass.name,
|
|
63
|
+
args: [this.userClass],
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (!this.userUtils && this.userClass && this.aliasClass) {
|
|
67
|
+
this.userUtils = await this.objectFactory.newInstance(UserUtils, {
|
|
68
|
+
name: "default",
|
|
69
|
+
args: [this.userClass, this.aliasClass],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const options = new PasskeyStrategyOptions(this.passkeyConfig);
|
|
73
|
+
options.getCredentialById = this.getCredentialById.bind(this);
|
|
74
|
+
options.getCredentials = this.getCredentials.bind(this);
|
|
75
|
+
options.updateCredentialCounter = this.updateCredentialCounter.bind(this);
|
|
76
|
+
options.getUser = this.getUser.bind(this);
|
|
77
|
+
const strategy = await this.objectFactory.newInstance(PasskeyStrategy, {
|
|
78
|
+
name: "default",
|
|
79
|
+
args: [options],
|
|
80
|
+
});
|
|
81
|
+
this.authMiddleware.register(strategy.name, strategy);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Authenticates the user using Passkey and returns a JSON Web Token access token to be used with future API requests.
|
|
85
|
+
*/
|
|
86
|
+
async authenticate(user) {
|
|
87
|
+
const token = await JWTUtils.createToken(this.jwtConfig, user);
|
|
88
|
+
return new AuthResult({
|
|
89
|
+
token,
|
|
90
|
+
user,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async getCredentialById(credentialId) {
|
|
94
|
+
if (!this.secretRepo) {
|
|
95
|
+
throw new Error("secretRepo is not set.");
|
|
96
|
+
}
|
|
97
|
+
const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
|
|
98
|
+
return secret?.data;
|
|
99
|
+
}
|
|
100
|
+
async getCredentials(id) {
|
|
101
|
+
if (!this.secretRepo) {
|
|
102
|
+
throw new Error("secretRepo is not set.");
|
|
103
|
+
}
|
|
104
|
+
if (!this.userUtils) {
|
|
105
|
+
throw new Error("userUtils is not set.");
|
|
106
|
+
}
|
|
107
|
+
const user = await this.userUtils.lookup(id);
|
|
108
|
+
if (!user) {
|
|
109
|
+
throw new Error("Invalid authentication request.");
|
|
110
|
+
}
|
|
111
|
+
// Retrieve all passkey secrets associated with this user
|
|
112
|
+
const secrets = await this.secretRepo.find({ type: SecretType.PASSKEY, userUid: user.uid }, { ignoreACL: true });
|
|
113
|
+
// Extract the passkey credential data from the secrets and return
|
|
114
|
+
const results = [];
|
|
115
|
+
secrets.forEach((secret) => results.push(secret.data));
|
|
116
|
+
return results;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Retrieve the user associated with a given uid or alias.
|
|
120
|
+
*
|
|
121
|
+
* @param id The unqique id of the user or alias to lookup.
|
|
122
|
+
*/
|
|
123
|
+
async getUser(id) {
|
|
124
|
+
if (!this.userUtils) {
|
|
125
|
+
throw new Error("userUtils is not set.");
|
|
126
|
+
}
|
|
127
|
+
return await this.userUtils.lookup(id);
|
|
128
|
+
}
|
|
129
|
+
async updateCredentialCounter(credentialId, newCounter) {
|
|
130
|
+
if (!this.secretRepo) {
|
|
131
|
+
throw new Error("secretRepo is not set.");
|
|
132
|
+
}
|
|
133
|
+
const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
|
|
134
|
+
if (secret) {
|
|
135
|
+
secret.data.counter = newCounter;
|
|
136
|
+
await this.secretRepo.update({
|
|
137
|
+
uid: secret.uid,
|
|
138
|
+
version: secret.version,
|
|
139
|
+
data: secret.data,
|
|
140
|
+
}, secret, { ignoreACL: true, recordEvent: false });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
__decorate([
|
|
145
|
+
Inject(AuthMiddleware),
|
|
146
|
+
__metadata("design:type", AuthMiddleware)
|
|
147
|
+
], BaseAuthPasskeyRoute.prototype, "authMiddleware", void 0);
|
|
148
|
+
__decorate([
|
|
149
|
+
Config("auth"),
|
|
150
|
+
__metadata("design:type", Object)
|
|
151
|
+
], BaseAuthPasskeyRoute.prototype, "jwtConfig", void 0);
|
|
152
|
+
__decorate([
|
|
153
|
+
Inject(ObjectFactory),
|
|
154
|
+
__metadata("design:type", ObjectFactory)
|
|
155
|
+
], BaseAuthPasskeyRoute.prototype, "objectFactory", void 0);
|
|
156
|
+
__decorate([
|
|
157
|
+
Inject(MessagingUtils),
|
|
158
|
+
__metadata("design:type", MessagingUtils)
|
|
159
|
+
], BaseAuthPasskeyRoute.prototype, "messagingUtils", void 0);
|
|
160
|
+
__decorate([
|
|
161
|
+
Config("auth:passkey"),
|
|
162
|
+
__metadata("design:type", Object)
|
|
163
|
+
], BaseAuthPasskeyRoute.prototype, "passkeyConfig", void 0);
|
|
164
|
+
__decorate([
|
|
165
|
+
Init,
|
|
166
|
+
__metadata("design:type", Function),
|
|
167
|
+
__metadata("design:paramtypes", []),
|
|
168
|
+
__metadata("design:returntype", Promise)
|
|
169
|
+
], BaseAuthPasskeyRoute.prototype, "initialize", null);
|
|
170
|
+
__decorate([
|
|
171
|
+
Summary("Authenticate Passkey"),
|
|
172
|
+
Description("Authenticates the user using Passkey and returns a JSON Web Token access token to be used with future API requests."),
|
|
173
|
+
Returns([AuthResult, undefined]),
|
|
174
|
+
Auth(["passkey"]),
|
|
175
|
+
Get(),
|
|
176
|
+
Post(),
|
|
177
|
+
__param(0, AuthUser),
|
|
178
|
+
__metadata("design:type", Function),
|
|
179
|
+
__metadata("design:paramtypes", [Object]),
|
|
180
|
+
__metadata("design:returntype", Promise)
|
|
181
|
+
], BaseAuthPasskeyRoute.prototype, "authenticate", null);
|
|
182
|
+
//# sourceMappingURL=BaseAuthPasskeyRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseAuthPasskeyRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthPasskeyRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
15
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
+
import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
|
|
17
|
+
import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
|
|
18
|
+
import { AuthResult, SecretType } from "../models/types.js";
|
|
19
|
+
import { TOTPStrategy, TOTPStrategyOptions } from "../auth/TOTPStrategy.js";
|
|
20
|
+
import { UserUtils } from "./UserUtils.js";
|
|
21
|
+
const { Config, Init, Inject } = ObjectDecorators;
|
|
22
|
+
const { Summary, Description, Returns } = DocDecorators;
|
|
23
|
+
const { Auth, Get, Post } = RouteDecorators;
|
|
24
|
+
const AuthUser = RouteDecorators.User;
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
*
|
|
28
|
+
* @author Jean-Philippe Steinmetz
|
|
29
|
+
*/
|
|
30
|
+
export class BaseAuthTOTPRoute {
|
|
31
|
+
constructor() {
|
|
32
|
+
/** The name of the messaging template to use for sending notifications. */
|
|
33
|
+
this.template = "login-otp";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Called on server startup to initialize the route with any defaults.
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
if (!this.authMiddleware) {
|
|
40
|
+
throw new Error("authMiddleware is not set.");
|
|
41
|
+
}
|
|
42
|
+
if (!this.objectFactory) {
|
|
43
|
+
throw new Error("objectFactory is not set.");
|
|
44
|
+
}
|
|
45
|
+
if (!this.secretRepo && this.secretClass) {
|
|
46
|
+
this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
|
|
47
|
+
name: this.secretClass.name,
|
|
48
|
+
args: [this.secretClass],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!this.userUtils && this.userClass && this.aliasClass) {
|
|
52
|
+
this.userUtils = await this.objectFactory.newInstance(UserUtils, {
|
|
53
|
+
name: "default",
|
|
54
|
+
args: [this.userClass, this.aliasClass],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const options = new TOTPStrategyOptions();
|
|
58
|
+
options.getSecrets = this.getSecrets.bind(this);
|
|
59
|
+
options.getUser = this.getUser.bind(this);
|
|
60
|
+
const strategy = await this.objectFactory.newInstance(TOTPStrategy, {
|
|
61
|
+
name: "default",
|
|
62
|
+
args: [options],
|
|
63
|
+
});
|
|
64
|
+
this.authMiddleware.register(strategy.name, strategy);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Authenticates the user using TOTP and returns a JSON Web Token access token to be used with future API requests.
|
|
68
|
+
*/
|
|
69
|
+
async authenticate(user) {
|
|
70
|
+
const token = await JWTUtils.createToken(this.jwtConfig, user);
|
|
71
|
+
return new AuthResult({
|
|
72
|
+
token,
|
|
73
|
+
user,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async getSecrets(uid) {
|
|
77
|
+
if (!this.secretRepo) {
|
|
78
|
+
throw new Error("secretRepo is not set.");
|
|
79
|
+
}
|
|
80
|
+
const results = [];
|
|
81
|
+
const secrets = await this.secretRepo.find({ type: SecretType.TOTP, userUid: uid }, { ignoreACL: true });
|
|
82
|
+
for (const secret of secrets) {
|
|
83
|
+
results.push(secret.data);
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Retrieves the user with the given unique id.
|
|
89
|
+
* @param uid The unique id of the user to retrieve.
|
|
90
|
+
* @returns The user if found, otherwise `undefined`.
|
|
91
|
+
*/
|
|
92
|
+
async getUser(uid) {
|
|
93
|
+
if (!this.userUtils) {
|
|
94
|
+
throw new Error("userUtils is not set.");
|
|
95
|
+
}
|
|
96
|
+
return await this.userUtils.lookup(uid);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
__decorate([
|
|
100
|
+
Inject(AuthMiddleware),
|
|
101
|
+
__metadata("design:type", AuthMiddleware)
|
|
102
|
+
], BaseAuthTOTPRoute.prototype, "authMiddleware", void 0);
|
|
103
|
+
__decorate([
|
|
104
|
+
Config("auth"),
|
|
105
|
+
__metadata("design:type", Object)
|
|
106
|
+
], BaseAuthTOTPRoute.prototype, "jwtConfig", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
Inject(ObjectFactory),
|
|
109
|
+
__metadata("design:type", ObjectFactory)
|
|
110
|
+
], BaseAuthTOTPRoute.prototype, "objectFactory", void 0);
|
|
111
|
+
__decorate([
|
|
112
|
+
Inject(MessagingUtils),
|
|
113
|
+
__metadata("design:type", MessagingUtils)
|
|
114
|
+
], BaseAuthTOTPRoute.prototype, "messagingUtils", void 0);
|
|
115
|
+
__decorate([
|
|
116
|
+
Init,
|
|
117
|
+
__metadata("design:type", Function),
|
|
118
|
+
__metadata("design:paramtypes", []),
|
|
119
|
+
__metadata("design:returntype", Promise)
|
|
120
|
+
], BaseAuthTOTPRoute.prototype, "initialize", null);
|
|
121
|
+
__decorate([
|
|
122
|
+
Summary("Authenticate TOTP"),
|
|
123
|
+
Description("Authenticates the user using TTOTP and returns a JSON Web Token access token to be used with future API requests."),
|
|
124
|
+
Returns([AuthResult, undefined]),
|
|
125
|
+
Auth(["totp"]),
|
|
126
|
+
Get(),
|
|
127
|
+
Post(),
|
|
128
|
+
__param(0, AuthUser),
|
|
129
|
+
__metadata("design:type", Function),
|
|
130
|
+
__metadata("design:paramtypes", [Object]),
|
|
131
|
+
__metadata("design:returntype", Promise)
|
|
132
|
+
], BaseAuthTOTPRoute.prototype, "authenticate", null);
|
|
133
|
+
//# sourceMappingURL=BaseAuthTOTPRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseAuthTOTPRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthTOTPRoute.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAC/E,OAAO,EAAW,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAoB,UAAU,EAAU,UAAU,EAAQ,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;AACxD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;AAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC;AAEtC;;;;GAIG;AACH,MAAM,OAAgB,iBAAiB;IAAvC;QAmBI,2EAA2E;QACjE,aAAQ,GAAW,WAAW,CAAC;IAwF7C,CAAC;IApFG;;OAEG;IAEa,AAAN,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE;gBAC9D,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;gBAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;aAC3B,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE;gBAC7D,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;aAC1C,CAAC,CAAC;QACP,CAAC;QAED,MAAM,OAAO,GAAwB,IAAI,mBAAmB,EAAE,CAAC;QAC/D,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE;YAC9E,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,CAAC,OAAO,CAAC;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IASU,AAAN,KAAK,CAAC,YAAY,CAAW,IAAa;QAC7C,MAAM,KAAK,GAAW,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvE,OAAO,IAAI,UAAU,CAAC;YAClB,KAAK;YACL,IAAI;SACP,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,GAAW;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAa,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAChD,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EACvC,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,OAAO,CAAC,GAAW;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;CACJ;AAtGa;IADT,MAAM,CAAC,cAAc,CAAC;8BACI,cAAc;yDAAC;AAGhC;IADT,MAAM,CAAC,MAAM,CAAC;;oDACW;AAGhB;IADT,MAAM,CAAC,aAAa,CAAC;8BACI,aAAa;wDAAC;AAG9B;IADT,MAAM,CAAC,cAAc,CAAC;8BACI,cAAc;yDAAC;AAa1B;IADf,IAAI;;;;mDA+BJ;AAaY;IARZ,OAAO,CAAC,mBAAmB,CAAC;IAC5B,WAAW,CACR,mHAAmH,CACtH;IACA,OAAO,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACd,GAAG,EAAE;IACL,IAAI,EAAE;IACoB,WAAA,QAAQ,CAAA;;;;qDAMlC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
4
|
+
import { CRUDRoute } from "@rapidrest/service-core";
|
|
5
|
+
/**
|
|
6
|
+
* @author Jean-Philippe Steinmetz
|
|
7
|
+
*/
|
|
8
|
+
export class BaseProfileRoute extends CRUDRoute {
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=BaseProfileRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseProfileRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseProfileRoute.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAgB,gBAAoC,SAAQ,SAAY;CAAG"}
|