1
+ const aws = require ( '../plugins/aws' )
1
2
const Boom = require ( '@hapi/boom' )
2
3
const server = require ( '../' ) . hapi
3
4
const log = require ( '../helpers/logger' )
@@ -6,6 +7,7 @@ const fieldsParser = require('../helpers/fieldsParser')
6
7
const config = require ( '../../config' )
7
8
const User = require ( '../db/user' )
8
9
10
+
9
11
server . method ( 'user.create' , create , { } )
10
12
server . method ( 'user.update' , update , { } )
11
13
server . method ( 'user.updateMe' , updateMe , { } )
@@ -55,6 +57,19 @@ async function update(filter, user, opts) {
55
57
filter = { id : filter }
56
58
}
57
59
60
+ if ( user && user . img . startsWith ( "data:image/jpeg;base64," ) ) {
61
+ const base64Data = user . img . replace ( / ^ d a t a : i m a g e \/ \w + ; b a s e 6 4 , / , "" ) ;
62
+ const buffer = Buffer . from ( base64Data , "base64" ) ;
63
+
64
+ const imgUrl = await uploadUserImage ( filter . id , buffer )
65
+ if ( ! imgUrl ) {
66
+ log . error ( 'Error setting image URL for user ' + filter . id )
67
+ throw Boom . internal ( 'Error setting image URL for user ' + filter . id )
68
+ }
69
+
70
+ user . img = imgUrl
71
+ }
72
+
58
73
if ( user && user . company ) {
59
74
const user2 = Object . assign ( { } , user )
60
75
if ( ! user . company . edition ) {
@@ -404,3 +419,37 @@ async function getQRCode(user) {
404
419
// FIXME: Implement this in a secure way using JWT
405
420
return `sinfo://${ btoa ( JSON . stringify ( { kind : "user" , user : { id : user . id , name : user . name , img : user . img , role : user . role } } ) ) } `
406
421
}
422
+
423
+ /* Image Functions */
424
+ function getDataFromStream ( stream ) {
425
+ return new Promise ( ( resolve , reject ) => {
426
+ let data = [ ]
427
+
428
+ stream . on ( 'data' , ( chunk ) => {
429
+ data . push ( chunk )
430
+ } )
431
+
432
+ stream . on ( 'end' , ( ) => {
433
+ resolve ( Buffer . concat ( data ) )
434
+ } )
435
+
436
+ stream . on ( 'error' , ( err ) => {
437
+ reject ( err )
438
+ } )
439
+ } )
440
+ }
441
+
442
+ function getFileName ( userId ) {
443
+ return userId + '.jpg'
444
+ }
445
+
446
+ function getUserPath ( ) {
447
+ return `static/users/`
448
+ }
449
+
450
+ async function uploadUserImage ( userId , file ) {
451
+ const path = getUserPath ( )
452
+ const fileName = getFileName ( userId )
453
+ const data = await getDataFromStream ( file )
454
+ return aws . upload ( path , data , fileName , true )
455
+ }
0 commit comments