mirror of
https://github.com/urosran/cally.git
synced 2025-07-10 07:07:16 +00:00
81 lines
3.0 KiB
JavaScript
81 lines
3.0 KiB
JavaScript
const {onRequest} = require("firebase-functions/v2/https");
|
|
const {getAuth} = require("firebase-admin/auth");
|
|
const {getFirestore} = require("firebase-admin/firestore");
|
|
const admin = require("firebase-admin");
|
|
const logger = require("firebase-functions/logger");
|
|
|
|
try {
|
|
admin.initializeApp();
|
|
} catch (error) {
|
|
console.error(error)
|
|
}
|
|
|
|
exports.createSubUser = onRequest(async (request, response) => {
|
|
const authHeader = request.get('Authorization');
|
|
|
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
logger.warn("Missing or incorrect Authorization header", {authHeader});
|
|
response.status(401).json({error: 'Unauthorized'});
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const token = authHeader.split('Bearer ')[1];
|
|
logger.info("Verifying ID token", {token});
|
|
|
|
let decodedToken;
|
|
try {
|
|
decodedToken = await getAuth().verifyIdToken(token);
|
|
logger.info("ID token verified successfully", {uid: decodedToken.uid});
|
|
} catch (verifyError) {
|
|
logger.error("ID token verification failed", {error: verifyError.message});
|
|
response.status(401).json({error: 'Unauthorized: Invalid token'});
|
|
return;
|
|
}
|
|
|
|
logger.info("Processing user creation", {requestBody: request.body.data});
|
|
|
|
const {userType, firstName, lastName, email, password} = request.body.data;
|
|
|
|
if (!email || !password || !firstName || !lastName || !userType) {
|
|
logger.warn("Missing required fields in request body", {requestBody: request.body.data});
|
|
response.status(400).json({error: "Missing required fields"});
|
|
return;
|
|
}
|
|
|
|
let userRecord;
|
|
try {
|
|
userRecord = await getAuth().createUser({
|
|
email, password, displayName: `${firstName} ${lastName}`,
|
|
});
|
|
logger.info("User record created", {userId: userRecord.uid});
|
|
} catch (createUserError) {
|
|
logger.error("User creation failed", {error: createUserError.message});
|
|
response.status(500).json({error: "Failed to create user"});
|
|
return;
|
|
}
|
|
|
|
const userProfile = {
|
|
userType, name: `${firstName} ${lastName}`, email, uid: userRecord.uid,
|
|
};
|
|
|
|
try {
|
|
await getFirestore().collection("Profiles").doc(userRecord.uid).set(userProfile);
|
|
logger.info("User profile saved to Firestore", {userId: userRecord.uid});
|
|
} catch (firestoreError) {
|
|
logger.error("Failed to save user profile to Firestore", {error: firestoreError.message});
|
|
response.status(500).json({error: "Failed to save user profile"});
|
|
return;
|
|
}
|
|
|
|
response.status(200).json({
|
|
data: {
|
|
message: "User created successfully", userId: userRecord.uid,
|
|
}
|
|
});
|
|
} catch (error) {
|
|
logger.error("Error in createSubUser function", {error: error.message});
|
|
response.status(500).json({data: {error: error.message}});
|
|
}
|
|
});
|