Skip to content

Commit 0fd917a

Browse files
committed
Modified create user and image resize
1 parent 5d62cd8 commit 0fd917a

File tree

5 files changed

+100
-154
lines changed

5 files changed

+100
-154
lines changed

database.rules.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
".write": "auth !== null && auth.token.email_verified === true && ((auth.token.isAdmin === true && data.child('isAdmin').val() === false) || auth.uid === $user)",
66
".read": "auth !== null && auth.token.email_verified === true && ((auth.token.isAdmin === true && data.child('isAdmin').val() === false) || auth.uid === $user)"
77
},
8+
".write": "auth !== null && auth.token.email_verified === true && auth.token.isAdmin === true",
89
".read": "auth !== null && auth.token.email_verified === true && auth.token.isAdmin === true"
910
}
1011
}

functions/requests/routes/users.js

Lines changed: 16 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const Busboy = require('busboy');
55
const path = require('path');
66
const os = require('os');
77
const fs = require('fs');
8+
const uuid = require('uuid/v4');
89

910
const router = express.Router();
1011

@@ -24,8 +25,8 @@ const uploadImageToBucket = async uploadedImage => {
2425
});
2526
};
2627

27-
const createUserAuth = async (email, password, isAdmin) => {
28-
const { uid } = await admin.auth().createUser({ email, password });
28+
const createUserAuth = async (email, isAdmin) => {
29+
const { uid } = await admin.auth().createUser({ email, password: uuid() });
2930

3031
await admin.auth().setCustomUserClaims(uid, {
3132
isAdmin
@@ -34,114 +35,22 @@ const createUserAuth = async (email, password, isAdmin) => {
3435
return uid;
3536
};
3637

37-
const createUserOnDb = async (
38-
name,
39-
email,
40-
location,
41-
logoUrl,
42-
userId,
43-
createdAt,
44-
isAdmin
45-
) => {
46-
const userData = {
47-
name,
48-
email,
49-
location,
50-
logoUrl,
51-
createdAt,
52-
isAdmin
53-
};
54-
55-
const response = await admin
56-
.database()
57-
.ref(`users/${userId}`)
58-
.set({ ...userData });
59-
60-
return response;
61-
};
62-
63-
router.post('/', (request, response) => {
64-
cors(request, response, () => {
65-
const busboy = new Busboy({ headers: request.headers });
66-
67-
let uploadedImage = null;
68-
69-
let fieldData = {};
70-
71-
busboy.on('field', (fieldName, value) => {
72-
fieldData = { ...fieldData, [`${fieldName}`]: value };
73-
});
74-
75-
busboy.on('file', (fieldName, file, fileName, encoding, mimetype) => {
76-
const filepath = path.join(os.tmpdir(), fileName);
77-
78-
uploadedImage = { file: filepath, type: mimetype, fileName };
79-
80-
file.pipe(fs.createWriteStream(filepath));
81-
});
82-
83-
busboy.on('finish', async () => {
84-
const { name, email, password, location, createdAt } = fieldData;
85-
86-
const isAdmin = JSON.parse(fieldData.isAdmin);
38+
router.post('/', async (request, response) => {
39+
const { email, isAdmin } = request.body;
8740

88-
let id;
89-
90-
try {
91-
console.log('Creating user in auth and setting custom claims');
92-
id = await createUserAuth(email, password, isAdmin);
93-
console.log('Created user auth and setting custom claims');
94-
} catch (error) {
95-
console.error(
96-
'Error while creating user in auth and setting custom claims',
97-
error
98-
);
99-
return response.status(500).json({ error });
100-
}
101-
102-
let logoUrl = null;
103-
104-
if (uploadedImage) {
105-
try {
106-
console.log('Uploading logo to bucket');
107-
await uploadImageToBucket(uploadedImage);
108-
logoUrl = `https://storage.googleapis.com/${bucket.name}/${uploadedImage.fileName}`;
109-
console.log('Uploaded logo to bucket', logoUrl);
110-
} catch (error) {
111-
console.error('Error while uploading image to bucket', error);
112-
return response.status(500).json({ error });
113-
}
114-
}
115-
116-
try {
117-
console.log('Creating user');
118-
await createUserOnDb(
119-
name,
120-
email,
121-
location,
122-
logoUrl,
123-
id,
124-
createdAt,
125-
isAdmin
126-
);
127-
console.log('Created user');
128-
} catch (error) {
129-
console.error('Error while creating user', error);
130-
return response.status(500).json({ error });
131-
}
41+
if (!email) {
42+
return response.status(400).json({ error: { code: 'auth/invalid-email' } });
43+
}
13244

133-
return response.status(201).json({
134-
id,
135-
name,
136-
location,
137-
email,
138-
logoUrl,
139-
isAdmin
140-
});
141-
});
45+
let uid;
46+
try {
47+
uid = await createUserAuth(email, isAdmin);
48+
} catch (error) {
49+
console.error('Error while creating user', error);
50+
return response.status(500).json({ error });
51+
}
14252

143-
busboy.end(request.rawBody);
144-
});
53+
return response.status(200).json({ uid });
14554
});
14655

14756
router.delete('/:id', async (request, response) => {

src/firebase.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import firebase from 'firebase/app';
22
import 'firebase/database';
33
import 'firebase/auth';
4+
import 'firebase/storage';
45

56
const config = {
67
apiKey: process.env.REACT_APP_FIRE_BASE_KEY,
@@ -15,5 +16,6 @@ const config = {
1516

1617
firebase.initializeApp(config);
1718
firebase.database();
19+
firebase.storage();
1820

1921
export default firebase;

src/state/actions/users.js

Lines changed: 66 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -113,63 +113,83 @@ export const createUser = ({
113113

114114
const userToken = await user.getIdToken();
115115

116-
const body = new FormData();
117-
118-
if (file) {
119-
const fileExtension = file.name.split('.')[1];
120-
121-
const fileName = `${uuid()}.${fileExtension}`;
122-
123-
body.append('logo', file, fileName);
116+
let response;
117+
try {
118+
response = await axios(userToken).post('/users', { email, isAdmin });
119+
} catch (error) {
120+
const errorMessage = firebaseError(error.response.data.error.code);
121+
toastr.error('', errorMessage);
122+
return dispatch(
123+
USERS_CREATE_USER_FAIL({
124+
error: errorMessage
125+
})
126+
);
124127
}
125128

126-
body.append('name', name);
127-
body.append('location', location);
128-
body.append('email', email);
129-
body.append('password', uuid());
130-
body.append('createdAt', createdAt);
131-
body.append('isAdmin', isAdmin);
129+
const { uid } = response.data;
130+
let path = null;
131+
if (file) {
132+
const storageRef = firebase.storage().ref();
132133

133-
axios(userToken)
134-
.post('/users', body)
135-
.then(async response => {
136-
const userCreated = response.data;
134+
const fileExtension = file.name.split('.').pop();
137135

138-
const actionCodeSettings = {
139-
url: process.env.REACT_APP_LOGIN_PAGE_URL,
140-
handleCodeInApp: true
141-
};
142-
143-
try {
144-
await firebase
145-
.auth()
146-
.sendSignInLinkToEmail(email, actionCodeSettings);
147-
} catch (error) {
148-
const errorMessage = firebaseError(error.response.data.error.code);
149-
150-
return dispatch(
151-
USERS_CREATE_USER_FAIL({
152-
error: errorMessage
153-
})
154-
);
155-
}
136+
const fileName = `${uid}.${fileExtension}`;
156137

157-
toastr.success('', 'User created successfully');
158-
return dispatch(
159-
USERS_CREATE_USER_SUCCESS({
160-
user: userCreated
161-
})
162-
);
163-
})
164-
.catch(error => {
165-
const errorMessage = firebaseError(error.response.data.error.code);
138+
const basePath = 'users/';
139+
try {
140+
await storageRef.child(`${basePath}${fileName}`).put(file);
141+
} catch (error) {
142+
const errorMessage = firebaseError(error.code);
166143
toastr.error('', errorMessage);
167144
return dispatch(
168145
USERS_CREATE_USER_FAIL({
169146
error: errorMessage
170147
})
171148
);
172-
});
149+
}
150+
path = `${basePath}${uid}_200x200.${fileExtension}`;
151+
}
152+
153+
try {
154+
await firebase
155+
.database()
156+
.ref(`users/${uid}`)
157+
.set({
158+
name,
159+
email,
160+
location,
161+
logoUrl: path,
162+
createdAt,
163+
isAdmin
164+
});
165+
} catch (error) {
166+
const errorMessage = firebaseError(error.code);
167+
toastr.error('', errorMessage);
168+
return dispatch(
169+
USERS_CREATE_USER_FAIL({
170+
error: errorMessage
171+
})
172+
);
173+
}
174+
175+
const actionCodeSettings = {
176+
url: process.env.REACT_APP_LOGIN_PAGE_URL,
177+
handleCodeInApp: true
178+
};
179+
180+
try {
181+
await firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings);
182+
} catch (error) {
183+
const errorMessage = firebaseError(error.code);
184+
return dispatch(
185+
USERS_CREATE_USER_FAIL({
186+
error: errorMessage
187+
})
188+
);
189+
}
190+
191+
toastr.success('', 'User created successfully');
192+
return dispatch(USERS_CREATE_USER_SUCCESS({ user: response.data }));
173193
};
174194
};
175195

src/utils/index.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ export const FIREBASE_RESPONSE = {
1111
USER_DISABLED: 'auth/user-disabled',
1212
TOO_MANY_REQUESTS: 'auth/too-many-requests',
1313
EXPIRED_ACTION_CODE: 'auth/expired-action-code',
14-
INVALID_ACTION_CODE: 'auth/invalid-action-code'
14+
INVALID_ACTION_CODE: 'auth/invalid-action-code',
15+
QUOTA_EXCEEDED_STORAGE: 'storage/quota-exceeded',
16+
UNAUTHENTICATED_STORAGE: 'storage/unauthenticated',
17+
UNAUTHORIZED_STORAGE: 'storage/unauthorized'
1518
};
1619

1720
export const firebaseError = error => {
@@ -44,6 +47,17 @@ export const firebaseError = error => {
4447
errorMessage =
4548
'The invitation link has expired, get in touch with your administrator';
4649
break;
50+
case FIREBASE_RESPONSE.QUOTA_EXCEEDED_STORAGE:
51+
errorMessage =
52+
'Internal server error, get in touch with your administrator';
53+
break;
54+
case FIREBASE_RESPONSE.UNAUTHENTICATED_STORAGE:
55+
errorMessage = 'Unauthenticated, please authenticate and try again.';
56+
break;
57+
case FIREBASE_RESPONSE.UNAUTHORIZED_STORAGE:
58+
errorMessage =
59+
'Unauthoriez, you are not authorized to perform this action.';
60+
break;
4761
default:
4862
errorMessage = 'Unknown error, get in touch with your administrator';
4963
}

0 commit comments

Comments
 (0)