@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 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
- * Similar to the token flow - creates User document and claims profiles in one transaction.
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
- * Similar to the token flow - creates User document and claims profiles in one transaction.
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
- await (0, import_firestore33.setDoc)((0, import_firestore33.doc)(this.db, USERS_COLLECTION, userData.uid), userData);
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
- * Similar to the token flow - creates User document and claims profiles in one transaction.
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
- const credential = import_auth8.GoogleAuthProvider.credential(idToken);
15929
- const { user: firebaseUser } = await (0, import_auth8.signInWithCredential)(this.auth, credential);
15930
- console.log("[AUTH] Signed in with Google:", firebaseUser.uid);
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 existingUser = null;
15972
+ let user = null;
15933
15973
  try {
15934
- existingUser = await this.userService.getUserById(firebaseUser.uid);
15935
- console.log("[AUTH] User document already exists:", existingUser.uid);
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, will create it");
15977
+ console.log("[AUTH] User document does not exist, creating it...");
15938
15978
  }
15939
- const transactionResult = await (0, import_firestore40.runTransaction)(this.db, async () => {
15940
- console.log("[AUTH] Transaction started - creating user and claiming profiles");
15941
- let user;
15942
- if (existingUser) {
15943
- user = existingUser;
15944
- } else {
15945
- console.log("[AUTH] Creating user document");
15946
- user = await this.userService.createUser(firebaseUser, ["practitioner" /* PRACTITIONER */], {
15947
- skipProfileCreation: true
15948
- });
15949
- console.log("[AUTH] User document created:", user.uid);
15950
- }
15951
- let practitioner;
15952
- if (practitionerIds.length === 1) {
15953
- console.log("[AUTH] Claiming single draft profile");
15954
- practitioner = await practitionerService.claimDraftProfileWithGoogle(
15955
- practitionerIds[0],
15956
- firebaseUser.uid
15957
- );
15958
- } else {
15959
- console.log("[AUTH] Claiming multiple draft profiles");
15960
- practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
15961
- practitionerIds,
15962
- firebaseUser.uid
15963
- );
15964
- }
15965
- if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
15966
- console.log("[AUTH] Linking practitioner to user");
15967
- await this.userService.updateUser(firebaseUser.uid, {
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: transactionResult.user.uid,
15976
- practitionerId: transactionResult.practitioner.id
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: transactionResult.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
- await setDoc12(doc21(this.db, USERS_COLLECTION, userData.uid), userData);
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
- * Similar to the token flow - creates User document and claims profiles in one transaction.
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
- const credential = GoogleAuthProvider.credential(idToken);
16016
- const { user: firebaseUser } = await signInWithCredential(this.auth, credential);
16017
- console.log("[AUTH] Signed in with Google:", firebaseUser.uid);
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 existingUser = null;
16059
+ let user = null;
16020
16060
  try {
16021
- existingUser = await this.userService.getUserById(firebaseUser.uid);
16022
- console.log("[AUTH] User document already exists:", existingUser.uid);
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, will create it");
16064
+ console.log("[AUTH] User document does not exist, creating it...");
16025
16065
  }
16026
- const transactionResult = await runTransaction(this.db, async () => {
16027
- console.log("[AUTH] Transaction started - creating user and claiming profiles");
16028
- let user;
16029
- if (existingUser) {
16030
- user = existingUser;
16031
- } else {
16032
- console.log("[AUTH] Creating user document");
16033
- user = await this.userService.createUser(firebaseUser, ["practitioner" /* PRACTITIONER */], {
16034
- skipProfileCreation: true
16035
- });
16036
- console.log("[AUTH] User document created:", user.uid);
16037
- }
16038
- let practitioner;
16039
- if (practitionerIds.length === 1) {
16040
- console.log("[AUTH] Claiming single draft profile");
16041
- practitioner = await practitionerService.claimDraftProfileWithGoogle(
16042
- practitionerIds[0],
16043
- firebaseUser.uid
16044
- );
16045
- } else {
16046
- console.log("[AUTH] Claiming multiple draft profiles");
16047
- practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
16048
- practitionerIds,
16049
- firebaseUser.uid
16050
- );
16051
- }
16052
- if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
16053
- console.log("[AUTH] Linking practitioner to user");
16054
- await this.userService.updateUser(firebaseUser.uid, {
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: transactionResult.user.uid,
16063
- practitionerId: transactionResult.practitioner.id
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: transactionResult.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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@blackcode_sa/metaestetics-api",
3
3
  "private": false,
4
- "version": "1.14.4",
4
+ "version": "1.14.6",
5
5
  "description": "Firebase authentication service with anonymous upgrade support",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.mjs",
@@ -813,9 +813,9 @@ export class AuthService extends BaseService {
813
813
 
814
814
  /**
815
815
  * Claims draft practitioner profiles after Google Sign-In.
816
- * Similar to the token flow - creates User document and claims profiles in one transaction.
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
- // Sign in with Google credential
840
- const credential = GoogleAuthProvider.credential(idToken);
841
- const { user: firebaseUser } = await signInWithCredential(this.auth, credential);
842
- console.log('[AUTH] Signed in with Google:', firebaseUser.uid);
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 existingUser: User | null = null;
856
+ // Step 1: Check if User document already exists
857
+ let user: User | null = null;
848
858
  try {
849
- existingUser = await this.userService.getUserById(firebaseUser.uid);
850
- console.log('[AUTH] User document already exists:', existingUser.uid);
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, will create it');
862
+ console.log('[AUTH] User document does not exist, creating it...');
853
863
  }
854
864
 
855
- // Execute all operations in a transaction (similar to token flow)
856
- const transactionResult = await runTransaction(this.db, async () => {
857
- console.log('[AUTH] Transaction started - creating user and claiming profiles');
858
-
859
- // Create user document if it doesn't exist
860
- let user: User;
861
- if (existingUser) {
862
- user = existingUser;
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
- // Claim the draft profiles
872
- let practitioner: Practitioner;
873
- if (practitionerIds.length === 1) {
874
- console.log('[AUTH] Claiming single draft profile');
875
- practitioner = await practitionerService.claimDraftProfileWithGoogle(
876
- practitionerIds[0],
877
- firebaseUser.uid
878
- );
879
- } else {
880
- console.log('[AUTH] Claiming multiple draft profiles');
881
- practitioner = await practitionerService.claimMultipleDraftProfilesWithGoogle(
882
- practitionerIds,
883
- firebaseUser.uid
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
- // Link practitioner to user (if not already linked)
888
- if (!user.practitionerProfile || user.practitionerProfile !== practitioner.id) {
889
- console.log('[AUTH] Linking practitioner to user');
890
- await this.userService.updateUser(firebaseUser.uid, {
891
- practitionerProfile: practitioner.id,
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
- console.log('[AUTH] Transaction completed successfully');
896
- return { user, practitioner };
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: transactionResult.user.uid,
901
- practitionerId: transactionResult.practitioner.id,
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: transactionResult.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
- await setDoc(doc(this.db, USERS_COLLECTION, userData.uid), userData);
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) {