@nekutima/biome-sdk 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -0
- package/dist/auth/auth.service.d.ts +90 -0
- package/dist/auth/auth.service.d.ts.map +1 -0
- package/dist/auth/auth.service.js +166 -0
- package/dist/auth/auth.service.js.map +1 -0
- package/dist/auth/types.d.ts +19 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +3 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/core/configuration.d.ts +26 -0
- package/dist/core/configuration.d.ts.map +1 -0
- package/dist/core/configuration.js +3 -0
- package/dist/core/configuration.js.map +1 -0
- package/dist/core/error-handler.d.ts +24 -0
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/core/error-handler.js +76 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/http-client.d.ts +43 -0
- package/dist/core/http-client.d.ts.map +1 -0
- package/dist/core/http-client.js +97 -0
- package/dist/core/http-client.js.map +1 -0
- package/dist/core/state-manager.d.ts +16 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +33 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/files/file-upload.d.ts +60 -0
- package/dist/files/file-upload.d.ts.map +1 -0
- package/dist/files/file-upload.js +121 -0
- package/dist/files/file-upload.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +140 -0
- package/dist/index.js.map +1 -0
- package/dist/models/api-error.model.d.ts +31 -0
- package/dist/models/api-error.model.d.ts.map +1 -0
- package/dist/models/api-error.model.js +53 -0
- package/dist/models/api-error.model.js.map +1 -0
- package/dist/models/api-response.model.d.ts +51 -0
- package/dist/models/api-response.model.d.ts.map +1 -0
- package/dist/models/api-response.model.js +77 -0
- package/dist/models/api-response.model.js.map +1 -0
- package/dist/models/chat.model.d.ts +59 -0
- package/dist/models/chat.model.d.ts.map +1 -0
- package/dist/models/chat.model.js +3 -0
- package/dist/models/chat.model.js.map +1 -0
- package/dist/models/ecosystem.model.d.ts +16 -0
- package/dist/models/ecosystem.model.d.ts.map +1 -0
- package/dist/models/ecosystem.model.js +7 -0
- package/dist/models/ecosystem.model.js.map +1 -0
- package/dist/models/file.model.d.ts +67 -0
- package/dist/models/file.model.d.ts.map +1 -0
- package/dist/models/file.model.js +3 -0
- package/dist/models/file.model.js.map +1 -0
- package/dist/models/notification.model.d.ts +172 -0
- package/dist/models/notification.model.d.ts.map +1 -0
- package/dist/models/notification.model.js +77 -0
- package/dist/models/notification.model.js.map +1 -0
- package/dist/models/person.model.d.ts +94 -0
- package/dist/models/person.model.d.ts.map +1 -0
- package/dist/models/person.model.js +14 -0
- package/dist/models/person.model.js.map +1 -0
- package/dist/models/project.model.d.ts +62 -0
- package/dist/models/project.model.d.ts.map +1 -0
- package/dist/models/project.model.js +93 -0
- package/dist/models/project.model.js.map +1 -0
- package/dist/models/task-update.model.d.ts +28 -0
- package/dist/models/task-update.model.d.ts.map +1 -0
- package/dist/models/task-update.model.js +8 -0
- package/dist/models/task-update.model.js.map +1 -0
- package/dist/models/task-url.model.d.ts +16 -0
- package/dist/models/task-url.model.d.ts.map +1 -0
- package/dist/models/task-url.model.js +3 -0
- package/dist/models/task-url.model.js.map +1 -0
- package/dist/models/task.model.d.ts +120 -0
- package/dist/models/task.model.d.ts.map +1 -0
- package/dist/models/task.model.js +78 -0
- package/dist/models/task.model.js.map +1 -0
- package/dist/models/timezone.model.d.ts +19 -0
- package/dist/models/timezone.model.d.ts.map +1 -0
- package/dist/models/timezone.model.js +12 -0
- package/dist/models/timezone.model.js.map +1 -0
- package/dist/models/user.model.d.ts +101 -0
- package/dist/models/user.model.d.ts.map +1 -0
- package/dist/models/user.model.js +22 -0
- package/dist/models/user.model.js.map +1 -0
- package/dist/profiles/profile.service.d.ts +52 -0
- package/dist/profiles/profile.service.d.ts.map +1 -0
- package/dist/profiles/profile.service.js +119 -0
- package/dist/profiles/profile.service.js.map +1 -0
- package/dist/profiles/types.d.ts +1 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +3 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/tasks/task-sorting.d.ts +51 -0
- package/dist/tasks/task-sorting.d.ts.map +1 -0
- package/dist/tasks/task-sorting.js +137 -0
- package/dist/tasks/task-sorting.js.map +1 -0
- package/dist/tasks/task.service.d.ts +134 -0
- package/dist/tasks/task.service.d.ts.map +1 -0
- package/dist/tasks/task.service.js +256 -0
- package/dist/tasks/task.service.js.map +1 -0
- package/dist/tasks/types.d.ts +2 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +3 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/types/actor.types.d.ts +101 -0
- package/dist/types/actor.types.d.ts.map +1 -0
- package/dist/types/actor.types.js +135 -0
- package/dist/types/actor.types.js.map +1 -0
- package/dist/types/api.types.d.ts +43 -0
- package/dist/types/api.types.d.ts.map +1 -0
- package/dist/types/api.types.js +6 -0
- package/dist/types/api.types.js.map +1 -0
- package/dist/types/common.types.d.ts +40 -0
- package/dist/types/common.types.d.ts.map +1 -0
- package/dist/types/common.types.js +6 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/state-machine.types.d.ts +102 -0
- package/dist/types/state-machine.types.d.ts.map +1 -0
- package/dist/types/state-machine.types.js +18 -0
- package/dist/types/state-machine.types.js.map +1 -0
- package/dist/users/user.service.d.ts +49 -0
- package/dist/users/user.service.d.ts.map +1 -0
- package/dist/users/user.service.js +119 -0
- package/dist/users/user.service.js.map +1 -0
- package/dist/utils/date.utils.d.ts +60 -0
- package/dist/utils/date.utils.d.ts.map +1 -0
- package/dist/utils/date.utils.js +125 -0
- package/dist/utils/date.utils.js.map +1 -0
- package/dist/utils/username-generator.d.ts +76 -0
- package/dist/utils/username-generator.d.ts.map +1 -0
- package/dist/utils/username-generator.js +177 -0
- package/dist/utils/username-generator.js.map +1 -0
- package/dist/utils/validation.utils.d.ts +57 -0
- package/dist/utils/validation.utils.d.ts.map +1 -0
- package/dist/utils/validation.utils.js +117 -0
- package/dist/utils/validation.utils.js.map +1 -0
- package/dist/validation/password-strength.d.ts +66 -0
- package/dist/validation/password-strength.d.ts.map +1 -0
- package/dist/validation/password-strength.js +192 -0
- package/dist/validation/password-strength.js.map +1 -0
- package/dist/validation/schemas.d.ts +69 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +94 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified User model for Biome platform
|
|
3
|
+
* This model is shared between frontend and backend
|
|
4
|
+
*
|
|
5
|
+
* CRITICAL: This model matches the database schema exactly (all fields in camelCase)
|
|
6
|
+
* Database table: users
|
|
7
|
+
* All fields correspond to actual database columns after camelCase migration
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Complete User model matching database schema
|
|
11
|
+
* Includes all fields from the users table
|
|
12
|
+
*/
|
|
13
|
+
export interface User {
|
|
14
|
+
id?: number;
|
|
15
|
+
username: string;
|
|
16
|
+
email: string;
|
|
17
|
+
password: string;
|
|
18
|
+
timezoneId: number;
|
|
19
|
+
loginAttempts: number;
|
|
20
|
+
emailConfirmedAt: Date | null;
|
|
21
|
+
termsAcceptedAt: Date | null;
|
|
22
|
+
lockedUntil?: Date | null;
|
|
23
|
+
lastLoginAt?: Date | null;
|
|
24
|
+
loginCount?: number;
|
|
25
|
+
passwordChangedAt?: Date | null;
|
|
26
|
+
twoFactorEnabled?: boolean;
|
|
27
|
+
twoFactorPreference?: string | null;
|
|
28
|
+
hasActiveSubscription?: boolean;
|
|
29
|
+
nekTokensAvailable?: number;
|
|
30
|
+
isAdminFlagged?: boolean;
|
|
31
|
+
createdAt: Date;
|
|
32
|
+
updatedAt: Date;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* User type safe for frontend display
|
|
36
|
+
* Excludes sensitive fields like password and security-related fields
|
|
37
|
+
*/
|
|
38
|
+
export type UserPublic = Omit<User, 'password' | 'loginAttempts' | 'lockedUntil'>;
|
|
39
|
+
/**
|
|
40
|
+
* Lightweight user representation for lists and references
|
|
41
|
+
* Minimal fields for performance
|
|
42
|
+
*/
|
|
43
|
+
export type UserMinimal = Pick<User, 'id' | 'username' | 'email'>;
|
|
44
|
+
/**
|
|
45
|
+
* Extended user profile with additional person table data
|
|
46
|
+
* Combines User model with Person profile information
|
|
47
|
+
*/
|
|
48
|
+
export interface UserProfile extends UserPublic {
|
|
49
|
+
displayName?: string;
|
|
50
|
+
bio?: string;
|
|
51
|
+
location?: string;
|
|
52
|
+
website?: string;
|
|
53
|
+
profilePhotoFileId?: number | null;
|
|
54
|
+
profileVisibility?: 'public' | 'private';
|
|
55
|
+
spokenLanguages?: string[];
|
|
56
|
+
contactChannels?: {
|
|
57
|
+
type: 'email' | 'phone' | 'social';
|
|
58
|
+
value: string;
|
|
59
|
+
}[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Type for user creation (without auto-generated or auto-managed fields)
|
|
63
|
+
*/
|
|
64
|
+
export type CreateUserRequest = Omit<User, 'id' | 'createdAt' | 'updatedAt' | 'hasActiveSubscription' | 'nekTokensAvailable' | 'isAdminFlagged' | 'lockedUntil' | 'lastLoginAt' | 'loginCount' | 'twoFactorEnabled' | 'twoFactorPreference'>;
|
|
65
|
+
/**
|
|
66
|
+
* Type for user updates (partial, without auto-managed fields)
|
|
67
|
+
*/
|
|
68
|
+
export type UpdateUserRequest = Partial<Omit<User, 'id' | 'createdAt' | 'updatedAt' | 'password'>>;
|
|
69
|
+
/**
|
|
70
|
+
* Profile update request
|
|
71
|
+
*/
|
|
72
|
+
export interface UpdateProfileRequest {
|
|
73
|
+
bio?: string;
|
|
74
|
+
displayName?: string;
|
|
75
|
+
profilePhotoFileId?: number;
|
|
76
|
+
username?: string;
|
|
77
|
+
location?: string;
|
|
78
|
+
website?: string;
|
|
79
|
+
profileVisibility?: 'public' | 'private';
|
|
80
|
+
timezoneId?: number;
|
|
81
|
+
facebookUrl?: string;
|
|
82
|
+
instagramUrl?: string;
|
|
83
|
+
linkedinUrl?: string;
|
|
84
|
+
xingUrl?: string;
|
|
85
|
+
youtubeUrl?: string;
|
|
86
|
+
rumbleUrl?: string;
|
|
87
|
+
mastodonUrl?: string;
|
|
88
|
+
tildeverseUrl?: string;
|
|
89
|
+
twitchUrl?: string;
|
|
90
|
+
xUrl?: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Membership tier type
|
|
94
|
+
* Derived from hasActiveSubscription and isAdminFlagged
|
|
95
|
+
*/
|
|
96
|
+
export type MembershipTier = 'free' | 'premium' | 'admin';
|
|
97
|
+
/**
|
|
98
|
+
* Helper function to determine membership tier from user data
|
|
99
|
+
*/
|
|
100
|
+
export declare function getUserMembershipTier(user: User): MembershipTier;
|
|
101
|
+
//# sourceMappingURL=user.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.model.d.ts","sourceRoot":"","sources":["../../src/models/user.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unified User model for Biome platform
|
|
4
|
+
* This model is shared between frontend and backend
|
|
5
|
+
*
|
|
6
|
+
* CRITICAL: This model matches the database schema exactly (all fields in camelCase)
|
|
7
|
+
* Database table: users
|
|
8
|
+
* All fields correspond to actual database columns after camelCase migration
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.getUserMembershipTier = getUserMembershipTier;
|
|
12
|
+
/**
|
|
13
|
+
* Helper function to determine membership tier from user data
|
|
14
|
+
*/
|
|
15
|
+
function getUserMembershipTier(user) {
|
|
16
|
+
if (user.isAdminFlagged)
|
|
17
|
+
return 'admin';
|
|
18
|
+
if (user.hasActiveSubscription)
|
|
19
|
+
return 'premium';
|
|
20
|
+
return 'free';
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=user.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.model.js","sourceRoot":"","sources":["../../src/models/user.model.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAuHH,sDAIC;AAPD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAU;IAC5C,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BiomeHttpClient } from '../core/http-client';
|
|
2
|
+
import { UserAsAPerson } from '../models/person.model';
|
|
3
|
+
import { UpdateProfileRequest } from '../models/user.model';
|
|
4
|
+
/**
|
|
5
|
+
* Profile management service - pure business logic without UI state
|
|
6
|
+
*/
|
|
7
|
+
export declare class BiomeProfiles {
|
|
8
|
+
private http;
|
|
9
|
+
private readonly currentProfile;
|
|
10
|
+
constructor(http: BiomeHttpClient);
|
|
11
|
+
/**
|
|
12
|
+
* Get current user's profile
|
|
13
|
+
*/
|
|
14
|
+
getMyProfile(): Promise<UserAsAPerson>;
|
|
15
|
+
/**
|
|
16
|
+
* Get user profile by username
|
|
17
|
+
*/
|
|
18
|
+
getProfile(username: string): Promise<UserAsAPerson | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Update current user's profile
|
|
21
|
+
*/
|
|
22
|
+
updateProfile(profileData: UpdateProfileRequest): Promise<UserAsAPerson>;
|
|
23
|
+
/**
|
|
24
|
+
* Check if username is available
|
|
25
|
+
*/
|
|
26
|
+
checkUsername(username: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Change user password
|
|
29
|
+
*/
|
|
30
|
+
changePassword(passwordData: {
|
|
31
|
+
currentPassword: string;
|
|
32
|
+
newPassword: string;
|
|
33
|
+
confirmPassword: string;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Get current profile value
|
|
37
|
+
*/
|
|
38
|
+
getCurrentProfile(): UserAsAPerson | null;
|
|
39
|
+
/**
|
|
40
|
+
* Subscribe to profile changes
|
|
41
|
+
*/
|
|
42
|
+
onProfileChange(callback: (profile: UserAsAPerson | null) => void): () => void;
|
|
43
|
+
/**
|
|
44
|
+
* Upload profile photo (placeholder implementation)
|
|
45
|
+
*/
|
|
46
|
+
uploadProfilePhoto(file: File): Promise<UserAsAPerson>;
|
|
47
|
+
/**
|
|
48
|
+
* Remove profile photo (placeholder implementation)
|
|
49
|
+
*/
|
|
50
|
+
removeProfilePhoto(): Promise<UserAsAPerson>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=profile.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.service.d.ts","sourceRoot":"","sources":["../../src/profiles/profile.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,qBAAa,aAAa;IAGV,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;gBAE5D,IAAI,EAAE,eAAe;IAEzC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IAW5C;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAajE;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;IAW9E;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASvD;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE;QAC/B,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjB;;OAEG;IACH,iBAAiB,IAAI,aAAa,GAAG,IAAI;IAIzC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAI9E;;OAEG;IACG,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAU5D;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC;CASrD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BiomeProfiles = void 0;
|
|
4
|
+
const state_manager_1 = require("../core/state-manager");
|
|
5
|
+
const error_handler_1 = require("../core/error-handler");
|
|
6
|
+
/**
|
|
7
|
+
* Profile management service - pure business logic without UI state
|
|
8
|
+
*/
|
|
9
|
+
class BiomeProfiles {
|
|
10
|
+
constructor(http) {
|
|
11
|
+
this.http = http;
|
|
12
|
+
this.currentProfile = new state_manager_1.StatefulValue(null);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get current user's profile
|
|
16
|
+
*/
|
|
17
|
+
async getMyProfile() {
|
|
18
|
+
try {
|
|
19
|
+
const response = await this.http.get('/profiles/me');
|
|
20
|
+
const profile = response.payload;
|
|
21
|
+
this.currentProfile.value = profile;
|
|
22
|
+
return profile;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw (0, error_handler_1.createSdkError)(error, 'Failed to fetch profile');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get user profile by username
|
|
30
|
+
*/
|
|
31
|
+
async getProfile(username) {
|
|
32
|
+
try {
|
|
33
|
+
const response = await this.http.get(`/profiles/${username}`);
|
|
34
|
+
const profile = response.payload;
|
|
35
|
+
return profile || null;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.status === 404) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
throw (0, error_handler_1.createSdkError)(error, 'Failed to fetch profile');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Update current user's profile
|
|
46
|
+
*/
|
|
47
|
+
async updateProfile(profileData) {
|
|
48
|
+
try {
|
|
49
|
+
const response = await this.http.put('/profiles/me', profileData);
|
|
50
|
+
const updatedProfile = response.payload;
|
|
51
|
+
this.currentProfile.value = updatedProfile;
|
|
52
|
+
return updatedProfile;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw (0, error_handler_1.createSdkError)(error, 'Failed to update profile');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if username is available
|
|
60
|
+
*/
|
|
61
|
+
async checkUsername(username) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await this.http.get(`/auth/check-username?username=${encodeURIComponent(username)}`);
|
|
64
|
+
return response.payload.available;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw (0, error_handler_1.createSdkError)(error, 'Failed to check username availability');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Change user password
|
|
72
|
+
*/
|
|
73
|
+
async changePassword(passwordData) {
|
|
74
|
+
try {
|
|
75
|
+
await this.http.post('/profile/password', passwordData);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw (0, error_handler_1.createSdkError)(error, 'Failed to change password');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get current profile value
|
|
83
|
+
*/
|
|
84
|
+
getCurrentProfile() {
|
|
85
|
+
return this.currentProfile.value;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Subscribe to profile changes
|
|
89
|
+
*/
|
|
90
|
+
onProfileChange(callback) {
|
|
91
|
+
return this.currentProfile.subscribe(callback);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Upload profile photo (placeholder implementation)
|
|
95
|
+
*/
|
|
96
|
+
async uploadProfilePhoto(file) {
|
|
97
|
+
// TODO: Implement actual profile photo upload
|
|
98
|
+
// For now, return current profile to maintain compatibility
|
|
99
|
+
const currentProfile = this.currentProfile.value;
|
|
100
|
+
if (!currentProfile) {
|
|
101
|
+
throw (0, error_handler_1.createSdkError)(new Error('No active profile'), 'Failed to upload profile photo');
|
|
102
|
+
}
|
|
103
|
+
return currentProfile;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Remove profile photo (placeholder implementation)
|
|
107
|
+
*/
|
|
108
|
+
async removeProfilePhoto() {
|
|
109
|
+
// TODO: Implement actual profile photo removal
|
|
110
|
+
// For now, return current profile to maintain compatibility
|
|
111
|
+
const currentProfile = this.currentProfile.value;
|
|
112
|
+
if (!currentProfile) {
|
|
113
|
+
throw (0, error_handler_1.createSdkError)(new Error('No active profile'), 'Failed to remove profile photo');
|
|
114
|
+
}
|
|
115
|
+
return currentProfile;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.BiomeProfiles = BiomeProfiles;
|
|
119
|
+
//# sourceMappingURL=profile.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.service.js","sourceRoot":"","sources":["../../src/profiles/profile.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/profiles/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/profiles/types.ts"],"names":[],"mappings":";AAAA,iEAAiE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Task } from '../models/task.model';
|
|
2
|
+
/**
|
|
3
|
+
* Task sorting utilities - pure business logic without UI concerns
|
|
4
|
+
*/
|
|
5
|
+
export declare class TaskSorting {
|
|
6
|
+
/**
|
|
7
|
+
* Sort tasks using intelligent ordering system
|
|
8
|
+
* Primary sort: by date (next touch date or due date)
|
|
9
|
+
* Secondary sort: by Eisenhower Matrix (Urgent+Important → Important+Not Urgent → Urgent+Not Important → Not Urgent+Not Important)
|
|
10
|
+
* Tertiary sort: by creation date
|
|
11
|
+
*/
|
|
12
|
+
static sortTasks(tasks: Task[]): Task[];
|
|
13
|
+
/**
|
|
14
|
+
* Check if a task is overdue based on its dates
|
|
15
|
+
*/
|
|
16
|
+
static isTaskOverdue(task: Task): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get number of days until a task's date
|
|
19
|
+
* Returns negative number for overdue tasks
|
|
20
|
+
*/
|
|
21
|
+
static getDaysUntilTaskDate(task: Task): number;
|
|
22
|
+
/**
|
|
23
|
+
* Get task urgency level based on days until date
|
|
24
|
+
*/
|
|
25
|
+
static getTaskUrgencyLevel(task: Task): 'overdue' | 'urgent' | 'soon' | 'normal';
|
|
26
|
+
/**
|
|
27
|
+
* Compare tasks by date (next touch date or due date)
|
|
28
|
+
*/
|
|
29
|
+
private static compareByDate;
|
|
30
|
+
/**
|
|
31
|
+
* Get relevant date for a task (next touch date or due date)
|
|
32
|
+
*/
|
|
33
|
+
private static getTaskDate;
|
|
34
|
+
/**
|
|
35
|
+
* Compare tasks by Eisenhower Matrix priority
|
|
36
|
+
*/
|
|
37
|
+
private static compareByEisenhowerMatrix;
|
|
38
|
+
/**
|
|
39
|
+
* Get Eisenhower Matrix priority for a task
|
|
40
|
+
*/
|
|
41
|
+
private static getEisenhowerPriority;
|
|
42
|
+
/**
|
|
43
|
+
* Compare tasks by creation date (newest first)
|
|
44
|
+
*/
|
|
45
|
+
private static compareByCreationDate;
|
|
46
|
+
/**
|
|
47
|
+
* Helper to start of day
|
|
48
|
+
*/
|
|
49
|
+
private static startOfDay;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=task-sorting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-sorting.d.ts","sourceRoot":"","sources":["../../src/tasks/task-sorting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW;IAEpB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE;IAmBvC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAUzC;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAY/C;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ;IAShF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAQxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAQpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAK5B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskSorting = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Task sorting utilities - pure business logic without UI concerns
|
|
6
|
+
*/
|
|
7
|
+
class TaskSorting {
|
|
8
|
+
/**
|
|
9
|
+
* Sort tasks using intelligent ordering system
|
|
10
|
+
* Primary sort: by date (next touch date or due date)
|
|
11
|
+
* Secondary sort: by Eisenhower Matrix (Urgent+Important → Important+Not Urgent → Urgent+Not Important → Not Urgent+Not Important)
|
|
12
|
+
* Tertiary sort: by creation date
|
|
13
|
+
*/
|
|
14
|
+
static sortTasks(tasks) {
|
|
15
|
+
return [...tasks].sort((a, b) => {
|
|
16
|
+
// Primary sort: by date
|
|
17
|
+
const dateComparison = TaskSorting.compareByDate(a, b);
|
|
18
|
+
if (dateComparison !== 0) {
|
|
19
|
+
return dateComparison;
|
|
20
|
+
}
|
|
21
|
+
// Secondary sort: by Eisenhower Matrix
|
|
22
|
+
const eisenhowerComparison = TaskSorting.compareByEisenhowerMatrix(a, b);
|
|
23
|
+
if (eisenhowerComparison !== 0) {
|
|
24
|
+
return eisenhowerComparison;
|
|
25
|
+
}
|
|
26
|
+
// Tertiary sort: by creation date (newest first)
|
|
27
|
+
return TaskSorting.compareByCreationDate(a, b);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a task is overdue based on its dates
|
|
32
|
+
*/
|
|
33
|
+
static isTaskOverdue(task) {
|
|
34
|
+
const today = TaskSorting.startOfDay(new Date());
|
|
35
|
+
const taskDate = TaskSorting.getTaskDate(task);
|
|
36
|
+
if (!taskDate)
|
|
37
|
+
return false;
|
|
38
|
+
// Treat only dates strictly before today as overdue ("today" is not overdue)
|
|
39
|
+
return TaskSorting.startOfDay(taskDate) < today;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get number of days until a task's date
|
|
43
|
+
* Returns negative number for overdue tasks
|
|
44
|
+
*/
|
|
45
|
+
static getDaysUntilTaskDate(task) {
|
|
46
|
+
const today = TaskSorting.startOfDay(new Date());
|
|
47
|
+
const taskDate = TaskSorting.getTaskDate(task);
|
|
48
|
+
if (!taskDate)
|
|
49
|
+
return Infinity;
|
|
50
|
+
// Compare by day-granularity so that a date on "today" yields 0
|
|
51
|
+
const diffTime = TaskSorting.startOfDay(taskDate).getTime() - today.getTime();
|
|
52
|
+
const dayMs = 1000 * 60 * 60 * 24;
|
|
53
|
+
return Math.floor(diffTime / dayMs);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get task urgency level based on days until date
|
|
57
|
+
*/
|
|
58
|
+
static getTaskUrgencyLevel(task) {
|
|
59
|
+
const daysUntil = TaskSorting.getDaysUntilTaskDate(task);
|
|
60
|
+
if (daysUntil < 0)
|
|
61
|
+
return 'overdue';
|
|
62
|
+
if (daysUntil <= 1)
|
|
63
|
+
return 'urgent';
|
|
64
|
+
if (daysUntil <= 3)
|
|
65
|
+
return 'soon';
|
|
66
|
+
return 'normal';
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Compare tasks by date (next touch date or due date)
|
|
70
|
+
*/
|
|
71
|
+
static compareByDate(a, b) {
|
|
72
|
+
const dateA = TaskSorting.getTaskDate(a);
|
|
73
|
+
const dateB = TaskSorting.getTaskDate(b);
|
|
74
|
+
// Handle null dates - tasks without dates come last
|
|
75
|
+
if (dateA === null && dateB === null)
|
|
76
|
+
return 0;
|
|
77
|
+
if (dateA === null)
|
|
78
|
+
return 1;
|
|
79
|
+
if (dateB === null)
|
|
80
|
+
return -1;
|
|
81
|
+
// Compare dates (earlier dates come first)
|
|
82
|
+
return dateA.getTime() - dateB.getTime();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get relevant date for a task (next touch date or due date)
|
|
86
|
+
*/
|
|
87
|
+
static getTaskDate(task) {
|
|
88
|
+
// Prefer next touch date, fall back to due date
|
|
89
|
+
if (task.nextTouchDate) {
|
|
90
|
+
return new Date(task.nextTouchDate);
|
|
91
|
+
}
|
|
92
|
+
if (task.dueDate) {
|
|
93
|
+
return new Date(task.dueDate);
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compare tasks by Eisenhower Matrix priority
|
|
99
|
+
*/
|
|
100
|
+
static compareByEisenhowerMatrix(a, b) {
|
|
101
|
+
const priorityA = TaskSorting.getEisenhowerPriority(a);
|
|
102
|
+
const priorityB = TaskSorting.getEisenhowerPriority(b);
|
|
103
|
+
// Lower priority number means higher priority
|
|
104
|
+
return priorityA - priorityB;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get Eisenhower Matrix priority for a task
|
|
108
|
+
*/
|
|
109
|
+
static getEisenhowerPriority(task) {
|
|
110
|
+
if (task.isUrgent && task.isImportant)
|
|
111
|
+
return 1;
|
|
112
|
+
if (task.isImportant && !task.isUrgent)
|
|
113
|
+
return 2;
|
|
114
|
+
if (task.isUrgent && !task.isImportant)
|
|
115
|
+
return 3;
|
|
116
|
+
return 4; // Not Urgent+Not Important
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compare tasks by creation date (newest first)
|
|
120
|
+
*/
|
|
121
|
+
static compareByCreationDate(a, b) {
|
|
122
|
+
const dateA = new Date(a.createdAt);
|
|
123
|
+
const dateB = new Date(b.createdAt);
|
|
124
|
+
// Newer tasks come first (descending order)
|
|
125
|
+
return dateB.getTime() - dateA.getTime();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Helper to start of day
|
|
129
|
+
*/
|
|
130
|
+
static startOfDay(date) {
|
|
131
|
+
const d = new Date(date);
|
|
132
|
+
d.setHours(0, 0, 0, 0);
|
|
133
|
+
return d;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.TaskSorting = TaskSorting;
|
|
137
|
+
//# sourceMappingURL=task-sorting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-sorting.js","sourceRoot":"","sources":["../../src/tasks/task-sorting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { BiomeHttpClient } from '../core/http-client';
|
|
2
|
+
import { Task, TASK_STATUS, TaskMinimal, TaskSearchResults } from '../models/task.model';
|
|
3
|
+
/**
|
|
4
|
+
* Task filtering options
|
|
5
|
+
*/
|
|
6
|
+
export interface TaskFilters {
|
|
7
|
+
status?: TASK_STATUS | TASK_STATUS[];
|
|
8
|
+
assigneeId?: number;
|
|
9
|
+
requesterId?: number;
|
|
10
|
+
limit?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
search?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Task creation request
|
|
16
|
+
*/
|
|
17
|
+
export interface CreateTaskRequest {
|
|
18
|
+
title: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
summary?: string;
|
|
21
|
+
assigneeId?: number;
|
|
22
|
+
dueDate?: Date | null;
|
|
23
|
+
prerequisites?: number[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Task update request
|
|
27
|
+
*/
|
|
28
|
+
export interface UpdateTaskRequest {
|
|
29
|
+
title?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
summary?: string;
|
|
32
|
+
assigneeId?: number;
|
|
33
|
+
dueDate?: Date | null;
|
|
34
|
+
evaluation?: number;
|
|
35
|
+
tip?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Task action requests
|
|
39
|
+
*/
|
|
40
|
+
export interface TaskDeliveryRequest {
|
|
41
|
+
deliveryNote: string;
|
|
42
|
+
}
|
|
43
|
+
export interface TaskEvaluationRequest {
|
|
44
|
+
evaluation: number;
|
|
45
|
+
tip?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface TaskRejectionRequest {
|
|
48
|
+
rejectionNote?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface TaskCancellationRequest {
|
|
51
|
+
cancellationReason?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Task management service - pure business logic without UI state
|
|
55
|
+
*/
|
|
56
|
+
export declare class BiomeTasks {
|
|
57
|
+
private http;
|
|
58
|
+
constructor(http: BiomeHttpClient);
|
|
59
|
+
/**
|
|
60
|
+
* Get task by ID
|
|
61
|
+
*/
|
|
62
|
+
getById(id: number): Promise<Task>;
|
|
63
|
+
/**
|
|
64
|
+
* Create a new task
|
|
65
|
+
*/
|
|
66
|
+
create(task: CreateTaskRequest): Promise<{
|
|
67
|
+
id: number;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* Update an existing task
|
|
71
|
+
*/
|
|
72
|
+
update(id: number, updates: UpdateTaskRequest): Promise<Task>;
|
|
73
|
+
/**
|
|
74
|
+
* Update specific task fields (partial update)
|
|
75
|
+
*/
|
|
76
|
+
updateFields(id: number, fields: Partial<Task>): Promise<Task>;
|
|
77
|
+
/**
|
|
78
|
+
* Delete a task
|
|
79
|
+
*/
|
|
80
|
+
delete(id: number): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get tasks assigned to current user
|
|
83
|
+
*/
|
|
84
|
+
getMyTasks(filters?: TaskFilters): Promise<TaskMinimal[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Get tasks delegated by current user
|
|
87
|
+
*/
|
|
88
|
+
getDelegatedTasks(filters?: TaskFilters): Promise<TaskMinimal[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Search tasks
|
|
91
|
+
*/
|
|
92
|
+
searchTasks(query: string, filters?: TaskFilters): Promise<TaskSearchResults>;
|
|
93
|
+
/**
|
|
94
|
+
* Get tasks by status (for frontend compatibility)
|
|
95
|
+
*/
|
|
96
|
+
getTasksByStatus(statuses: TASK_STATUS[]): Promise<TaskSearchResults>;
|
|
97
|
+
/**
|
|
98
|
+
* Get task prerequisites/children
|
|
99
|
+
*/
|
|
100
|
+
getRequisites(parentId: number): Promise<Task[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Accept a task
|
|
103
|
+
*/
|
|
104
|
+
accept(id: number): Promise<Task>;
|
|
105
|
+
/**
|
|
106
|
+
* Reject a task
|
|
107
|
+
*/
|
|
108
|
+
reject(id: number, request: TaskRejectionRequest): Promise<Task>;
|
|
109
|
+
/**
|
|
110
|
+
* Deliver a completed task
|
|
111
|
+
*/
|
|
112
|
+
deliver(id: number, request: TaskDeliveryRequest): Promise<Task>;
|
|
113
|
+
/**
|
|
114
|
+
* Evaluate a delivered task
|
|
115
|
+
*/
|
|
116
|
+
evaluate(id: number, request: TaskEvaluationRequest): Promise<Task>;
|
|
117
|
+
/**
|
|
118
|
+
* Archive a task
|
|
119
|
+
*/
|
|
120
|
+
archive(id: number): Promise<Task>;
|
|
121
|
+
/**
|
|
122
|
+
* Cancel a task
|
|
123
|
+
*/
|
|
124
|
+
cancel(id: number, request: TaskCancellationRequest): Promise<Task>;
|
|
125
|
+
/**
|
|
126
|
+
* Quit a task (for assignee)
|
|
127
|
+
*/
|
|
128
|
+
quit(id: number): Promise<Task>;
|
|
129
|
+
/**
|
|
130
|
+
* Build query parameters from filters
|
|
131
|
+
*/
|
|
132
|
+
private buildQueryParams;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=task.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.service.d.ts","sourceRoot":"","sources":["../../src/tasks/task.service.ts"],"names":[],"mappings":"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"}
|