fix: issues with issues (#3267)

* fix: issues with issues

* fix: don't notify on user closing/reopening own issue

* fix: only show close/reopen buttons for OP and admins
pull/3267/merge
TheCatLady 1 year ago committed by GitHub
parent d328485161
commit fd219717c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -308,7 +308,9 @@ issueRoutes.post<{ issueId: string }, Issue, { message: string }>(
issueRoutes.post<{ issueId: string; status: string }, Issue>( issueRoutes.post<{ issueId: string; status: string }, Issue>(
'/:issueId/:status', '/:issueId/:status',
isAuthenticated(Permission.MANAGE_ISSUES), isAuthenticated([Permission.MANAGE_ISSUES, Permission.CREATE_ISSUES], {
type: 'or',
}),
async (req, res, next) => { async (req, res, next) => {
const issueRepository = getRepository(Issue); const issueRepository = getRepository(Issue);
// Satisfy typescript here. User is set, we assure you! // Satisfy typescript here. User is set, we assure you!
@ -321,6 +323,16 @@ issueRoutes.post<{ issueId: string; status: string }, Issue>(
where: { id: Number(req.params.issueId) }, where: { id: Number(req.params.issueId) },
}); });
if (
!req.user?.hasPermission(Permission.MANAGE_ISSUES) &&
issue.createdBy.id !== req.user?.id
) {
return next({
status: 401,
message: 'You do not have permission to modify this issue.',
});
}
let newStatus: IssueStatus | undefined; let newStatus: IssueStatus | undefined;
switch (req.params.status) { switch (req.params.status) {

@ -4,6 +4,7 @@ import { MediaType } from '@server/constants/media';
import { getRepository } from '@server/datasource'; import { getRepository } from '@server/datasource';
import IssueComment from '@server/entity/IssueComment'; import IssueComment from '@server/entity/IssueComment';
import Media from '@server/entity/Media'; import Media from '@server/entity/Media';
import { User } from '@server/entity/User';
import notificationManager, { Notification } from '@server/lib/notifications'; import notificationManager, { Notification } from '@server/lib/notifications';
import { Permission } from '@server/lib/permissions'; import { Permission } from '@server/lib/permissions';
import logger from '@server/logger'; import logger from '@server/logger';
@ -32,6 +33,10 @@ export class IssueCommentSubscriber
}) })
).issue; ).issue;
const createdBy = await getRepository(User).findOneOrFail({
where: { id: issue.createdBy.id },
});
const media = await getRepository(Media).findOneOrFail({ const media = await getRepository(Media).findOneOrFail({
where: { id: issue.media.id }, where: { id: issue.media.id },
}); });
@ -71,9 +76,9 @@ export class IssueCommentSubscriber
notifyAdmin: true, notifyAdmin: true,
notifySystem: true, notifySystem: true,
notifyUser: notifyUser:
!issue.createdBy.hasPermission(Permission.MANAGE_ISSUES) && !createdBy.hasPermission(Permission.MANAGE_ISSUES) &&
issue.createdBy.id !== entity.user.id createdBy.id !== entity.user.id
? issue.createdBy ? createdBy
: undefined, : undefined,
}); });
} }

@ -87,6 +87,7 @@ export class IssueSubscriber implements EntitySubscriberInterface<Issue> {
notifySystem: true, notifySystem: true,
notifyUser: notifyUser:
!entity.createdBy.hasPermission(Permission.MANAGE_ISSUES) && !entity.createdBy.hasPermission(Permission.MANAGE_ISSUES) &&
entity.modifiedBy?.id !== entity.createdBy.id &&
(type === Notification.ISSUE_RESOLVED || (type === Notification.ISSUE_RESOLVED ||
type === Notification.ISSUE_REOPENED) type === Notification.ISSUE_REOPENED)
? entity.createdBy ? entity.createdBy

@ -475,7 +475,8 @@ const IssueDetails = () => {
className="h-20" className="h-20"
/> />
<div className="mt-4 flex items-center justify-end space-x-2"> <div className="mt-4 flex items-center justify-end space-x-2">
{hasPermission(Permission.MANAGE_ISSUES) && ( {(hasPermission(Permission.MANAGE_ISSUES) ||
belongsToUser) && (
<> <>
{issueData.status === IssueStatus.OPEN ? ( {issueData.status === IssueStatus.OPEN ? (
<Button <Button

Loading…
Cancel
Save