diff --git a/.gitignore b/.gitignore index 12ebec1c2..b6d6f25dd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /media/ /metadata/ /plugins/ +*.epub /client/.nuxt/ /client/dist/ /dist/ diff --git a/client/components/app/Appbar.vue b/client/components/app/Appbar.vue index 2f29b5688..cbd0a96f3 100644 --- a/client/components/app/Appbar.vue +++ b/client/components/app/Appbar.vue @@ -116,7 +116,7 @@ export default { return this.$store.getters['user/getIsAdminOrUp'] }, username() { - return this.user ? this.user.username : 'err' + return this.user ? this.user.displayName || this.user.username : 'err' }, numMediaItemsSelected() { return this.selectedMediaItems.length diff --git a/client/components/modals/AccountModal.vue b/client/components/modals/AccountModal.vue index 71ac81550..c291a7a99 100644 --- a/client/components/modals/AccountModal.vue +++ b/client/components/modals/AccountModal.vue @@ -18,9 +18,14 @@
| {{ $strings.LabelUsername }} | +{{ $strings.LabelDisplayName }} | {{ $strings.LabelAccountType }} | {{ $strings.LabelActivity }} | @@ -17,6 +18,9 @@
+ {{ user.displayName || '-' }} + |
{{ user.type }} |
diff --git a/client/pages/account.vue b/client/pages/account.vue
index b157f5704..3ea112aad 100644
--- a/client/pages/account.vue
+++ b/client/pages/account.vue
@@ -12,6 +12,16 @@
+
{{ $strings.LabelLanguage }}
-
-
diff --git a/package.json b/package.json
index d4831736d..ad202a939 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf",
- "version": "2.24.0",
+ "version": "2.24.1",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast server",
"main": "index.js",
diff --git a/server/controllers/LibraryItemController.js b/server/controllers/LibraryItemController.js
index 99831cbcd..ca8a4c314 100644
--- a/server/controllers/LibraryItemController.js
+++ b/server/controllers/LibraryItemController.js
@@ -82,7 +82,7 @@ class LibraryItemController {
include: [{
model: Database.userModel,
as: 'user',
- attributes: ['id', 'username']
+ attributes: ['id', 'username', 'displayName']
}],
order: [['createdAt', 'DESC']]
})
@@ -1224,7 +1224,7 @@ class LibraryItemController {
include: [{
model: Database.userModel,
as: 'user',
- attributes: ['id', 'username']
+ attributes: ['id', 'username', 'displayName']
}],
order: [['createdAt', 'DESC']]
})
@@ -1267,7 +1267,7 @@ class LibraryItemController {
include: [{
model: Database.userModel,
as: 'user',
- attributes: ['id', 'username']
+ attributes: ['id', 'username', 'displayName']
}]
})
@@ -1291,7 +1291,7 @@ class LibraryItemController {
include: [{
model: Database.userModel,
as: 'user',
- attributes: ['id', 'username']
+ attributes: ['id', 'username', 'displayName']
}]
})
diff --git a/server/controllers/MeController.js b/server/controllers/MeController.js
index 87acd2211..4bc71dbc0 100644
--- a/server/controllers/MeController.js
+++ b/server/controllers/MeController.js
@@ -23,7 +23,11 @@ class MeController {
* @param {Response} res
*/
getCurrentUser(req, res) {
- res.json(req.user.toOldJSONForBrowser())
+ const userJson = req.user.toOldJSONForBrowser()
+ Logger.info('[MeController] getCurrentUser response:', {
+ user: userJson
+ })
+ res.json(userJson)
}
/**
diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js
index 9a0e7f9ec..1f5b35a8f 100644
--- a/server/controllers/UserController.js
+++ b/server/controllers/UserController.js
@@ -172,6 +172,7 @@ class UserController {
type: userType,
username: req.body.username,
email: typeof req.body.email === 'string' ? req.body.email : null,
+ displayName: typeof req.body.displayName === 'string' ? req.body.displayName : null,
pash,
token,
isActive: !!req.body.isActive,
@@ -203,6 +204,13 @@ class UserController {
* @param {Response} res
*/
async update(req, res) {
+ Logger.info('[UserController] Update request:', {
+ params: req.params,
+ body: req.body,
+ user: req.user?.username,
+ reqUser: req.reqUser?.username
+ })
+
const user = req.reqUser
if (user.isRoot && !req.user.isRoot) {
@@ -228,6 +236,9 @@ class UserController {
if (updatePayload.username && typeof updatePayload.username !== 'string') {
return res.status(400).send('Invalid username')
}
+ if (updatePayload.displayName && typeof updatePayload.displayName !== 'string') {
+ return res.status(400).send('Invalid display name')
+ }
if (updatePayload.type && !Database.userModel.accountTypes.includes(updatePayload.type)) {
return res.status(400).send('Invalid account type')
}
@@ -322,6 +333,10 @@ class UserController {
user.lastSeen = updatePayload.lastSeen
hasUpdates = true
}
+ if (updatePayload.displayName !== undefined) {
+ user.displayName = updatePayload.displayName
+ hasUpdates = true
+ }
if (hasUpdates) {
if (shouldUpdateToken) {
@@ -474,6 +489,14 @@ class UserController {
* @param {NextFunction} next
*/
async middleware(req, res, next) {
+ Logger.info('[UserController] Middleware request:', {
+ method: req.method,
+ path: req.path,
+ params: req.params,
+ userId: req.user?.id,
+ username: req.user?.username
+ })
+
if (!req.user.isAdminOrUp && req.user.id !== req.params.id) {
return res.sendStatus(403)
} else if ((req.method == 'PATCH' || req.method == 'POST' || req.method == 'DELETE') && !req.user.isAdminOrUp) {
@@ -505,7 +528,7 @@ class UserController {
include: [{
model: Database.userModel,
as: 'user',
- attributes: ['id', 'username']
+ attributes: ['id', 'username', 'displayName']
}],
order: [['createdAt', 'DESC']]
})
diff --git a/server/migrations/v2.24.1-add-user-display-name.js b/server/migrations/v2.24.1-add-user-display-name.js
new file mode 100644
index 000000000..df25e3177
--- /dev/null
+++ b/server/migrations/v2.24.1-add-user-display-name.js
@@ -0,0 +1,22 @@
+const { DataTypes } = require('sequelize')
+
+async function up({ context: { queryInterface, logger } }) {
+ logger.info('[Migration] Adding displayName column to users table')
+
+ await queryInterface.addColumn('users', 'displayName', {
+ type: DataTypes.STRING,
+ allowNull: true
+ })
+
+ logger.info('[Migration] Successfully added displayName column to users table')
+}
+
+async function down({ context: { queryInterface, logger } }) {
+ logger.info('[Migration] Removing displayName column from users table')
+
+ await queryInterface.removeColumn('users', 'displayName')
+
+ logger.info('[Migration] Successfully removed displayName column from users table')
+}
+
+module.exports = { up, down }
\ No newline at end of file
diff --git a/server/models/Comment.js b/server/models/Comment.js
index 827e93793..3e5ac346d 100644
--- a/server/models/Comment.js
+++ b/server/models/Comment.js
@@ -83,7 +83,8 @@ class Comment extends Model {
updatedAt: this.updatedAt,
user: this.user ? {
id: this.user.id,
- username: this.user.username
+ username: this.user.username,
+ displayName: this.user.displayName
} : null
}
}
diff --git a/server/models/User.js b/server/models/User.js
index 999c80b2c..1ab70ebd1 100644
--- a/server/models/User.js
+++ b/server/models/User.js
@@ -87,6 +87,8 @@ class User extends Model {
/** @type {string} */
this.username
/** @type {string} */
+ this.displayName
+ /** @type {string} */
this.email
/** @type {string} */
this.pash
@@ -425,6 +427,7 @@ class User extends Model {
primaryKey: true
},
username: DataTypes.STRING,
+ displayName: DataTypes.STRING,
email: DataTypes.STRING,
pash: DataTypes.STRING,
type: DataTypes.STRING,
@@ -518,6 +521,7 @@ class User extends Model {
const json = {
id: this.id,
username: this.username,
+ displayName: this.displayName,
email: this.email,
type: this.type,
token: this.type === 'root' && hideRootToken ? '' : this.token,
{{ user.username }}'s Profile+{{ user.displayName || user.username }}'s ProfileMember since {{ formatDate(user.createdAt) }} |
|---|