@licensechain/nodejs-sdk 1.0.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/LICENSE +21 -0
- package/README.md +500 -0
- package/dist/api-client.d.ts +13 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +52 -0
- package/dist/api-client.js.map +1 -0
- package/dist/client.d.ts +24 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +60 -0
- package/dist/client.js.map +1 -0
- package/dist/configuration.d.ts +26 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +63 -0
- package/dist/configuration.js.map +1 -0
- package/dist/exceptions.d.ts +46 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +105 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/http-core.d.ts +36 -0
- package/dist/http-core.d.ts.map +1 -0
- package/dist/http-core.js +119 -0
- package/dist/http-core.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/license-assertion.d.ts +15 -0
- package/dist/license-assertion.d.ts.map +1 -0
- package/dist/license-assertion.js +59 -0
- package/dist/license-assertion.js.map +1 -0
- package/dist/license-validator.d.ts +53 -0
- package/dist/license-validator.d.ts.map +1 -0
- package/dist/license-validator.js +208 -0
- package/dist/license-validator.js.map +1 -0
- package/dist/services/license-service.d.ts +55 -0
- package/dist/services/license-service.d.ts.map +1 -0
- package/dist/services/license-service.js +85 -0
- package/dist/services/license-service.js.map +1 -0
- package/dist/services/product-service.d.ts +48 -0
- package/dist/services/product-service.d.ts.map +1 -0
- package/dist/services/product-service.js +53 -0
- package/dist/services/product-service.js.map +1 -0
- package/dist/services/user-service.d.ts +43 -0
- package/dist/services/user-service.d.ts.map +1 -0
- package/dist/services/user-service.js +58 -0
- package/dist/services/user-service.js.map +1 -0
- package/dist/services/webhook-service.d.ts +37 -0
- package/dist/services/webhook-service.d.ts.map +1 -0
- package/dist/services/webhook-service.js +57 -0
- package/dist/services/webhook-service.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +54 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +396 -0
- package/dist/utils.js.map +1 -0
- package/dist/webhook-handler.d.ts +40 -0
- package/dist/webhook-handler.d.ts.map +1 -0
- package/dist/webhook-handler.js +160 -0
- package/dist/webhook-handler.js.map +1 -0
- package/dist/webhook-verifier.d.ts +41 -0
- package/dist/webhook-verifier.d.ts.map +1 -0
- package/dist/webhook-verifier.js +153 -0
- package/dist/webhook-verifier.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Validator for LicenseChain Node.js SDK
|
|
3
|
+
*/
|
|
4
|
+
import { LicenseData, ValidationResult } from './types';
|
|
5
|
+
export declare class LicenseValidator {
|
|
6
|
+
private client;
|
|
7
|
+
constructor(client: any);
|
|
8
|
+
/**
|
|
9
|
+
* Validate a license key
|
|
10
|
+
*/
|
|
11
|
+
validate(licenseKey: string, hardwareId?: string): Promise<ValidationResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Perform comprehensive license validation
|
|
14
|
+
*/
|
|
15
|
+
private performValidation;
|
|
16
|
+
/**
|
|
17
|
+
* Check if license key has valid format
|
|
18
|
+
*/
|
|
19
|
+
private isValidLicenseKeyFormat;
|
|
20
|
+
/**
|
|
21
|
+
* Check if license is expired
|
|
22
|
+
*/
|
|
23
|
+
private isLicenseExpired;
|
|
24
|
+
/**
|
|
25
|
+
* Check if hardware is allowed for this license
|
|
26
|
+
*/
|
|
27
|
+
private isHardwareAllowed;
|
|
28
|
+
/**
|
|
29
|
+
* Check if validation limit is exceeded
|
|
30
|
+
*/
|
|
31
|
+
private isValidationLimitExceeded;
|
|
32
|
+
/**
|
|
33
|
+
* Update usage statistics
|
|
34
|
+
*/
|
|
35
|
+
private updateUsageStatistics;
|
|
36
|
+
/**
|
|
37
|
+
* Generate hardware ID from system information
|
|
38
|
+
*/
|
|
39
|
+
generateHardwareId(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Check if license has specific feature
|
|
42
|
+
*/
|
|
43
|
+
hasFeature(license: LicenseData, feature: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Get days until expiration
|
|
46
|
+
*/
|
|
47
|
+
getDaysUntilExpiration(license: LicenseData): number | null;
|
|
48
|
+
/**
|
|
49
|
+
* Check if license is near expiration
|
|
50
|
+
*/
|
|
51
|
+
isNearExpiration(license: LicenseData, daysThreshold?: number): boolean;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=license-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-validator.d.ts","sourceRoot":"","sources":["../src/license-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGxD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,GAAG;IAIvB;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0BlF;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;YACW,qBAAqB;IAqCnC;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAe5B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAI1D;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAa3D;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,GAAE,MAAU,GAAG,OAAO;CAI3E"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* License Validator for LicenseChain Node.js SDK
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LicenseValidator = void 0;
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const exceptions_1 = require("./exceptions");
|
|
12
|
+
class LicenseValidator {
|
|
13
|
+
constructor(client) {
|
|
14
|
+
this.client = client;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validate a license key
|
|
18
|
+
*/
|
|
19
|
+
async validate(licenseKey, hardwareId) {
|
|
20
|
+
try {
|
|
21
|
+
// Validate license key format
|
|
22
|
+
if (!this.isValidLicenseKeyFormat(licenseKey)) {
|
|
23
|
+
return {
|
|
24
|
+
valid: false,
|
|
25
|
+
message: 'Invalid license key format'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Get license data from API
|
|
29
|
+
const licenseData = await this.client.getLicense(licenseKey);
|
|
30
|
+
// Perform validation checks
|
|
31
|
+
const validation = await this.performValidation(licenseData, hardwareId);
|
|
32
|
+
return validation;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof exceptions_1.LicenseChainException) {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
throw new exceptions_1.LicenseChainException(`License validation failed: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Perform comprehensive license validation
|
|
44
|
+
*/
|
|
45
|
+
async performValidation(license, hardwareId) {
|
|
46
|
+
// Check if license exists and is active
|
|
47
|
+
if (!license) {
|
|
48
|
+
return {
|
|
49
|
+
valid: false,
|
|
50
|
+
message: 'License not found'
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Check license status
|
|
54
|
+
if (license.status === 'suspended') {
|
|
55
|
+
throw new exceptions_1.LicenseSuspendedException('License has been suspended');
|
|
56
|
+
}
|
|
57
|
+
if (license.status === 'cancelled') {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
message: 'License has been cancelled'
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Check if license is expired
|
|
64
|
+
if (license.status === 'expired' || this.isLicenseExpired(license)) {
|
|
65
|
+
throw new exceptions_1.LicenseExpiredException('License has expired');
|
|
66
|
+
}
|
|
67
|
+
// Check hardware limits
|
|
68
|
+
if (hardwareId && !this.isHardwareAllowed(license, hardwareId)) {
|
|
69
|
+
throw new exceptions_1.HardwareLimitExceededException('Hardware limit exceeded for this license');
|
|
70
|
+
}
|
|
71
|
+
// Check validation limits
|
|
72
|
+
if (this.isValidationLimitExceeded(license)) {
|
|
73
|
+
throw new exceptions_1.ValidationLimitExceededException('Validation limit exceeded for this license');
|
|
74
|
+
}
|
|
75
|
+
// Update usage statistics
|
|
76
|
+
await this.updateUsageStatistics(license, hardwareId);
|
|
77
|
+
return {
|
|
78
|
+
valid: true,
|
|
79
|
+
message: 'License is valid and active',
|
|
80
|
+
licenseId: license.id,
|
|
81
|
+
expiresAt: license.expiresAt,
|
|
82
|
+
features: license.features,
|
|
83
|
+
usage: license.usage
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if license key has valid format
|
|
88
|
+
*/
|
|
89
|
+
isValidLicenseKeyFormat(licenseKey) {
|
|
90
|
+
// License key format: LC-XXXXXXXX-XXXXXXXX-XXXXXXXX
|
|
91
|
+
const licenseKeyRegex = /^LC-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}$/;
|
|
92
|
+
return licenseKeyRegex.test(licenseKey);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if license is expired
|
|
96
|
+
*/
|
|
97
|
+
isLicenseExpired(license) {
|
|
98
|
+
if (!license.expiresAt) {
|
|
99
|
+
return false; // Lifetime license
|
|
100
|
+
}
|
|
101
|
+
const now = new Date();
|
|
102
|
+
const expiresAt = new Date(license.expiresAt);
|
|
103
|
+
return now > expiresAt;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if hardware is allowed for this license
|
|
107
|
+
*/
|
|
108
|
+
isHardwareAllowed(license, hardwareId) {
|
|
109
|
+
if (!license.hardware || license.hardware.length === 0) {
|
|
110
|
+
return true; // No hardware restrictions
|
|
111
|
+
}
|
|
112
|
+
// Check if hardware ID is already registered
|
|
113
|
+
const isRegistered = license.hardware.some(hw => hw.fingerprint === hardwareId);
|
|
114
|
+
if (isRegistered) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
// Check if we can add new hardware (based on application settings)
|
|
118
|
+
// This would require additional API call to get application settings
|
|
119
|
+
return license.hardware.length < 5; // Default limit
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if validation limit is exceeded
|
|
123
|
+
*/
|
|
124
|
+
isValidationLimitExceeded(license) {
|
|
125
|
+
if (license.usage.maxValidations === -1) {
|
|
126
|
+
return false; // Unlimited validations
|
|
127
|
+
}
|
|
128
|
+
return license.usage.totalValidations >= license.usage.maxValidations;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Update usage statistics
|
|
132
|
+
*/
|
|
133
|
+
async updateUsageStatistics(license, hardwareId) {
|
|
134
|
+
try {
|
|
135
|
+
// Update validation count
|
|
136
|
+
const updatedUsage = {
|
|
137
|
+
...license.usage,
|
|
138
|
+
totalValidations: license.usage.totalValidations + 1,
|
|
139
|
+
lastValidated: new Date().toISOString()
|
|
140
|
+
};
|
|
141
|
+
// Update hardware information if provided
|
|
142
|
+
if (hardwareId) {
|
|
143
|
+
const existingHardware = license.hardware.find(hw => hw.fingerprint === hardwareId);
|
|
144
|
+
if (existingHardware) {
|
|
145
|
+
existingHardware.lastSeen = new Date().toISOString();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
license.hardware.push({
|
|
149
|
+
id: crypto_1.default.randomUUID(),
|
|
150
|
+
fingerprint: hardwareId,
|
|
151
|
+
name: 'Unknown Device',
|
|
152
|
+
lastSeen: new Date().toISOString()
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Update license in API
|
|
157
|
+
await this.client.updateLicense(license.id, {
|
|
158
|
+
usage: updatedUsage,
|
|
159
|
+
hardware: license.hardware
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
164
|
+
console.warn('Failed to update usage statistics:', message);
|
|
165
|
+
// Don't throw error as validation should still succeed
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Generate hardware ID from system information
|
|
170
|
+
*/
|
|
171
|
+
generateHardwareId() {
|
|
172
|
+
const os = require('os');
|
|
173
|
+
const networkInterfaces = os.networkInterfaces();
|
|
174
|
+
const macAddress = Object.values(networkInterfaces || {})
|
|
175
|
+
.flat()
|
|
176
|
+
.find((iface) => iface && !iface.internal && iface.mac !== '00:00:00:00:00:00')
|
|
177
|
+
?.mac || 'unknown';
|
|
178
|
+
return crypto_1.default.createHash('sha256').update(macAddress).digest('hex').substring(0, 16);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if license has specific feature
|
|
182
|
+
*/
|
|
183
|
+
hasFeature(license, feature) {
|
|
184
|
+
return license.features.includes(feature);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get days until expiration
|
|
188
|
+
*/
|
|
189
|
+
getDaysUntilExpiration(license) {
|
|
190
|
+
if (!license.expiresAt) {
|
|
191
|
+
return null; // Lifetime license
|
|
192
|
+
}
|
|
193
|
+
const now = new Date();
|
|
194
|
+
const expiresAt = new Date(license.expiresAt);
|
|
195
|
+
const diffTime = expiresAt.getTime() - now.getTime();
|
|
196
|
+
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
197
|
+
return diffDays > 0 ? diffDays : 0;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if license is near expiration
|
|
201
|
+
*/
|
|
202
|
+
isNearExpiration(license, daysThreshold = 7) {
|
|
203
|
+
const daysUntilExpiration = this.getDaysUntilExpiration(license);
|
|
204
|
+
return daysUntilExpiration !== null && daysUntilExpiration <= daysThreshold;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.LicenseValidator = LicenseValidator;
|
|
208
|
+
//# sourceMappingURL=license-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-validator.js","sourceRoot":"","sources":["../src/license-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ApiClient } from '../api-client';
|
|
2
|
+
export interface License {
|
|
3
|
+
id: string;
|
|
4
|
+
user_id: string;
|
|
5
|
+
product_id: string;
|
|
6
|
+
license_key: string;
|
|
7
|
+
status: string;
|
|
8
|
+
created_at: string;
|
|
9
|
+
updated_at: string;
|
|
10
|
+
expires_at?: string;
|
|
11
|
+
metadata?: Record<string, any>;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateLicenseRequest {
|
|
14
|
+
user_id?: string;
|
|
15
|
+
product_id?: string;
|
|
16
|
+
app_id?: string;
|
|
17
|
+
plan?: 'FREE' | 'PRO' | 'BUSINESS' | 'ENTERPRISE';
|
|
18
|
+
issued_email?: string;
|
|
19
|
+
expires_at?: string;
|
|
20
|
+
metadata?: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export interface UpdateLicenseRequest {
|
|
23
|
+
status?: string;
|
|
24
|
+
expires_at?: string;
|
|
25
|
+
metadata?: Record<string, any>;
|
|
26
|
+
}
|
|
27
|
+
export interface LicenseListResponse {
|
|
28
|
+
data: License[];
|
|
29
|
+
total: number;
|
|
30
|
+
page: number;
|
|
31
|
+
limit: number;
|
|
32
|
+
}
|
|
33
|
+
export interface LicenseStats {
|
|
34
|
+
total: number;
|
|
35
|
+
active: number;
|
|
36
|
+
expired: number;
|
|
37
|
+
revoked: number;
|
|
38
|
+
revenue: number;
|
|
39
|
+
}
|
|
40
|
+
export declare class LicenseService {
|
|
41
|
+
private client;
|
|
42
|
+
constructor(client: ApiClient);
|
|
43
|
+
create(request: CreateLicenseRequest): Promise<License>;
|
|
44
|
+
get(licenseId: string): Promise<License>;
|
|
45
|
+
update(licenseId: string, updates: UpdateLicenseRequest): Promise<License>;
|
|
46
|
+
revoke(licenseId: string): Promise<void>;
|
|
47
|
+
validate(licenseKey: string, hwuid?: string | null): Promise<boolean>;
|
|
48
|
+
/** Full POST /v1/licenses/verify JSON (includes optional license_token / license_jwks_uri when API signing is enabled). */
|
|
49
|
+
verifyWithDetails(licenseKey: string, hwuid?: string | null): Promise<Record<string, unknown>>;
|
|
50
|
+
listUserLicenses(userId: string, page?: number, limit?: number): Promise<LicenseListResponse>;
|
|
51
|
+
stats(): Promise<LicenseStats>;
|
|
52
|
+
private extractLicenseResponse;
|
|
53
|
+
private defaultHwuid;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=license-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-service.d.ts","sourceRoot":"","sources":["../../src/services/license-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK1C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,YAAY,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBvD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3E,2HAA2H;IACrH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO9F,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwB7F,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAKpC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,YAAY;CAKrB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LicenseService = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const exceptions_1 = require("../exceptions");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
class LicenseService {
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
async create(request) {
|
|
12
|
+
const appId = request.app_id;
|
|
13
|
+
if (!appId) {
|
|
14
|
+
throw new exceptions_1.ValidationException('app_id is required for API v1 license creation');
|
|
15
|
+
}
|
|
16
|
+
const data = {
|
|
17
|
+
appId,
|
|
18
|
+
plan: request.plan || 'FREE',
|
|
19
|
+
issuedEmail: request.issued_email,
|
|
20
|
+
expiresAt: request.expires_at
|
|
21
|
+
};
|
|
22
|
+
const response = await this.client.post(`/apps/${appId}/licenses`, data);
|
|
23
|
+
return this.extractLicenseResponse(response);
|
|
24
|
+
}
|
|
25
|
+
async get(licenseId) {
|
|
26
|
+
(0, utils_1.validateNotEmpty)(licenseId, 'license_id');
|
|
27
|
+
const response = await this.client.get(`/licenses/${licenseId}`);
|
|
28
|
+
return this.extractLicenseResponse(response);
|
|
29
|
+
}
|
|
30
|
+
async update(licenseId, updates) {
|
|
31
|
+
(0, utils_1.validateNotEmpty)(licenseId, 'license_id');
|
|
32
|
+
const response = await this.client.patch(`/licenses/${licenseId}`, (0, utils_1.sanitizeMetadata)(updates));
|
|
33
|
+
return this.extractLicenseResponse(response);
|
|
34
|
+
}
|
|
35
|
+
async revoke(licenseId) {
|
|
36
|
+
(0, utils_1.validateNotEmpty)(licenseId, 'license_id');
|
|
37
|
+
await this.client.delete(`/licenses/${licenseId}`);
|
|
38
|
+
}
|
|
39
|
+
async validate(licenseKey, hwuid) {
|
|
40
|
+
(0, utils_1.validateNotEmpty)(licenseKey, 'license_key');
|
|
41
|
+
const body = { key: licenseKey };
|
|
42
|
+
body.hwuid = hwuid != null && String(hwuid).trim() !== '' ? hwuid.trim() : this.defaultHwuid();
|
|
43
|
+
const response = await this.client.post('/licenses/verify', body);
|
|
44
|
+
return response.valid || false;
|
|
45
|
+
}
|
|
46
|
+
/** Full POST /v1/licenses/verify JSON (includes optional license_token / license_jwks_uri when API signing is enabled). */
|
|
47
|
+
async verifyWithDetails(licenseKey, hwuid) {
|
|
48
|
+
(0, utils_1.validateNotEmpty)(licenseKey, 'license_key');
|
|
49
|
+
const body = { key: licenseKey };
|
|
50
|
+
body.hwuid = hwuid != null && String(hwuid).trim() !== '' ? hwuid.trim() : this.defaultHwuid();
|
|
51
|
+
return this.client.post('/licenses/verify', body);
|
|
52
|
+
}
|
|
53
|
+
async listUserLicenses(userId, page, limit) {
|
|
54
|
+
(0, utils_1.validateNotEmpty)(userId, 'user_id');
|
|
55
|
+
const [validPage, validLimit] = (0, utils_1.validatePagination)(page, limit);
|
|
56
|
+
const response = await this.client.get('/licenses', {
|
|
57
|
+
page: validPage,
|
|
58
|
+
limit: validLimit
|
|
59
|
+
});
|
|
60
|
+
const allLicenses = response.licenses || response.data || [];
|
|
61
|
+
const filtered = allLicenses.filter((license) => license?.issuedEmail === userId ||
|
|
62
|
+
license?.email === userId ||
|
|
63
|
+
license?.user_id === userId);
|
|
64
|
+
return {
|
|
65
|
+
data: filtered,
|
|
66
|
+
total: filtered.length,
|
|
67
|
+
page: validPage,
|
|
68
|
+
limit: validLimit
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async stats() {
|
|
72
|
+
const response = await this.client.get('/licenses/stats');
|
|
73
|
+
return response.data || response;
|
|
74
|
+
}
|
|
75
|
+
extractLicenseResponse(response) {
|
|
76
|
+
return response?.data ? response.data : response;
|
|
77
|
+
}
|
|
78
|
+
defaultHwuid() {
|
|
79
|
+
return (0, crypto_1.createHash)('sha256')
|
|
80
|
+
.update(`licensechain|nodejs|${process.platform}|${process.arch}|${process.version}`)
|
|
81
|
+
.digest('hex');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.LicenseService = LicenseService;
|
|
85
|
+
//# sourceMappingURL=license-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-service.js","sourceRoot":"","sources":["../../src/services/license-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ApiClient } from '../api-client';
|
|
2
|
+
export interface Product {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
price: number;
|
|
7
|
+
currency: string;
|
|
8
|
+
created_at: string;
|
|
9
|
+
updated_at: string;
|
|
10
|
+
metadata?: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateProductRequest {
|
|
13
|
+
name: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
price: number;
|
|
16
|
+
currency: string;
|
|
17
|
+
metadata?: Record<string, any>;
|
|
18
|
+
}
|
|
19
|
+
export interface UpdateProductRequest {
|
|
20
|
+
name?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
price?: number;
|
|
23
|
+
currency?: string;
|
|
24
|
+
metadata?: Record<string, any>;
|
|
25
|
+
}
|
|
26
|
+
export interface ProductListResponse {
|
|
27
|
+
data: Product[];
|
|
28
|
+
total: number;
|
|
29
|
+
page: number;
|
|
30
|
+
limit: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ProductStats {
|
|
33
|
+
total: number;
|
|
34
|
+
active: number;
|
|
35
|
+
revenue: number;
|
|
36
|
+
}
|
|
37
|
+
export declare class ProductService {
|
|
38
|
+
private client;
|
|
39
|
+
constructor(client: ApiClient);
|
|
40
|
+
create(request: CreateProductRequest): Promise<Product>;
|
|
41
|
+
get(productId: string): Promise<Product>;
|
|
42
|
+
update(productId: string, updates: UpdateProductRequest): Promise<Product>;
|
|
43
|
+
delete(productId: string): Promise<void>;
|
|
44
|
+
list(page?: number, limit?: number): Promise<ProductListResponse>;
|
|
45
|
+
stats(): Promise<ProductStats>;
|
|
46
|
+
private validateRequiredParams;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=product-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-service.d.ts","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWjE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAQpC,OAAO,CAAC,sBAAsB;CAU/B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProductService = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const exceptions_1 = require("../exceptions");
|
|
6
|
+
class ProductService {
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
async create(request) {
|
|
11
|
+
this.validateRequiredParams(request.name, request.price, request.currency);
|
|
12
|
+
throw new exceptions_1.ValidationException('Product endpoints are not available in API v1');
|
|
13
|
+
}
|
|
14
|
+
async get(productId) {
|
|
15
|
+
(0, utils_1.validateNotEmpty)(productId, 'product_id');
|
|
16
|
+
throw new exceptions_1.ValidationException('Product endpoints are not available in API v1');
|
|
17
|
+
}
|
|
18
|
+
async update(productId, updates) {
|
|
19
|
+
(0, utils_1.validateNotEmpty)(productId, 'product_id');
|
|
20
|
+
throw new exceptions_1.ValidationException('Product endpoints are not available in API v1');
|
|
21
|
+
}
|
|
22
|
+
async delete(productId) {
|
|
23
|
+
(0, utils_1.validateNotEmpty)(productId, 'product_id');
|
|
24
|
+
throw new exceptions_1.ValidationException('Product endpoints are not available in API v1');
|
|
25
|
+
}
|
|
26
|
+
async list(page, limit) {
|
|
27
|
+
const [validPage, validLimit] = (0, utils_1.validatePagination)(page, limit);
|
|
28
|
+
return {
|
|
29
|
+
data: [],
|
|
30
|
+
total: 0,
|
|
31
|
+
page: validPage,
|
|
32
|
+
limit: validLimit
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async stats() {
|
|
36
|
+
return {
|
|
37
|
+
total: 0,
|
|
38
|
+
active: 0,
|
|
39
|
+
revenue: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
validateRequiredParams(name, price, currency) {
|
|
43
|
+
(0, utils_1.validateNotEmpty)(name, 'name');
|
|
44
|
+
if (price !== undefined) {
|
|
45
|
+
(0, utils_1.validatePositive)(price, 'price');
|
|
46
|
+
}
|
|
47
|
+
if (!(0, utils_1.validateCurrency)(currency)) {
|
|
48
|
+
throw new exceptions_1.ValidationException('Invalid currency');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ProductService = ProductService;
|
|
53
|
+
//# sourceMappingURL=product-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-service.js","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":";;;AACA,oCAAoG;AACpG,8CAAoD;AA0CpD,MAAa,cAAc;IAGzB,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA6B;QACxC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,IAAI,gCAAmB,CAAC,+CAA+C,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB;QACzB,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,IAAI,gCAAmB,CAAC,+CAA+C,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAA6B;QAC3D,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,IAAI,gCAAmB,CAAC,+CAA+C,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,IAAI,gCAAmB,CAAC,+CAA+C,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAa,EAAE,KAAc;QACtC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,IAAA,0BAAkB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACL,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,UAAU;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO;YACL,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;SACX,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB;QAC1E,IAAA,wBAAgB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAA,wBAAgB,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,gCAAmB,CAAC,kBAAkB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CAEF;AAxDD,wCAwDC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ApiClient } from '../api-client';
|
|
2
|
+
export interface User {
|
|
3
|
+
id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
name: string;
|
|
6
|
+
created_at: string;
|
|
7
|
+
updated_at: string;
|
|
8
|
+
metadata?: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
export interface CreateUserRequest {
|
|
11
|
+
email: string;
|
|
12
|
+
name: string;
|
|
13
|
+
password?: string;
|
|
14
|
+
metadata?: Record<string, any>;
|
|
15
|
+
}
|
|
16
|
+
export interface UpdateUserRequest {
|
|
17
|
+
email?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
metadata?: Record<string, any>;
|
|
20
|
+
}
|
|
21
|
+
export interface UserListResponse {
|
|
22
|
+
data: User[];
|
|
23
|
+
total: number;
|
|
24
|
+
page: number;
|
|
25
|
+
limit: number;
|
|
26
|
+
}
|
|
27
|
+
export interface UserStats {
|
|
28
|
+
total: number;
|
|
29
|
+
active: number;
|
|
30
|
+
inactive: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class UserService {
|
|
33
|
+
private client;
|
|
34
|
+
constructor(client: ApiClient);
|
|
35
|
+
create(request: CreateUserRequest): Promise<User>;
|
|
36
|
+
get(userId: string): Promise<User>;
|
|
37
|
+
update(userId: string, updates: UpdateUserRequest): Promise<User>;
|
|
38
|
+
delete(userId: string): Promise<void>;
|
|
39
|
+
list(page?: number, limit?: number): Promise<UserListResponse>;
|
|
40
|
+
stats(): Promise<UserStats>;
|
|
41
|
+
private validateEmail;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=user-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAIvB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAW9D,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAQjC,OAAO,CAAC,aAAa;CAOtB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserService = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const exceptions_1 = require("../exceptions");
|
|
6
|
+
class UserService {
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
async create(request) {
|
|
11
|
+
this.validateEmail(request.email);
|
|
12
|
+
const data = {
|
|
13
|
+
email: request.email,
|
|
14
|
+
password: request.password || 'ChangeMe123!',
|
|
15
|
+
name: request.name,
|
|
16
|
+
metadata: (0, utils_1.sanitizeMetadata)(request.metadata || {})
|
|
17
|
+
};
|
|
18
|
+
const response = await this.client.post('/auth/register', data);
|
|
19
|
+
return (response.user || response.data);
|
|
20
|
+
}
|
|
21
|
+
async get(userId) {
|
|
22
|
+
(0, utils_1.validateNotEmpty)(userId, 'user_id');
|
|
23
|
+
const response = await this.client.get('/auth/me');
|
|
24
|
+
return response?.data || response;
|
|
25
|
+
}
|
|
26
|
+
async update(userId, updates) {
|
|
27
|
+
(0, utils_1.validateNotEmpty)(userId, 'user_id');
|
|
28
|
+
throw new exceptions_1.ValidationException('User update endpoint is not available in API v1');
|
|
29
|
+
}
|
|
30
|
+
async delete(userId) {
|
|
31
|
+
(0, utils_1.validateNotEmpty)(userId, 'user_id');
|
|
32
|
+
throw new exceptions_1.ValidationException('User delete endpoint is not available in API v1');
|
|
33
|
+
}
|
|
34
|
+
async list(page, limit) {
|
|
35
|
+
const [validPage, validLimit] = (0, utils_1.validatePagination)(page, limit);
|
|
36
|
+
return {
|
|
37
|
+
data: [],
|
|
38
|
+
total: 0,
|
|
39
|
+
page: validPage,
|
|
40
|
+
limit: validLimit
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async stats() {
|
|
44
|
+
return {
|
|
45
|
+
total: 0,
|
|
46
|
+
active: 0,
|
|
47
|
+
inactive: 0
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
validateEmail(email) {
|
|
51
|
+
(0, utils_1.validateNotEmpty)(email, 'email');
|
|
52
|
+
if (!(0, utils_1.validateEmail)(email)) {
|
|
53
|
+
throw new exceptions_1.ValidationException('Invalid email format');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.UserService = UserService;
|
|
58
|
+
//# sourceMappingURL=user-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.js","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":";;;AACA,oCAAiG;AACjG,8CAAoD;AAqCpD,MAAa,WAAW;IAGtB,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA0B;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,cAAc;YAC5C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,IAAA,wBAAgB,EAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;SACnD,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAA+B,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9F,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAS,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,IAAA,wBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAM,UAAU,CAAC,CAAC;QACxD,OAAO,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAA0B;QACrD,IAAA,wBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,IAAI,gCAAmB,CAAC,iDAAiD,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,IAAA,wBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,IAAI,gCAAmB,CAAC,iDAAiD,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAa,EAAE,KAAc;QACtC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,IAAA,0BAAkB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACL,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,UAAU;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO;YACL,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAA,wBAAgB,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,IAAA,qBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,gCAAmB,CAAC,sBAAsB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CAEF;AA/DD,kCA+DC"}
|