@blackcode_sa/metaestetics-api 1.14.4 → 1.14.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +82 -49
- package/dist/index.mjs +82 -49
- package/package.json +1 -1
- package/src/services/auth/auth.service.ts +57 -57
- package/src/services/user/user.service.ts +35 -2
package/dist/index.d.mts
CHANGED
|
@@ -8412,9 +8412,9 @@ declare class AuthService extends BaseService {
|
|
|
8412
8412
|
}>;
|
|
8413
8413
|
/**
|
|
8414
8414
|
* Claims draft practitioner profiles after Google Sign-In.
|
|
8415
|
-
*
|
|
8415
|
+
* Uses the current authenticated user (from initial Google Sign-In).
|
|
8416
8416
|
*
|
|
8417
|
-
* @param idToken - The Google ID token
|
|
8417
|
+
* @param idToken - The Google ID token (used to re-authenticate if needed)
|
|
8418
8418
|
* @param practitionerIds - Array of draft practitioner profile IDs to claim
|
|
8419
8419
|
* @returns Object containing user and claimed practitioner
|
|
8420
8420
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -8412,9 +8412,9 @@ declare class AuthService extends BaseService {
|
|
|
8412
8412
|
}>;
|
|
8413
8413
|
/**
|
|
8414
8414
|
* Claims draft practitioner profiles after Google Sign-In.
|
|
8415
|
-
*
|
|
8415
|
+
* Uses the current authenticated user (from initial Google Sign-In).
|
|
8416
8416
|
*
|
|
8417
|
-
* @param idToken - The Google ID token
|
|
8417
|
+
* @param idToken - The Google ID token (used to re-authenticate if needed)
|
|
8418
8418
|
* @param practitionerIds - Array of draft practitioner profile IDs to claim
|
|
8419
8419
|
* @returns Object containing user and claimed practitioner
|
|
8420
8420
|
*/
|
package/dist/index.js
CHANGED
|
@@ -12906,6 +12906,23 @@ var UserService = class extends BaseService {
|
|
|
12906
12906
|
* Kreira novog korisnika na osnovu Firebase korisnika
|
|
12907
12907
|
*/
|
|
12908
12908
|
async createUser(firebaseUser, roles = ["patient" /* PATIENT */], options) {
|
|
12909
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
12910
|
+
console.log("[USER_SERVICE] ====== CREATE USER DEBUG ======");
|
|
12911
|
+
console.log("[USER_SERVICE] Current auth state:", {
|
|
12912
|
+
currentUser: ((_b = (_a = this.auth) == null ? void 0 : _a.currentUser) == null ? void 0 : _b.uid) || "NULL",
|
|
12913
|
+
currentUserEmail: ((_d = (_c = this.auth) == null ? void 0 : _c.currentUser) == null ? void 0 : _d.email) || "NULL",
|
|
12914
|
+
currentUserProvider: ((_f = (_e = this.auth) == null ? void 0 : _e.currentUser) == null ? void 0 : _f.providerId) || "NULL"
|
|
12915
|
+
});
|
|
12916
|
+
console.log("[USER_SERVICE] Firebase user passed to createUser:", {
|
|
12917
|
+
uid: (firebaseUser == null ? void 0 : firebaseUser.uid) || "NULL",
|
|
12918
|
+
email: (firebaseUser == null ? void 0 : firebaseUser.email) || "NULL",
|
|
12919
|
+
providerId: (firebaseUser == null ? void 0 : firebaseUser.providerId) || "NULL",
|
|
12920
|
+
isAnonymous: firebaseUser == null ? void 0 : firebaseUser.isAnonymous
|
|
12921
|
+
});
|
|
12922
|
+
console.log("[USER_SERVICE] Auth instances match:", ((_h = (_g = this.auth) == null ? void 0 : _g.currentUser) == null ? void 0 : _h.uid) === (firebaseUser == null ? void 0 : firebaseUser.uid));
|
|
12923
|
+
console.log("[USER_SERVICE] Document path:", `${USERS_COLLECTION}/${firebaseUser == null ? void 0 : firebaseUser.uid}`);
|
|
12924
|
+
console.log("[USER_SERVICE] Roles:", roles);
|
|
12925
|
+
console.log("[USER_SERVICE] ================================");
|
|
12909
12926
|
const userData = {
|
|
12910
12927
|
uid: firebaseUser.uid,
|
|
12911
12928
|
email: firebaseUser.email,
|
|
@@ -12915,7 +12932,22 @@ var UserService = class extends BaseService {
|
|
|
12915
12932
|
updatedAt: (0, import_firestore33.serverTimestamp)(),
|
|
12916
12933
|
lastLoginAt: (0, import_firestore33.serverTimestamp)()
|
|
12917
12934
|
};
|
|
12918
|
-
|
|
12935
|
+
console.log("[USER_SERVICE] Attempting setDoc with userData:", {
|
|
12936
|
+
uid: userData.uid,
|
|
12937
|
+
email: userData.email,
|
|
12938
|
+
roles: userData.roles
|
|
12939
|
+
});
|
|
12940
|
+
try {
|
|
12941
|
+
await (0, import_firestore33.setDoc)((0, import_firestore33.doc)(this.db, USERS_COLLECTION, userData.uid), userData);
|
|
12942
|
+
console.log("[USER_SERVICE] \u2705 setDoc SUCCEEDED for:", userData.uid);
|
|
12943
|
+
} catch (error) {
|
|
12944
|
+
console.error("[USER_SERVICE] \u274C setDoc FAILED:", {
|
|
12945
|
+
errorCode: error == null ? void 0 : error.code,
|
|
12946
|
+
errorMessage: error == null ? void 0 : error.message,
|
|
12947
|
+
uid: userData.uid
|
|
12948
|
+
});
|
|
12949
|
+
throw error;
|
|
12950
|
+
}
|
|
12919
12951
|
if (options == null ? void 0 : options.skipProfileCreation) {
|
|
12920
12952
|
return this.getUserById(userData.uid);
|
|
12921
12953
|
}
|
|
@@ -15910,9 +15942,9 @@ var AuthService = class extends BaseService {
|
|
|
15910
15942
|
}
|
|
15911
15943
|
/**
|
|
15912
15944
|
* Claims draft practitioner profiles after Google Sign-In.
|
|
15913
|
-
*
|
|
15945
|
+
* Uses the current authenticated user (from initial Google Sign-In).
|
|
15914
15946
|
*
|
|
15915
|
-
* @param idToken - The Google ID token
|
|
15947
|
+
* @param idToken - The Google ID token (used to re-authenticate if needed)
|
|
15916
15948
|
* @param practitionerIds - Array of draft practitioner profile IDs to claim
|
|
15917
15949
|
* @returns Object containing user and claimed practitioner
|
|
15918
15950
|
*/
|
|
@@ -15925,60 +15957,61 @@ var AuthService = class extends BaseService {
|
|
|
15925
15957
|
if (practitionerIds.length === 0) {
|
|
15926
15958
|
throw new AuthError("No practitioner profiles selected to claim", "AUTH/NO_PROFILES_SELECTED", 400);
|
|
15927
15959
|
}
|
|
15928
|
-
|
|
15929
|
-
|
|
15930
|
-
|
|
15960
|
+
let firebaseUser = this.auth.currentUser;
|
|
15961
|
+
if (!firebaseUser) {
|
|
15962
|
+
console.log("[AUTH] No current user, re-authenticating with Google credential");
|
|
15963
|
+
const credential = import_auth8.GoogleAuthProvider.credential(idToken);
|
|
15964
|
+
const result = await (0, import_auth8.signInWithCredential)(this.auth, credential);
|
|
15965
|
+
firebaseUser = result.user;
|
|
15966
|
+
}
|
|
15967
|
+
console.log("[AUTH] Using Firebase user:", firebaseUser.uid);
|
|
15968
|
+
console.log("[AUTH] Forcing token refresh...");
|
|
15969
|
+
await firebaseUser.getIdToken(true);
|
|
15970
|
+
console.log("[AUTH] Token refreshed successfully");
|
|
15931
15971
|
const practitionerService = new PractitionerService(this.db, this.auth, this.app);
|
|
15932
|
-
let
|
|
15972
|
+
let user = null;
|
|
15933
15973
|
try {
|
|
15934
|
-
|
|
15935
|
-
console.log("[AUTH] User document already exists:",
|
|
15974
|
+
user = await this.userService.getUserById(firebaseUser.uid);
|
|
15975
|
+
console.log("[AUTH] User document already exists:", user.uid);
|
|
15936
15976
|
} catch (userError) {
|
|
15937
|
-
console.log("[AUTH] User document does not exist,
|
|
15977
|
+
console.log("[AUTH] User document does not exist, creating it...");
|
|
15938
15978
|
}
|
|
15939
|
-
|
|
15940
|
-
console.log("[AUTH]
|
|
15941
|
-
|
|
15942
|
-
|
|
15943
|
-
|
|
15944
|
-
|
|
15945
|
-
|
|
15946
|
-
|
|
15947
|
-
|
|
15948
|
-
|
|
15949
|
-
|
|
15950
|
-
|
|
15951
|
-
|
|
15952
|
-
|
|
15953
|
-
|
|
15954
|
-
|
|
15955
|
-
|
|
15956
|
-
|
|
15957
|
-
|
|
15958
|
-
|
|
15959
|
-
|
|
15960
|
-
|
|
15961
|
-
|
|
15962
|
-
|
|
15963
|
-
|
|
15964
|
-
|
|
15965
|
-
|
|
15966
|
-
|
|
15967
|
-
|
|
15968
|
-
practitionerProfile: practitioner.id
|
|
15969
|
-
});
|
|
15970
|
-
}
|
|
15971
|
-
console.log("[AUTH] Transaction completed successfully");
|
|
15972
|
-
return { user, practitioner };
|
|
15973
|
-
});
|
|
15979
|
+
if (!user) {
|
|
15980
|
+
console.log("[AUTH] Creating user document for:", firebaseUser.uid);
|
|
15981
|
+
user = await this.userService.createUser(firebaseUser, ["practitioner" /* PRACTITIONER */], {
|
|
15982
|
+
skipProfileCreation: true
|
|
15983
|
+
});
|
|
15984
|
+
console.log("[AUTH] User document created successfully:", user.uid);
|
|
15985
|
+
}
|
|
15986
|
+
let practitioner;
|
|
15987
|
+
if (practitionerIds.length === 1) {
|
|
15988
|
+
console.log("[AUTH] Claiming single draft profile:", practitionerIds[0]);
|
|
15989
|
+
practitioner = await practitionerService.claimDraftProfileWithGoogle(
|
|
15990
|
+
practitionerIds[0],
|
|
15991
|
+
firebaseUser.uid
|
|
15992
|
+
);
|
|
15993
|
+
} else {
|
|
15994
|
+
console.log("[AUTH] Claiming multiple draft profiles:", practitionerIds);
|
|
15995
|
+
practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
|
|
15996
|
+
practitionerIds,
|
|
15997
|
+
firebaseUser.uid
|
|
15998
|
+
);
|
|
15999
|
+
}
|
|
16000
|
+
console.log("[AUTH] Draft profiles claimed:", practitioner.id);
|
|
16001
|
+
if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
|
|
16002
|
+
console.log("[AUTH] Linking practitioner to user");
|
|
16003
|
+
await this.userService.updateUser(firebaseUser.uid, {
|
|
16004
|
+
practitionerProfile: practitioner.id
|
|
16005
|
+
});
|
|
16006
|
+
}
|
|
16007
|
+
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
15974
16008
|
console.log("[AUTH] Draft profiles claimed successfully", {
|
|
15975
|
-
userId:
|
|
15976
|
-
practitionerId:
|
|
16009
|
+
userId: updatedUser.uid,
|
|
16010
|
+
practitionerId: practitioner.id
|
|
15977
16011
|
});
|
|
15978
|
-
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
15979
16012
|
return {
|
|
15980
16013
|
user: updatedUser,
|
|
15981
|
-
practitioner
|
|
16014
|
+
practitioner
|
|
15982
16015
|
};
|
|
15983
16016
|
} catch (error) {
|
|
15984
16017
|
console.error("[AUTH] Error claiming draft profiles with Google:", error);
|
package/dist/index.mjs
CHANGED
|
@@ -12929,6 +12929,23 @@ var UserService = class extends BaseService {
|
|
|
12929
12929
|
* Kreira novog korisnika na osnovu Firebase korisnika
|
|
12930
12930
|
*/
|
|
12931
12931
|
async createUser(firebaseUser, roles = ["patient" /* PATIENT */], options) {
|
|
12932
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
12933
|
+
console.log("[USER_SERVICE] ====== CREATE USER DEBUG ======");
|
|
12934
|
+
console.log("[USER_SERVICE] Current auth state:", {
|
|
12935
|
+
currentUser: ((_b = (_a = this.auth) == null ? void 0 : _a.currentUser) == null ? void 0 : _b.uid) || "NULL",
|
|
12936
|
+
currentUserEmail: ((_d = (_c = this.auth) == null ? void 0 : _c.currentUser) == null ? void 0 : _d.email) || "NULL",
|
|
12937
|
+
currentUserProvider: ((_f = (_e = this.auth) == null ? void 0 : _e.currentUser) == null ? void 0 : _f.providerId) || "NULL"
|
|
12938
|
+
});
|
|
12939
|
+
console.log("[USER_SERVICE] Firebase user passed to createUser:", {
|
|
12940
|
+
uid: (firebaseUser == null ? void 0 : firebaseUser.uid) || "NULL",
|
|
12941
|
+
email: (firebaseUser == null ? void 0 : firebaseUser.email) || "NULL",
|
|
12942
|
+
providerId: (firebaseUser == null ? void 0 : firebaseUser.providerId) || "NULL",
|
|
12943
|
+
isAnonymous: firebaseUser == null ? void 0 : firebaseUser.isAnonymous
|
|
12944
|
+
});
|
|
12945
|
+
console.log("[USER_SERVICE] Auth instances match:", ((_h = (_g = this.auth) == null ? void 0 : _g.currentUser) == null ? void 0 : _h.uid) === (firebaseUser == null ? void 0 : firebaseUser.uid));
|
|
12946
|
+
console.log("[USER_SERVICE] Document path:", `${USERS_COLLECTION}/${firebaseUser == null ? void 0 : firebaseUser.uid}`);
|
|
12947
|
+
console.log("[USER_SERVICE] Roles:", roles);
|
|
12948
|
+
console.log("[USER_SERVICE] ================================");
|
|
12932
12949
|
const userData = {
|
|
12933
12950
|
uid: firebaseUser.uid,
|
|
12934
12951
|
email: firebaseUser.email,
|
|
@@ -12938,7 +12955,22 @@ var UserService = class extends BaseService {
|
|
|
12938
12955
|
updatedAt: serverTimestamp18(),
|
|
12939
12956
|
lastLoginAt: serverTimestamp18()
|
|
12940
12957
|
};
|
|
12941
|
-
|
|
12958
|
+
console.log("[USER_SERVICE] Attempting setDoc with userData:", {
|
|
12959
|
+
uid: userData.uid,
|
|
12960
|
+
email: userData.email,
|
|
12961
|
+
roles: userData.roles
|
|
12962
|
+
});
|
|
12963
|
+
try {
|
|
12964
|
+
await setDoc12(doc21(this.db, USERS_COLLECTION, userData.uid), userData);
|
|
12965
|
+
console.log("[USER_SERVICE] \u2705 setDoc SUCCEEDED for:", userData.uid);
|
|
12966
|
+
} catch (error) {
|
|
12967
|
+
console.error("[USER_SERVICE] \u274C setDoc FAILED:", {
|
|
12968
|
+
errorCode: error == null ? void 0 : error.code,
|
|
12969
|
+
errorMessage: error == null ? void 0 : error.message,
|
|
12970
|
+
uid: userData.uid
|
|
12971
|
+
});
|
|
12972
|
+
throw error;
|
|
12973
|
+
}
|
|
12942
12974
|
if (options == null ? void 0 : options.skipProfileCreation) {
|
|
12943
12975
|
return this.getUserById(userData.uid);
|
|
12944
12976
|
}
|
|
@@ -15997,9 +16029,9 @@ var AuthService = class extends BaseService {
|
|
|
15997
16029
|
}
|
|
15998
16030
|
/**
|
|
15999
16031
|
* Claims draft practitioner profiles after Google Sign-In.
|
|
16000
|
-
*
|
|
16032
|
+
* Uses the current authenticated user (from initial Google Sign-In).
|
|
16001
16033
|
*
|
|
16002
|
-
* @param idToken - The Google ID token
|
|
16034
|
+
* @param idToken - The Google ID token (used to re-authenticate if needed)
|
|
16003
16035
|
* @param practitionerIds - Array of draft practitioner profile IDs to claim
|
|
16004
16036
|
* @returns Object containing user and claimed practitioner
|
|
16005
16037
|
*/
|
|
@@ -16012,60 +16044,61 @@ var AuthService = class extends BaseService {
|
|
|
16012
16044
|
if (practitionerIds.length === 0) {
|
|
16013
16045
|
throw new AuthError("No practitioner profiles selected to claim", "AUTH/NO_PROFILES_SELECTED", 400);
|
|
16014
16046
|
}
|
|
16015
|
-
|
|
16016
|
-
|
|
16017
|
-
|
|
16047
|
+
let firebaseUser = this.auth.currentUser;
|
|
16048
|
+
if (!firebaseUser) {
|
|
16049
|
+
console.log("[AUTH] No current user, re-authenticating with Google credential");
|
|
16050
|
+
const credential = GoogleAuthProvider.credential(idToken);
|
|
16051
|
+
const result = await signInWithCredential(this.auth, credential);
|
|
16052
|
+
firebaseUser = result.user;
|
|
16053
|
+
}
|
|
16054
|
+
console.log("[AUTH] Using Firebase user:", firebaseUser.uid);
|
|
16055
|
+
console.log("[AUTH] Forcing token refresh...");
|
|
16056
|
+
await firebaseUser.getIdToken(true);
|
|
16057
|
+
console.log("[AUTH] Token refreshed successfully");
|
|
16018
16058
|
const practitionerService = new PractitionerService(this.db, this.auth, this.app);
|
|
16019
|
-
let
|
|
16059
|
+
let user = null;
|
|
16020
16060
|
try {
|
|
16021
|
-
|
|
16022
|
-
console.log("[AUTH] User document already exists:",
|
|
16061
|
+
user = await this.userService.getUserById(firebaseUser.uid);
|
|
16062
|
+
console.log("[AUTH] User document already exists:", user.uid);
|
|
16023
16063
|
} catch (userError) {
|
|
16024
|
-
console.log("[AUTH] User document does not exist,
|
|
16064
|
+
console.log("[AUTH] User document does not exist, creating it...");
|
|
16025
16065
|
}
|
|
16026
|
-
|
|
16027
|
-
console.log("[AUTH]
|
|
16028
|
-
|
|
16029
|
-
|
|
16030
|
-
|
|
16031
|
-
|
|
16032
|
-
|
|
16033
|
-
|
|
16034
|
-
|
|
16035
|
-
|
|
16036
|
-
|
|
16037
|
-
|
|
16038
|
-
|
|
16039
|
-
|
|
16040
|
-
|
|
16041
|
-
|
|
16042
|
-
|
|
16043
|
-
|
|
16044
|
-
|
|
16045
|
-
|
|
16046
|
-
|
|
16047
|
-
|
|
16048
|
-
|
|
16049
|
-
|
|
16050
|
-
|
|
16051
|
-
|
|
16052
|
-
|
|
16053
|
-
|
|
16054
|
-
|
|
16055
|
-
practitionerProfile: practitioner.id
|
|
16056
|
-
});
|
|
16057
|
-
}
|
|
16058
|
-
console.log("[AUTH] Transaction completed successfully");
|
|
16059
|
-
return { user, practitioner };
|
|
16060
|
-
});
|
|
16066
|
+
if (!user) {
|
|
16067
|
+
console.log("[AUTH] Creating user document for:", firebaseUser.uid);
|
|
16068
|
+
user = await this.userService.createUser(firebaseUser, ["practitioner" /* PRACTITIONER */], {
|
|
16069
|
+
skipProfileCreation: true
|
|
16070
|
+
});
|
|
16071
|
+
console.log("[AUTH] User document created successfully:", user.uid);
|
|
16072
|
+
}
|
|
16073
|
+
let practitioner;
|
|
16074
|
+
if (practitionerIds.length === 1) {
|
|
16075
|
+
console.log("[AUTH] Claiming single draft profile:", practitionerIds[0]);
|
|
16076
|
+
practitioner = await practitionerService.claimDraftProfileWithGoogle(
|
|
16077
|
+
practitionerIds[0],
|
|
16078
|
+
firebaseUser.uid
|
|
16079
|
+
);
|
|
16080
|
+
} else {
|
|
16081
|
+
console.log("[AUTH] Claiming multiple draft profiles:", practitionerIds);
|
|
16082
|
+
practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
|
|
16083
|
+
practitionerIds,
|
|
16084
|
+
firebaseUser.uid
|
|
16085
|
+
);
|
|
16086
|
+
}
|
|
16087
|
+
console.log("[AUTH] Draft profiles claimed:", practitioner.id);
|
|
16088
|
+
if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
|
|
16089
|
+
console.log("[AUTH] Linking practitioner to user");
|
|
16090
|
+
await this.userService.updateUser(firebaseUser.uid, {
|
|
16091
|
+
practitionerProfile: practitioner.id
|
|
16092
|
+
});
|
|
16093
|
+
}
|
|
16094
|
+
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
16061
16095
|
console.log("[AUTH] Draft profiles claimed successfully", {
|
|
16062
|
-
userId:
|
|
16063
|
-
practitionerId:
|
|
16096
|
+
userId: updatedUser.uid,
|
|
16097
|
+
practitionerId: practitioner.id
|
|
16064
16098
|
});
|
|
16065
|
-
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
16066
16099
|
return {
|
|
16067
16100
|
user: updatedUser,
|
|
16068
|
-
practitioner
|
|
16101
|
+
practitioner
|
|
16069
16102
|
};
|
|
16070
16103
|
} catch (error) {
|
|
16071
16104
|
console.error("[AUTH] Error claiming draft profiles with Google:", error);
|
package/package.json
CHANGED
|
@@ -813,9 +813,9 @@ export class AuthService extends BaseService {
|
|
|
813
813
|
|
|
814
814
|
/**
|
|
815
815
|
* Claims draft practitioner profiles after Google Sign-In.
|
|
816
|
-
*
|
|
816
|
+
* Uses the current authenticated user (from initial Google Sign-In).
|
|
817
817
|
*
|
|
818
|
-
* @param idToken - The Google ID token
|
|
818
|
+
* @param idToken - The Google ID token (used to re-authenticate if needed)
|
|
819
819
|
* @param practitionerIds - Array of draft practitioner profile IDs to claim
|
|
820
820
|
* @returns Object containing user and claimed practitioner
|
|
821
821
|
*/
|
|
@@ -836,77 +836,77 @@ export class AuthService extends BaseService {
|
|
|
836
836
|
throw new AuthError('No practitioner profiles selected to claim', 'AUTH/NO_PROFILES_SELECTED', 400);
|
|
837
837
|
}
|
|
838
838
|
|
|
839
|
-
//
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
839
|
+
// Check if user is currently signed in, if not re-authenticate
|
|
840
|
+
let firebaseUser = this.auth.currentUser;
|
|
841
|
+
if (!firebaseUser) {
|
|
842
|
+
console.log('[AUTH] No current user, re-authenticating with Google credential');
|
|
843
|
+
const credential = GoogleAuthProvider.credential(idToken);
|
|
844
|
+
const result = await signInWithCredential(this.auth, credential);
|
|
845
|
+
firebaseUser = result.user;
|
|
846
|
+
}
|
|
847
|
+
console.log('[AUTH] Using Firebase user:', firebaseUser.uid);
|
|
848
|
+
|
|
849
|
+
// Force token refresh to ensure Firestore has fresh auth context
|
|
850
|
+
console.log('[AUTH] Forcing token refresh...');
|
|
851
|
+
await firebaseUser.getIdToken(true);
|
|
852
|
+
console.log('[AUTH] Token refreshed successfully');
|
|
843
853
|
|
|
844
854
|
const practitionerService = new PractitionerService(this.db, this.auth, this.app);
|
|
845
855
|
|
|
846
|
-
// Check if User document already exists
|
|
847
|
-
let
|
|
856
|
+
// Step 1: Check if User document already exists
|
|
857
|
+
let user: User | null = null;
|
|
848
858
|
try {
|
|
849
|
-
|
|
850
|
-
console.log('[AUTH] User document already exists:',
|
|
859
|
+
user = await this.userService.getUserById(firebaseUser.uid);
|
|
860
|
+
console.log('[AUTH] User document already exists:', user.uid);
|
|
851
861
|
} catch (userError) {
|
|
852
|
-
console.log('[AUTH] User document does not exist,
|
|
862
|
+
console.log('[AUTH] User document does not exist, creating it...');
|
|
853
863
|
}
|
|
854
864
|
|
|
855
|
-
//
|
|
856
|
-
|
|
857
|
-
console.log('[AUTH]
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
} else {
|
|
864
|
-
console.log('[AUTH] Creating user document');
|
|
865
|
-
user = await this.userService.createUser(firebaseUser, [UserRole.PRACTITIONER], {
|
|
866
|
-
skipProfileCreation: true,
|
|
867
|
-
});
|
|
868
|
-
console.log('[AUTH] User document created:', user.uid);
|
|
869
|
-
}
|
|
865
|
+
// Step 2: Create User document if it doesn't exist (NOT in transaction - matches token flow)
|
|
866
|
+
if (!user) {
|
|
867
|
+
console.log('[AUTH] Creating user document for:', firebaseUser.uid);
|
|
868
|
+
user = await this.userService.createUser(firebaseUser, [UserRole.PRACTITIONER], {
|
|
869
|
+
skipProfileCreation: true,
|
|
870
|
+
});
|
|
871
|
+
console.log('[AUTH] User document created successfully:', user.uid);
|
|
872
|
+
}
|
|
870
873
|
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
874
|
+
// Step 3: Claim the draft profiles
|
|
875
|
+
let practitioner: Practitioner;
|
|
876
|
+
if (practitionerIds.length === 1) {
|
|
877
|
+
console.log('[AUTH] Claiming single draft profile:', practitionerIds[0]);
|
|
878
|
+
practitioner = await practitionerService.claimDraftProfileWithGoogle(
|
|
879
|
+
practitionerIds[0],
|
|
880
|
+
firebaseUser.uid
|
|
881
|
+
);
|
|
882
|
+
} else {
|
|
883
|
+
console.log('[AUTH] Claiming multiple draft profiles:', practitionerIds);
|
|
884
|
+
practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
|
|
885
|
+
practitionerIds,
|
|
886
|
+
firebaseUser.uid
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
console.log('[AUTH] Draft profiles claimed:', practitioner.id);
|
|
886
890
|
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
891
|
+
// Step 4: Link practitioner to user
|
|
892
|
+
if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
|
|
893
|
+
console.log('[AUTH] Linking practitioner to user');
|
|
894
|
+
await this.userService.updateUser(firebaseUser.uid, {
|
|
895
|
+
practitionerProfile: practitioner.id,
|
|
896
|
+
});
|
|
897
|
+
}
|
|
894
898
|
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
});
|
|
899
|
+
// Fetch updated user (with practitionerProfile reference)
|
|
900
|
+
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
898
901
|
|
|
899
902
|
console.log('[AUTH] Draft profiles claimed successfully', {
|
|
900
|
-
userId:
|
|
901
|
-
practitionerId:
|
|
903
|
+
userId: updatedUser.uid,
|
|
904
|
+
practitionerId: practitioner.id,
|
|
902
905
|
});
|
|
903
906
|
|
|
904
|
-
// Fetch updated user (with practitionerProfile reference)
|
|
905
|
-
const updatedUser = await this.userService.getUserById(firebaseUser.uid);
|
|
906
|
-
|
|
907
907
|
return {
|
|
908
908
|
user: updatedUser,
|
|
909
|
-
practitioner
|
|
909
|
+
practitioner,
|
|
910
910
|
};
|
|
911
911
|
} catch (error: any) {
|
|
912
912
|
console.error('[AUTH] Error claiming draft profiles with Google:', error);
|
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
Timestamp,
|
|
12
12
|
setDoc,
|
|
13
13
|
serverTimestamp,
|
|
14
|
-
FieldValue,
|
|
15
14
|
} from 'firebase/firestore';
|
|
16
15
|
import { initializeFirebase } from '../../config/firebase';
|
|
17
16
|
import { User, UserRole, USERS_COLLECTION, CreateUserData } from '../../types';
|
|
@@ -90,6 +89,24 @@ export class UserService extends BaseService {
|
|
|
90
89
|
skipProfileCreation?: boolean;
|
|
91
90
|
},
|
|
92
91
|
): Promise<User> {
|
|
92
|
+
// DEBUG LOGGING - Check auth state before creating user document
|
|
93
|
+
console.log('[USER_SERVICE] ====== CREATE USER DEBUG ======');
|
|
94
|
+
console.log('[USER_SERVICE] Current auth state:', {
|
|
95
|
+
currentUser: this.auth?.currentUser?.uid || 'NULL',
|
|
96
|
+
currentUserEmail: this.auth?.currentUser?.email || 'NULL',
|
|
97
|
+
currentUserProvider: this.auth?.currentUser?.providerId || 'NULL',
|
|
98
|
+
});
|
|
99
|
+
console.log('[USER_SERVICE] Firebase user passed to createUser:', {
|
|
100
|
+
uid: firebaseUser?.uid || 'NULL',
|
|
101
|
+
email: firebaseUser?.email || 'NULL',
|
|
102
|
+
providerId: firebaseUser?.providerId || 'NULL',
|
|
103
|
+
isAnonymous: firebaseUser?.isAnonymous,
|
|
104
|
+
});
|
|
105
|
+
console.log('[USER_SERVICE] Auth instances match:', this.auth?.currentUser?.uid === firebaseUser?.uid);
|
|
106
|
+
console.log('[USER_SERVICE] Document path:', `${USERS_COLLECTION}/${firebaseUser?.uid}`);
|
|
107
|
+
console.log('[USER_SERVICE] Roles:', roles);
|
|
108
|
+
console.log('[USER_SERVICE] ================================');
|
|
109
|
+
|
|
93
110
|
const userData: CreateUserData = {
|
|
94
111
|
uid: firebaseUser.uid,
|
|
95
112
|
email: firebaseUser.email,
|
|
@@ -100,8 +117,24 @@ export class UserService extends BaseService {
|
|
|
100
117
|
lastLoginAt: serverTimestamp(),
|
|
101
118
|
};
|
|
102
119
|
|
|
120
|
+
console.log('[USER_SERVICE] Attempting setDoc with userData:', {
|
|
121
|
+
uid: userData.uid,
|
|
122
|
+
email: userData.email,
|
|
123
|
+
roles: userData.roles,
|
|
124
|
+
});
|
|
125
|
+
|
|
103
126
|
// Kreiramo osnovnog korisnika
|
|
104
|
-
|
|
127
|
+
try {
|
|
128
|
+
await setDoc(doc(this.db, USERS_COLLECTION, userData.uid), userData);
|
|
129
|
+
console.log('[USER_SERVICE] ✅ setDoc SUCCEEDED for:', userData.uid);
|
|
130
|
+
} catch (error: any) {
|
|
131
|
+
console.error('[USER_SERVICE] ❌ setDoc FAILED:', {
|
|
132
|
+
errorCode: error?.code,
|
|
133
|
+
errorMessage: error?.message,
|
|
134
|
+
uid: userData.uid,
|
|
135
|
+
});
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
105
138
|
|
|
106
139
|
// Kreiramo odgovarajuće profile na osnovu rola
|
|
107
140
|
if (options?.skipProfileCreation) {
|