Skip to content

Commit

Permalink
Modified Modify User and Delete User
Browse files Browse the repository at this point in the history
  • Loading branch information
TOPOFGR committed May 25, 2020
1 parent 0fd917a commit 8f7c824
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 317 deletions.
3 changes: 1 addition & 2 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
build/*
functions/*
build/*
9 changes: 9 additions & 0 deletions functions/db/users/onDelete.function.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const functions = require('firebase-functions');
const admin = require('firebase-admin');

export default functions.database
.ref('users/{uid}')
.onDelete((snapshot, context) => {
const { uid } = context.params;
return admin.auth().deleteUser(uid);
});
20 changes: 20 additions & 0 deletions functions/db/users/onUpdate.function.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const functions = require('firebase-functions');
const admin = require('firebase-admin');

export default functions.database
.ref('/users/{uid}')
.onUpdate((change, context) => {
const before = change.before.val();
const after = change.after.val();
const { isAdmin } = after;

if (before.isAdmin === isAdmin) {
return null;
}

const { uid } = context.params;

return admin.auth().setCustomUserClaims(uid, {
isAdmin
});
});
160 changes: 0 additions & 160 deletions functions/requests/routes/users.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,9 @@
const express = require('express');
const admin = require('firebase-admin');
const cors = require('cors')({ origin: true });
const Busboy = require('busboy');
const path = require('path');
const os = require('os');
const fs = require('fs');
const uuid = require('uuid/v4');

const router = express.Router();

const { storageBucket } = JSON.parse(process.env.FIREBASE_CONFIG);

const bucket = admin.storage().bucket(storageBucket);

const uploadImageToBucket = async uploadedImage => {
return bucket.upload(uploadedImage.file, {
uploadMedia: 'media',
metada: {
metadata: {
contentType: uploadedImage.type
}
},
public: true
});
};

const createUserAuth = async (email, isAdmin) => {
const { uid } = await admin.auth().createUser({ email, password: uuid() });

Expand Down Expand Up @@ -53,143 +32,4 @@ router.post('/', async (request, response) => {
return response.status(200).json({ uid });
});

router.delete('/:id', async (request, response) => {
const { id } = request.params;

const userRef = admin.database().ref(`users/${id}`);

const logoUrl = (await userRef.child('logoUrl').once('value')).val();

let removeLogo = Promise.resolve();

if (logoUrl) {
const fileName = logoUrl.split('/').pop();

removeLogo = bucket.file(fileName).delete();
}

const removeUserDb = userRef.remove();

const removeUserAuth = admin.auth().deleteUser(id);

try {
await Promise.all([removeUserDb, removeUserAuth, removeLogo]);
} catch (error) {
console.error(error);
return response.status(500).json({ error });
}

return response.status(200).json({});
});

const modifyUserAuth = (userId, isAdmin) => {
return admin.auth().setCustomUserClaims(userId, {
isAdmin
});
};

const modifyUserDb = (name, location, createdAt, isAdmin, logoUrl, userId) => {
let params = { name, location, createdAt, isAdmin };

if (logoUrl) params['logoUrl'] = logoUrl;

return admin
.database()
.ref(`users/${userId}`)
.update({ ...params });
};

const removeOldLogo = async userId => {
const url = (
await admin
.database()
.ref(`users/${userId}`)
.child('logoUrl')
.once('value')
).val();

if (url) {
const fileName = url.split('/').pop();
console.log('filename', fileName);
return bucket.file(fileName).delete();
} else {
return Promise.resolve();
}
};

router.patch('/:id', (request, response) => {
cors(request, response, () => {
const busboy = new Busboy({ headers: request.headers });

let uploadedImage = null;

let fieldData = {};

busboy.on('field', (fieldName, value) => {
fieldData = { ...fieldData, [`${fieldName}`]: value };
});

busboy.on('file', (fieldName, file, fileName, encoding, mimetype) => {
const filepath = path.join(os.tmpdir(), fileName);

uploadedImage = { file: filepath, type: mimetype, fileName };

file.pipe(fs.createWriteStream(filepath));
});

busboy.on('finish', async () => {
const { name, location, createdAt } = fieldData;

const isAdmin = JSON.parse(fieldData.isAdmin);

const { id } = request.params;

const setUserClaims = modifyUserAuth(id, isAdmin);

let removeLogo = Promise.resolve();
let uploadImage = Promise.resolve();

if (uploadedImage) {
removeLogo = removeOldLogo(id);
uploadImage = uploadImageToBucket(uploadedImage);
}

await removeLogo;

let logoUrl = null;

if (uploadedImage) {
logoUrl = `https://storage.googleapis.com/${bucket.name}/${uploadedImage.fileName}`;
}

const modifyUser = modifyUserDb(
name,
location,
createdAt,
isAdmin,
logoUrl,
id
);

try {
await Promise.all([modifyUser, setUserClaims, uploadImage]);
} catch (error) {
console.error(error);
return response.status(500).json({ error });
}

return response.status(201).json({
id,
name,
location,
logoUrl,
isAdmin,
createdAt
});
});

busboy.end(request.rawBody);
});
});

module.exports = router;
85 changes: 0 additions & 85 deletions functions/storage/onFinalize.function.js

This file was deleted.

Loading

0 comments on commit 8f7c824

Please sign in to comment.