mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix(user edit): fix user edit not being able to be saved (#651)
Co-authored-by: sct <sctsnipe@gmail.com>
This commit is contained in:
@@ -23,11 +23,13 @@ components:
|
|||||||
userType:
|
userType:
|
||||||
type: integer
|
type: integer
|
||||||
example: 1
|
example: 1
|
||||||
|
readOnly: true
|
||||||
permissions:
|
permissions:
|
||||||
type: number
|
type: number
|
||||||
example: 0
|
example: 0
|
||||||
avatar:
|
avatar:
|
||||||
type: string
|
type: string
|
||||||
|
readOnly: true
|
||||||
createdAt:
|
createdAt:
|
||||||
type: string
|
type: string
|
||||||
example: '2020-09-02T05:02:23.000Z'
|
example: '2020-09-02T05:02:23.000Z'
|
||||||
@@ -47,9 +49,7 @@ components:
|
|||||||
$ref: '#/components/schemas/MediaRequest'
|
$ref: '#/components/schemas/MediaRequest'
|
||||||
required:
|
required:
|
||||||
- id
|
- id
|
||||||
- userType
|
|
||||||
- email
|
- email
|
||||||
- permissions
|
|
||||||
- createdAt
|
- createdAt
|
||||||
- updatedAt
|
- updatedAt
|
||||||
MainSettings:
|
MainSettings:
|
||||||
|
@@ -15,6 +15,7 @@ import PreparedEmail from '../lib/email';
|
|||||||
import logger from '../logger';
|
import logger from '../logger';
|
||||||
import { getSettings } from '../lib/settings';
|
import { getSettings } from '../lib/settings';
|
||||||
import { default as generatePassword } from 'secure-random-password';
|
import { default as generatePassword } from 'secure-random-password';
|
||||||
|
import { UserType } from '../constants/user';
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class User {
|
export class User {
|
||||||
@@ -36,8 +37,8 @@ export class User {
|
|||||||
@Column({ nullable: true, select: false })
|
@Column({ nullable: true, select: false })
|
||||||
public password?: string;
|
public password?: string;
|
||||||
|
|
||||||
@Column({ type: 'integer', default: 1 })
|
@Column({ type: 'integer', default: UserType.PLEX })
|
||||||
public userType = 1;
|
public userType: UserType;
|
||||||
|
|
||||||
@Column({ nullable: true, select: false })
|
@Column({ nullable: true, select: false })
|
||||||
public plexId?: number;
|
public plexId?: number;
|
||||||
|
@@ -68,6 +68,7 @@ authRoutes.post('/login', async (req, res, next) => {
|
|||||||
plexToken: account.authToken,
|
plexToken: account.authToken,
|
||||||
permissions: Permission.ADMIN,
|
permissions: Permission.ADMIN,
|
||||||
avatar: account.thumb,
|
avatar: account.thumb,
|
||||||
|
userType: UserType.PLEX,
|
||||||
});
|
});
|
||||||
await userRepository.save(user);
|
await userRepository.save(user);
|
||||||
}
|
}
|
||||||
@@ -90,6 +91,7 @@ authRoutes.post('/login', async (req, res, next) => {
|
|||||||
plexToken: account.authToken,
|
plexToken: account.authToken,
|
||||||
permissions: settings.main.defaultPermissions,
|
permissions: settings.main.defaultPermissions,
|
||||||
avatar: account.thumb,
|
avatar: account.thumb,
|
||||||
|
userType: UserType.PLEX,
|
||||||
});
|
});
|
||||||
await userRepository.save(user);
|
await userRepository.save(user);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -7,6 +7,7 @@ import { hasPermission, Permission } from '../lib/permissions';
|
|||||||
import { getSettings } from '../lib/settings';
|
import { getSettings } from '../lib/settings';
|
||||||
import logger from '../logger';
|
import logger from '../logger';
|
||||||
import gravatarUrl from 'gravatar-url';
|
import gravatarUrl from 'gravatar-url';
|
||||||
|
import { UserType } from '../constants/user';
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ router.post('/', async (req, res, next) => {
|
|||||||
const userRepository = getRepository(User);
|
const userRepository = getRepository(User);
|
||||||
|
|
||||||
const passedExplicitPassword = body.password && body.password.length > 0;
|
const passedExplicitPassword = body.password && body.password.length > 0;
|
||||||
const avatar = gravatarUrl(body.email);
|
const avatar = gravatarUrl(body.email, { default: 'mm', size: 200 });
|
||||||
|
|
||||||
if (!passedExplicitPassword && !settings.enabled) {
|
if (!passedExplicitPassword && !settings.enabled) {
|
||||||
throw new Error('Email notifications must be enabled');
|
throw new Error('Email notifications must be enabled');
|
||||||
@@ -37,9 +38,9 @@ router.post('/', async (req, res, next) => {
|
|||||||
username: body.username ?? body.email,
|
username: body.username ?? body.email,
|
||||||
email: body.email,
|
email: body.email,
|
||||||
password: body.password,
|
password: body.password,
|
||||||
permissions: body.permissions,
|
permissions: Permission.REQUEST,
|
||||||
plexToken: '',
|
plexToken: '',
|
||||||
userType: body.userType,
|
userType: UserType.LOCAL,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (passedExplicitPassword) {
|
if (passedExplicitPassword) {
|
||||||
@@ -201,6 +202,7 @@ router.post('/import-from-plex', async (req, res, next) => {
|
|||||||
plexId: parseInt(account.id),
|
plexId: parseInt(account.id),
|
||||||
plexToken: '',
|
plexToken: '',
|
||||||
avatar: account.thumb,
|
avatar: account.thumb,
|
||||||
|
userType: UserType.PLEX,
|
||||||
});
|
});
|
||||||
await userRepository.save(newUser);
|
await userRepository.save(newUser);
|
||||||
createdUsers.push(newUser);
|
createdUsers.push(newUser);
|
||||||
|
@@ -59,7 +59,7 @@ const PermissionOption: React.FC<PermissionOptionProps> = ({
|
|||||||
!hasPermission(Permission.MANAGE_SETTINGS, user.permissions) &&
|
!hasPermission(Permission.MANAGE_SETTINGS, user.permissions) &&
|
||||||
option.permission === Permission.MANAGE_SETTINGS)
|
option.permission === Permission.MANAGE_SETTINGS)
|
||||||
}
|
}
|
||||||
onClick={() => {
|
onChange={() => {
|
||||||
onUpdate(
|
onUpdate(
|
||||||
hasPermission(option.permission, currentPermission)
|
hasPermission(option.permission, currentPermission)
|
||||||
? currentPermission - option.permission
|
? currentPermission - option.permission
|
||||||
|
@@ -79,7 +79,6 @@ const UserEdit: React.FC = () => {
|
|||||||
await axios.put(`/api/v1/user/${user?.id}`, {
|
await axios.put(`/api/v1/user/${user?.id}`, {
|
||||||
permissions: currentPermission,
|
permissions: currentPermission,
|
||||||
email: user?.email,
|
email: user?.email,
|
||||||
avatar: user?.avatar,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
addToast(intl.formatMessage(messages.usersaved), {
|
addToast(intl.formatMessage(messages.usersaved), {
|
||||||
|
@@ -204,8 +204,6 @@ const UserList: React.FC = () => {
|
|||||||
await axios.post('/api/v1/user', {
|
await axios.post('/api/v1/user', {
|
||||||
email: values.email,
|
email: values.email,
|
||||||
password: values.genpassword ? null : values.password,
|
password: values.genpassword ? null : values.password,
|
||||||
permissions: Permission.REQUEST,
|
|
||||||
userType: UserType.LOCAL,
|
|
||||||
});
|
});
|
||||||
addToast(intl.formatMessage(messages.usercreatedsuccess), {
|
addToast(intl.formatMessage(messages.usercreatedsuccess), {
|
||||||
appearance: 'success',
|
appearance: 'success',
|
||||||
@@ -315,7 +313,7 @@ const UserList: React.FC = () => {
|
|||||||
}}
|
}}
|
||||||
</Formik>
|
</Formik>
|
||||||
</Transition>
|
</Transition>
|
||||||
<div className="flex-col sm:flex-row flex justify-between">
|
<div className="flex flex-col justify-between sm:flex-row">
|
||||||
<Header>{intl.formatMessage(messages.userlist)}</Header>
|
<Header>{intl.formatMessage(messages.userlist)}</Header>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<Button
|
<Button
|
||||||
@@ -363,7 +361,7 @@ const UserList: React.FC = () => {
|
|||||||
<div className="text-sm font-medium leading-5">
|
<div className="text-sm font-medium leading-5">
|
||||||
{user.username}
|
{user.username}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm text-gray-300 leading-5">
|
<div className="text-sm leading-5 text-gray-300">
|
||||||
{user.email}
|
{user.email}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user