From b8a0e957bb3d81f6b92017b118c7f8eba7a46424 Mon Sep 17 00:00:00 2001 From: garrettmills Date: Mon, 18 May 2020 22:55:08 -0500 Subject: [PATCH] Add support for profile photos; default image --- .gitignore | 6 ++ TODO.text | 4 -- app/assets/app/dash-components.js | 2 + .../app/dash/profile/EditProfile.component.js | 21 +++++- .../form/ProfilePhotoUploader.component.js | 60 ++++++++++++++++++ app/assets/humans.txt | 1 + app/assets/less/dashboard.less | 21 ++++++ app/assets/people.png | Bin 0 -> 25823 bytes app/assets/profile.jpg | Bin 50635 -> 0 bytes app/controllers/api/v1/Profile.controller.js | 42 +++++++++++- app/models/auth/User.model.js | 6 ++ .../upload/UploadFile.middleware.js | 12 ++++ app/routing/routers/api/v1/profile.routes.js | 12 ++++ config/server.config.js | 4 +- config/upload.config.js | 33 ++++++++++ package.json | 4 +- tmp.uploads/.gitkeep | 0 yarn.lock | 16 ++--- 18 files changed, 227 insertions(+), 17 deletions(-) create mode 100644 app/assets/app/dash/profile/form/ProfilePhotoUploader.component.js create mode 100644 app/assets/humans.txt create mode 100644 app/assets/people.png delete mode 100644 app/assets/profile.jpg create mode 100644 app/routing/middleware/upload/UploadFile.middleware.js create mode 100644 config/upload.config.js create mode 100644 tmp.uploads/.gitkeep diff --git a/.gitignore b/.gitignore index d82e823..1b1010e 100644 --- a/.gitignore +++ b/.gitignore @@ -144,3 +144,9 @@ fabric.properties .idea/caches/build_file_checksums.ser test* + +# Uploaded files +tmp.uploads/* +!tmp.uploads/.gitkeep +uploads/* +!uploads/.gitkeep diff --git a/TODO.text b/TODO.text index 889a994..a6c866b 100644 --- a/TODO.text +++ b/TODO.text @@ -1,8 +1,4 @@ - Tagline bug - cannot save with empty text -- Profile photos - - Allow uploading/changing - - Default photo - - Expose photo endpoint for public services - App setup wizard - SAML IAM handling - LDAP IAM handling diff --git a/app/assets/app/dash-components.js b/app/assets/app/dash-components.js index b670a57..f18d85e 100644 --- a/app/assets/app/dash-components.js +++ b/app/assets/app/dash-components.js @@ -3,6 +3,7 @@ import NavBarComponent from './dash/NavBar.component.js' import MessageContainerComponent from './dash/message/MessageContainer.component.js' import EditProfileComponent from './dash/profile/EditProfile.component.js' import AppPasswordFormComponent from './dash/profile/form/AppPassword.component.js' +import ProfilePhotoUploaderComponent from './dash/profile/form/ProfilePhotoUploader.component.js' import ListingComponent from './cobalt/Listing.component.js' import FormComponent from './cobalt/Form.component.js' @@ -13,6 +14,7 @@ const dash_components = { MessageContainerComponent, EditProfileComponent, AppPasswordFormComponent, + ProfilePhotoUploaderComponent, ListingComponent, FormComponent, diff --git a/app/assets/app/dash/profile/EditProfile.component.js b/app/assets/app/dash/profile/EditProfile.component.js index feeffbf..f93fe88 100644 --- a/app/assets/app/dash/profile/EditProfile.component.js +++ b/app/assets/app/dash/profile/EditProfile.component.js @@ -13,7 +13,10 @@ const template = `
- Profile Image + Profile Image +
+ +

{{ profile_first }} {{ profile_last }}

@@ -140,6 +143,11 @@ const template = ` ref="app_password_modal" @modal-success="load_app_passwords" > +
` @@ -187,6 +195,17 @@ export default class EditProfileComponent extends Component { } } + on_profile_change_click() { + this.$refs.profile_photo_uploader.show() + } + + async on_profile_photo_upload() { + this.$refs.profile_photo_uploader.close() + let src = this.$refs.photo.src + if ( src.indexOf('?') > 0 ) src = src.split('?')[0] + this.$refs.photo.src = `${src}?i=${(new Date).getTime()}` + } + valid_email() { return this.$refs.email_input.validity.valid } diff --git a/app/assets/app/dash/profile/form/ProfilePhotoUploader.component.js b/app/assets/app/dash/profile/form/ProfilePhotoUploader.component.js new file mode 100644 index 0000000..24d4898 --- /dev/null +++ b/app/assets/app/dash/profile/form/ProfilePhotoUploader.component.js @@ -0,0 +1,60 @@ +import { Component } from '../../../../lib/vues6/vues6.js' + +const template = ` + +` + +export default class ProfilePhotoUploaderComponent extends Component { + static get selector() { return 'coreid-profile-photo-uploader' } + static get template() { return template } + static get params() { return [] } + + ready = false + + show() { + this.ready = true + this.$nextTick(() => { + $(this.$refs.modal).modal() + }) + } + + close() { + $(this.$refs.modal).modal('hide') + } + + async do_upload() { + if ( this.$refs.input.files.length < 1 ) return + const data = new FormData() + data.append('photo', this.$refs.input.files[0]) + try { + await axios.post(`/api/v1/profile/me/photo`, data, { // TODO support passed-in user_id + headers: { + 'Content-Type': 'multipart/form-data', + } + }) + this.$emit('upload') + } catch (e) { + console.error(e) + } + } +} diff --git a/app/assets/humans.txt b/app/assets/humans.txt new file mode 100644 index 0000000..e32af51 --- /dev/null +++ b/app/assets/humans.txt @@ -0,0 +1 @@ +Stock profile photo thanks to: https://www.flaticon.com/authors/vitaly-gorbachev diff --git a/app/assets/less/dashboard.less b/app/assets/less/dashboard.less index 55b7ee5..16daa29 100644 --- a/app/assets/less/dashboard.less +++ b/app/assets/less/dashboard.less @@ -61,3 +61,24 @@ body { .pad-top { padding-top: 30px; } + +.overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; + flex-direction: row; + display: flex; + align-items: center; + justify-content: center; + background: rgba(20, 20, 20, 0.4); + opacity: 0; + + transition: all 0.1s linear; + + &:hover { + opacity: 1; + } +} diff --git a/app/assets/people.png b/app/assets/people.png new file mode 100644 index 0000000000000000000000000000000000000000..179d0438a347fe65ddf3ff711754e3877546c937 GIT binary patch literal 25823 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 new Date}, + photo_file_id: String, }} } + async photo() { + const File = this.models.get('upload::File') + return File.findById(this.photo_file_id) + } + has_authorized(client) { return this.app_authorizations.some(x => x.client_id === client.id) } diff --git a/app/routing/middleware/upload/UploadFile.middleware.js b/app/routing/middleware/upload/UploadFile.middleware.js new file mode 100644 index 0000000..53fe9fb --- /dev/null +++ b/app/routing/middleware/upload/UploadFile.middleware.js @@ -0,0 +1,12 @@ +const Middleware = require('flitter-upload/middleware/UploadFile') + +/* + * Middleware to upload the files included in the request + * to the default file store backend. Stores instances of + * the "upload::File" model in "request.uploads". + */ +class UploadFile extends Middleware { + +} + +module.exports = exports = UploadFile diff --git a/app/routing/routers/api/v1/profile.routes.js b/app/routing/routers/api/v1/profile.routes.js index d6630a5..30eb0b5 100644 --- a/app/routing/routers/api/v1/profile.routes.js +++ b/app/routing/routers/api/v1/profile.routes.js @@ -10,6 +10,18 @@ const profile_routes = { ['middleware::api:Permission', { check: 'v1:profile:get' }], 'controller::api:v1:Profile.fetch', ], + '/:user_id/photo': [ + ['middleware::api:Permission', { check: 'v1:profile:photo:get' }], + 'controller::api:v1:Profile.get_photo', + ], + }, + + post: { + '/:user_id/photo': [ + ['middleware::api:Permission', { check: 'v1:profile:photo:update' }], + ['middleware::upload:UploadFile', { tag: 'v1:profile:photo' }], + 'controller::api:v1:Profile.update_photo', + ], }, patch: { diff --git a/config/server.config.js b/config/server.config.js index 261299a..e00919d 100644 --- a/config/server.config.js +++ b/config/server.config.js @@ -35,12 +35,14 @@ const server_config = { }, uploads: { + enable: true, + allowed_path: /./, /* * Used by flitter-upload. Path for uploaded files. * Should be relative to the application root. */ - destination: './uploads' + destination: './tmp.uploads', }, ssl: { diff --git a/config/upload.config.js b/config/upload.config.js new file mode 100644 index 0000000..0b1a3cf --- /dev/null +++ b/config/upload.config.js @@ -0,0 +1,33 @@ +/* + * flitter-upload configuration + * --------------------------------------------------------------- + * Specifies the configuration for various uploader aspects. Mainly, + * contains the configuration for the different file upload backends. + */ +const upload_config = { + /* + * The name of the upload backend to use by default. + */ + default_store: 'flitter', + + /* + * Stores available to the uploader. + */ + stores: { + + /* + * Example of the basic, filesystem-backed uploader. + * The name of the store is arbitrary. Here, it's called 'flitter'. + */ + flitter: { + // This is a filesystem backed 'FlitterStore' + type: 'FlitterStore', + + // Destination for uploaded files. Will be relative to the root + // path of the application. + destination: './uploads', + }, + }, +} + +module.exports = exports = upload_config diff --git a/package.json b/package.json index 1644c6e..cc9246c 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,10 @@ "flitter-flap": "^0.5.2", "flitter-forms": "^0.8.1", "flitter-less": "^0.5.3", - "flitter-upload": "^0.8.0", + "flitter-upload": "^0.8.1", "is-absolute-url": "^3.0.3", "ldapjs": "^1.0.2", - "libflitter": "^0.51.0", + "libflitter": "^0.52.0", "moment": "^2.24.0", "mongodb": "^3.5.6", "qrcode": "^1.4.4", diff --git a/tmp.uploads/.gitkeep b/tmp.uploads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index eb75bc2..b2c7e5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1871,10 +1871,10 @@ flitter-orm@^0.3.1: sinon "^9.0.0" uuid "^3.4.0" -flitter-upload@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/flitter-upload/-/flitter-upload-0.8.0.tgz#653086f5daa7400305dddb0b0993cebed3e2506f" - integrity sha512-yRhQy/pI7WbXvwcG4zp7eXotj4nkJl/vfitO4L0MAIXGMroduLFOFNwcSYB3xuWGI68i+wJzBvzVmtX46x4Gww== +flitter-upload@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/flitter-upload/-/flitter-upload-0.8.1.tgz#c69c2b16f8f5227532fe28373de4c1f8094fcdf6" + integrity sha512-ASLIAibIriSOes3zODcD40+Ly5mGATvAVf41bOZDTRjnTT6ZG8PTbV3EaU+WerPtIO0cj8ccPiusR8X/nPkKeA== dependencies: es6-promisify "^6.0.1" mkdirp "^1.0.3" @@ -2743,10 +2743,10 @@ leven@^1.0.2: resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" integrity sha1-kUS27ryl8dBoAWnxpncNzqYLdcM= -libflitter@^0.51.0: - version "0.51.0" - resolved "https://registry.yarnpkg.com/libflitter/-/libflitter-0.51.0.tgz#dbe92f1a7bf7fad4edd4fa05de8c1fa3140975fa" - integrity sha512-O/HNbpyXzZaop2Np8J5ETRWWZ1Vv7eBd5RzYCVIfQS5DqCn+UsQX0sR1HfE3d1TcH0ype3n7KjcRBva3MgjkgQ== +libflitter@^0.52.0: + version "0.52.0" + resolved "https://registry.yarnpkg.com/libflitter/-/libflitter-0.52.0.tgz#c9279d5cff93fd6f24b89f46c2add2f0c3e3b0f1" + integrity sha512-+YR+rww1i7NREfXPJwoxc0yhpmNbMYozgcAed6yfkxK59JS9DBM7cUWwV+dxG0UlFilOxZBGXdj/oKiIs+huvQ== dependencies: colors "^1.3.3" connect-mongodb-session "^2.2.0"