mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 14:43:46 +01:00
Merge pull request #23673 from overleaf/em-reviewer-role-delete-replies
Let reviewers delete their own comments GitOrigin-RevId: bd5341a917a3e886dc573d7e42d12343da6700cd
This commit is contained in:
@@ -74,6 +74,10 @@ export async function deleteMessage(context) {
|
|||||||
return await callMessageHttpController(context, _deleteMessage)
|
return await callMessageHttpController(context, _deleteMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function deleteUserMessage(context) {
|
||||||
|
return await callMessageHttpController(context, _deleteUserMessage)
|
||||||
|
}
|
||||||
|
|
||||||
export async function getResolvedThreadIds(context) {
|
export async function getResolvedThreadIds(context) {
|
||||||
return await callMessageHttpController(context, _getResolvedThreadIds)
|
return await callMessageHttpController(context, _getResolvedThreadIds)
|
||||||
}
|
}
|
||||||
@@ -190,6 +194,13 @@ const _deleteMessage = async (req, res) => {
|
|||||||
res.status(204)
|
res.status(204)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _deleteUserMessage = async (req, res) => {
|
||||||
|
const { projectId, threadId, userId, messageId } = req.params
|
||||||
|
const room = await ThreadManager.findOrCreateThread(projectId, threadId)
|
||||||
|
await MessageManager.deleteUserMessage(userId, room._id, messageId)
|
||||||
|
res.status(204)
|
||||||
|
}
|
||||||
|
|
||||||
const _getResolvedThreadIds = async (req, res) => {
|
const _getResolvedThreadIds = async (req, res) => {
|
||||||
const { projectId } = req.params
|
const { projectId } = req.params
|
||||||
const resolvedThreadIds = await ThreadManager.getResolvedThreadIds(projectId)
|
const resolvedThreadIds = await ThreadManager.getResolvedThreadIds(projectId)
|
||||||
|
|||||||
@@ -77,6 +77,14 @@ export async function deleteMessage(roomId, messageId) {
|
|||||||
await db.messages.deleteOne(query)
|
await db.messages.deleteOne(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function deleteUserMessage(userId, roomId, messageId) {
|
||||||
|
await db.messages.deleteOne({
|
||||||
|
_id: new ObjectId(messageId),
|
||||||
|
user_id: new ObjectId(userId),
|
||||||
|
room_id: new ObjectId(roomId),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function _ensureIdsAreObjectIds(query) {
|
function _ensureIdsAreObjectIds(query) {
|
||||||
if (query.user_id && !(query.user_id instanceof ObjectId)) {
|
if (query.user_id && !(query.user_id instanceof ObjectId)) {
|
||||||
query.user_id = new ObjectId(query.user_id)
|
query.user_id = new ObjectId(query.user_id)
|
||||||
|
|||||||
@@ -177,6 +177,34 @@ paths:
|
|||||||
'204':
|
'204':
|
||||||
description: No Content
|
description: No Content
|
||||||
description: 'Delete message with Message ID provided, from the Thread with ThreadID and ProjectID provided'
|
description: 'Delete message with Message ID provided, from the Thread with ThreadID and ProjectID provided'
|
||||||
|
'/project/{projectId}/thread/{threadId}/user/{userId}/messages/{messageId}':
|
||||||
|
parameters:
|
||||||
|
- schema:
|
||||||
|
type: string
|
||||||
|
name: projectId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
- schema:
|
||||||
|
type: string
|
||||||
|
name: threadId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
- schema:
|
||||||
|
type: string
|
||||||
|
name: userId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
- schema:
|
||||||
|
type: string
|
||||||
|
name: messageId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
delete:
|
||||||
|
summary: Delete message written by a given user
|
||||||
|
operationId: deleteUserMessage
|
||||||
|
responses:
|
||||||
|
'204':
|
||||||
|
description: No Content
|
||||||
'/project/{projectId}/thread/{threadId}/resolve':
|
'/project/{projectId}/thread/{threadId}/resolve':
|
||||||
parameters:
|
parameters:
|
||||||
- schema:
|
- schema:
|
||||||
|
|||||||
@@ -90,6 +90,15 @@ async function deleteMessage(projectId, threadId, messageId) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function deleteUserMessage(projectId, threadId, userId, messageId) {
|
||||||
|
await fetchNothing(
|
||||||
|
chatApiUrl(
|
||||||
|
`/project/${projectId}/thread/${threadId}/user/${userId}/messages/${messageId}`
|
||||||
|
),
|
||||||
|
{ method: 'DELETE' }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
async function getResolvedThreadIds(projectId) {
|
async function getResolvedThreadIds(projectId) {
|
||||||
const body = await fetchJson(
|
const body = await fetchJson(
|
||||||
chatApiUrl(`/project/${projectId}/resolved-thread-ids`)
|
chatApiUrl(`/project/${projectId}/resolved-thread-ids`)
|
||||||
@@ -134,6 +143,7 @@ module.exports = {
|
|||||||
deleteThread: callbackify(deleteThread),
|
deleteThread: callbackify(deleteThread),
|
||||||
editMessage: callbackify(editMessage),
|
editMessage: callbackify(editMessage),
|
||||||
deleteMessage: callbackify(deleteMessage),
|
deleteMessage: callbackify(deleteMessage),
|
||||||
|
deleteUserMessage: callbackify(deleteUserMessage),
|
||||||
getResolvedThreadIds: callbackify(getResolvedThreadIds),
|
getResolvedThreadIds: callbackify(getResolvedThreadIds),
|
||||||
duplicateCommentThreads: callbackify(duplicateCommentThreads),
|
duplicateCommentThreads: callbackify(duplicateCommentThreads),
|
||||||
generateThreadData: callbackify(generateThreadData),
|
generateThreadData: callbackify(generateThreadData),
|
||||||
@@ -148,6 +158,7 @@ module.exports = {
|
|||||||
deleteThread,
|
deleteThread,
|
||||||
editMessage,
|
editMessage,
|
||||||
deleteMessage,
|
deleteMessage,
|
||||||
|
deleteUserMessage,
|
||||||
getResolvedThreadIds,
|
getResolvedThreadIds,
|
||||||
duplicateCommentThreads,
|
duplicateCommentThreads,
|
||||||
generateThreadData,
|
generateThreadData,
|
||||||
|
|||||||
+18
-2
@@ -12,6 +12,7 @@ import {
|
|||||||
ThreadId,
|
ThreadId,
|
||||||
} from '../../../../../types/review-panel/review-panel'
|
} from '../../../../../types/review-panel/review-panel'
|
||||||
import { useModalsContext } from '@/features/ide-react/context/modals-context'
|
import { useModalsContext } from '@/features/ide-react/context/modals-context'
|
||||||
|
import { usePermissionsContext } from '@/features/ide-react/context/permissions-context'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { debugConsole } from '@/utils/debugging'
|
import { debugConsole } from '@/utils/debugging'
|
||||||
|
|
||||||
@@ -29,11 +30,13 @@ export const ReviewPanelComment = memo<{
|
|||||||
resolveThread,
|
resolveThread,
|
||||||
editMessage,
|
editMessage,
|
||||||
deleteMessage,
|
deleteMessage,
|
||||||
|
deleteOwnMessage,
|
||||||
deleteThread,
|
deleteThread,
|
||||||
addMessage,
|
addMessage,
|
||||||
} = useThreadsActionsContext()
|
} = useThreadsActionsContext()
|
||||||
const { showGenericMessageModal } = useModalsContext()
|
const { showGenericMessageModal } = useModalsContext()
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
const permissions = usePermissionsContext()
|
||||||
|
|
||||||
const [processing, setProcessing] = useState(false)
|
const [processing, setProcessing] = useState(false)
|
||||||
|
|
||||||
@@ -74,7 +77,13 @@ export const ReviewPanelComment = memo<{
|
|||||||
async (commentId: CommentId) => {
|
async (commentId: CommentId) => {
|
||||||
setProcessing(true)
|
setProcessing(true)
|
||||||
try {
|
try {
|
||||||
await deleteMessage(comment.op.t, commentId)
|
if (permissions.write) {
|
||||||
|
// Owners and editors can delete any message
|
||||||
|
await deleteMessage(comment.op.t, commentId)
|
||||||
|
} else {
|
||||||
|
// Reviewers can only delete their own messages
|
||||||
|
await deleteOwnMessage(comment.op.t, commentId)
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
debugConsole.error(err)
|
debugConsole.error(err)
|
||||||
showGenericMessageModal(
|
showGenericMessageModal(
|
||||||
@@ -85,7 +94,14 @@ export const ReviewPanelComment = memo<{
|
|||||||
setProcessing(false)
|
setProcessing(false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[comment.op.t, deleteMessage, showGenericMessageModal, t]
|
[
|
||||||
|
comment.op.t,
|
||||||
|
deleteMessage,
|
||||||
|
deleteOwnMessage,
|
||||||
|
showGenericMessageModal,
|
||||||
|
t,
|
||||||
|
permissions.write,
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
const handleDeleteThread = useCallback(
|
const handleDeleteThread = useCallback(
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ type ThreadsActions = {
|
|||||||
content: string
|
content: string
|
||||||
) => Promise<void>
|
) => Promise<void>
|
||||||
deleteMessage: (threadId: ThreadId, commentId: CommentId) => Promise<void>
|
deleteMessage: (threadId: ThreadId, commentId: CommentId) => Promise<void>
|
||||||
|
deleteOwnMessage: (threadId: ThreadId, commentId: CommentId) => Promise<void>
|
||||||
}
|
}
|
||||||
|
|
||||||
const ThreadsActionsContext = createContext<ThreadsActions | undefined>(
|
const ThreadsActionsContext = createContext<ThreadsActions | undefined>(
|
||||||
@@ -288,6 +289,11 @@ export const ThreadsProvider: FC = ({ children }) => {
|
|||||||
`/project/${projectId}/thread/${threadId}/messages/${commentId}`
|
`/project/${projectId}/thread/${threadId}/messages/${commentId}`
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
async deleteOwnMessage(threadId: ThreadId, commentId: CommentId) {
|
||||||
|
await deleteJSON(
|
||||||
|
`/project/${projectId}/thread/${threadId}/own-messages/${commentId}`
|
||||||
|
)
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
[currentDocument, projectId]
|
[currentDocument, projectId]
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user