From 8f1d14b1850bf780c17122389a206ba3c8a9927b Mon Sep 17 00:00:00 2001 From: rob Date: Wed, 13 Jul 2022 03:49:14 -0400 Subject: [PATCH] implemented user profile badges --- app/models/core-user.js | 14 ++++++++++++-- app/models/lib/user-types.js | 2 +- app/models/user.js | 14 ++++++++++++-- app/services/core-node.js | 7 +++++++ app/services/user.js | 7 +++++++ app/views/admin/core-user/form.pug | 5 +++++ app/views/admin/user/form.pug | 5 +++++ app/views/user/profile.pug | 18 ++++++++++++++++-- 8 files changed, 65 insertions(+), 7 deletions(-) diff --git a/app/models/core-user.js b/app/models/core-user.js index 13f5ab7..812e826 100644 --- a/app/models/core-user.js +++ b/app/models/core-user.js @@ -7,8 +7,17 @@ const mongoose = require('mongoose'); const Schema = mongoose.Schema; -const { ResourceStats, ResourceStatsDefaults } = require('./lib/resource-stats'); -const { DTP_THEME_LIST, UserFlagsSchema, UserPermissionsSchema, UserOptInSchema } = require('./lib/user-types'); +const { + ResourceStats, + ResourceStatsDefaults, +} = require('./lib/resource-stats'); + +const { + DTP_THEME_LIST, + UserFlagsSchema, + UserPermissionsSchema, + UserOptInSchema, +} = require('./lib/user-types'); const CoreUserSchema = new Schema({ created: { type: Date, default: Date.now, required: true, index: -1 }, @@ -19,6 +28,7 @@ const CoreUserSchema = new Schema({ username_lc: { type: String, required: true, lowercase: true, index: 1 }, displayName: { type: String }, bio: { type: String, maxlength: 300 }, + badges: { type: [String] }, flags: { type: UserFlagsSchema, select: false }, permissions: { type: UserPermissionsSchema, select: false }, optIn: { type: UserOptInSchema, required: true, select: false }, diff --git a/app/models/lib/user-types.js b/app/models/lib/user-types.js index 55d25c0..ffbbad8 100644 --- a/app/models/lib/user-types.js +++ b/app/models/lib/user-types.js @@ -25,4 +25,4 @@ module.exports.UserPermissionsSchema = new Schema({ module.exports.UserOptInSchema = new Schema({ system: { type: Boolean, default: true, required: true }, marketing: { type: Boolean, default: true, required: true }, -}); +}); \ No newline at end of file diff --git a/app/models/user.js b/app/models/user.js index e7d9a50..b7d68ae 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -8,8 +8,17 @@ const mongoose = require('mongoose'); const Schema = mongoose.Schema; -const { ResourceStats, ResourceStatsDefaults } = require('./lib/resource-stats'); -const { DTP_THEME_LIST, UserFlagsSchema, UserPermissionsSchema, UserOptInSchema } = require('./lib/user-types'); +const { + ResourceStats, + ResourceStatsDefaults, +} = require('./lib/resource-stats'); + +const { + DTP_THEME_LIST, + UserFlagsSchema, + UserPermissionsSchema, + UserOptInSchema, +} = require('./lib/user-types'); const UserSchema = new Schema({ created: { type: Date, default: Date.now, required: true, index: -1 }, @@ -24,6 +33,7 @@ const UserSchema = new Schema({ large: { type: Schema.ObjectId, ref: 'Image' }, small: { type: Schema.ObjectId, ref: 'Image' }, }, + badges: { type: [String] }, flags: { type: UserFlagsSchema, select: false }, permissions: { type: UserPermissionsSchema, select: false }, optIn: { type: UserOptInSchema, required: true, select: false }, diff --git a/app/services/core-node.js b/app/services/core-node.js index 75391d1..aaa3001 100644 --- a/app/services/core-node.js +++ b/app/services/core-node.js @@ -485,6 +485,12 @@ class CoreNodeService extends SiteService { settings.username = striptags(settings.username.trim()); settings.username_lc = settings.username.toLowerCase(); + if (settings.badges) { + settings.badges = settings.badges.split(',').map((badge) => striptags(badge.trim())); + } else { + settings.badges = [ ]; + } + await CoreUser.updateOne( { _id: user._id }, { @@ -495,6 +501,7 @@ class CoreNodeService extends SiteService { username_lc: settings.username_lc, displayName: striptags(settings.displayName.trim()), bio: striptags(settings.bio.trim()), + badges: settings.badges, 'flags.isAdmin': settings.isAdmin === 'on', 'flags.isModerator': settings.isModerator === 'on', diff --git a/app/services/user.js b/app/services/user.js index e820d97..2e5f4b8 100644 --- a/app/services/user.js +++ b/app/services/user.js @@ -222,6 +222,12 @@ class UserService extends SiteService { userDefinition.displayName = striptags(userDefinition.displayName.trim()); + if (userDefinition.badges) { + userDefinition.badges = userDefinition.badges.split(',').map((badge) => striptags(badge.trim())); + } else { + userDefinition.badges = [ ]; + } + this.log.info('updating user for admin', { userDefinition }); await User.updateOne( { _id: user._id }, @@ -231,6 +237,7 @@ class UserService extends SiteService { username_lc, displayName: userDefinition.displayName, bio: striptags(userDefinition.bio.trim()), + badges: userDefinition.badges, 'flags.isAdmin': userDefinition.isAdmin === 'on', 'flags.isModerator': userDefinition.isModerator === 'on', diff --git a/app/views/admin/core-user/form.pug b/app/views/admin/core-user/form.pug index 68aed98..9b989e8 100644 --- a/app/views/admin/core-user/form.pug +++ b/app/views/admin/core-user/form.pug @@ -60,6 +60,11 @@ block content input(id="optin-marketing", name="optInMarketing", type="checkbox", checked= userAccount.optIn.marketing) | Marketing + .uk-margin + label.uk-form-label Badges + input(id="badges", name="badges", type="text", placeholder="Enter badges", value= (userAccount.badges || [ ]).join(', ')).uk-input + .uk-text-small.uk-text-muted Enter badge labels separated by commas + .uk-card-footer div(uk-grid).uk-grid-small .uk-width-expand diff --git a/app/views/admin/user/form.pug b/app/views/admin/user/form.pug index ff149f6..9f2a735 100644 --- a/app/views/admin/user/form.pug +++ b/app/views/admin/user/form.pug @@ -66,6 +66,11 @@ block content input(id="optin-marketing", name="optInMarketing", type="checkbox", checked= userAccount.optIn.marketing) | Marketing + .uk-margin + label.uk-form-label Badges + input(id="badges", name="badges", type="text", placeholder="Enter badges", value= (userAccount.badges || [ ]).join(', ')).uk-input + .uk-text-small.uk-text-muted Enter badge labels separated by commas + .uk-card-footer div(uk-grid).uk-grid-small .uk-width-expand diff --git a/app/views/user/profile.pug b/app/views/user/profile.pug index 6a6e9cf..034e4ab 100644 --- a/app/views/user/profile.pug +++ b/app/views/user/profile.pug @@ -7,7 +7,21 @@ block content .uk-container div(uk-grid) .uk-width-auto - +renderProfileIcon(user, user.displayName || user.username, 'large') + +renderProfileIcon(userProfile, userProfile.displayName || userProfile.username, 'large') .uk-width-expand - h1= user.displayName || user.username || user.email + h1(style="line-height: 1em;").uk-margin-remove= userProfile.displayName || userProfile.username || userProfile.email + + if Array.isArray(userProfile.badges) && (userProfile.badges.length > 0) + div(uk-grid).uk-grid-small + if userProfile.flags.isAdmin + .uk-width-auto + alert.uk-label.uk-label-danger Admin + if userProfile.flags.isModerator + .uk-width-auto + alert.uk-label.uk-label-danger Moderator + + each badge in userProfile.badges + .uk-width-auto + alert.uk-label= badge + p Welcome to #[+renderSiteLink()]. This app/site really doesn't do anything at all other than provide everything needed for building distributed communities of web applications that all talk to each other and share information in new and easy ways. \ No newline at end of file