diff --git a/backend/app/crud.py b/backend/app/crud.py index 1e92bcb259a832ac7109153189d16cb091394998..809c6f793d629e3386249a993a035ed94fa5e896 100644 --- a/backend/app/crud.py +++ b/backend/app/crud.py @@ -192,18 +192,18 @@ def create_message_metadata( return db_message_metadata -def create_message_spellcheck( +def create_message_feedback( db: Session, message_id: int, message: str, - spellcheck: schemas.MessageSpellCheckCreate, -): + feedback: schemas.MessageFeedbackCreate, +) -> str: message = ( - message[: spellcheck.start] + message[: feedback.start] + "¤µ" - + message[spellcheck.start : spellcheck.end] + + message[feedback.start : feedback.end] + "µ¤" - + message[spellcheck.end :] + + message[feedback.end :] ) db.query(models.Message).filter(models.Message.id == message_id).update( @@ -211,6 +211,8 @@ def create_message_spellcheck( ) db.commit() + return message + def create_test_typing(db: Session, test: schemas.TestTypingCreate, user: schemas.User): db_test = models.TestTyping(user_id=user.id) diff --git a/backend/app/main.py b/backend/app/main.py index 9c7f18d0b92d74877529dc1b5898746133b54417..3e82944ed33c99c1d587571e7c6e05eda5271b14 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -613,13 +613,14 @@ def create_message( @sessionsRouter.post( - "/{session_id}/messages/{message_id}/spellcheck", + "/{session_id}/messages/{message_id}/feedback", status_code=status.HTTP_204_NO_CONTENT, ) -def spellcheck_message( +def feedback_message( session_id: int, message_id: int, - spellcheck: schemas.MessageSpellCheckCreate, + feedback: schemas.MessageFeedbackCreate, + background_tasks: BackgroundTasks, db: Session = Depends(get_db), current_user: schemas.User = Depends(get_jwt_user), ): @@ -633,14 +634,23 @@ def spellcheck_message( ): raise HTTPException( status_code=401, - detail="You do not have permission to spellcheck a message in this session", + detail="You do not have permission to feedback this message in this session", ) message = crud.get_message(db, message_id) if message is None: raise HTTPException(status_code=404, detail="Message not found") - crud.create_message_spellcheck(db, message_id, message.content, spellcheck) + new_message = crud.create_message_feedback(db, message_id, message.content, feedback) + + message.content = new_message + + background_tasks.add_task( + send_websoket_message, + session_id, + schemas.Message.model_validate(message), + 'update', + ) async def send_websoket_typing(session_id: int, user_id: int): diff --git a/backend/app/schemas.py b/backend/app/schemas.py index f5725ed215a6fe7b6719b738903e980d5cd18b6e..a1ca6eb2d3d91cf984f6d2898fdfb07664f117ec 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -128,7 +128,7 @@ class MessageCreate(BaseModel): from_attributes = True -class MessageSpellCheckCreate(BaseModel): +class MessageFeedbackCreate(BaseModel): start: int end: int diff --git a/frontend/src/lib/api/sessions.ts b/frontend/src/lib/api/sessions.ts index c62ad1ebf68da53698de8b5378243a148a80bf88..039f7789087c217286b079a8b5d3480e41a41307 100644 --- a/frontend/src/lib/api/sessions.ts +++ b/frontend/src/lib/api/sessions.ts @@ -75,18 +75,18 @@ export async function updateMessageAPI( return response.data; } -export async function addMessageSpellCheckAPI( +export async function addMessageFeedbackAPI( id: number, message_id: number, start: number, end: number ): Promise<boolean> { - const response = await axiosInstance.post(`/sessions/${id}/messages/${message_id}/spellcheck`, { + const response = await axiosInstance.post(`/sessions/${id}/messages/${message_id}/feedback`, { start, end }); if (response.status !== 204) { - toastAlert('Failed to add spellcheck'); + toastAlert('Failed to add feedback'); return false; } return true; diff --git a/frontend/src/lib/components/sessions/message.svelte b/frontend/src/lib/components/sessions/message.svelte index f056d1450df621b0d81482b44a0f0283313fcd76..761fe2c0ceb5a43f5f787ce541a89e291221543d 100644 --- a/frontend/src/lib/components/sessions/message.svelte +++ b/frontend/src/lib/components/sessions/message.svelte @@ -126,7 +126,7 @@ const end = range.end; console.log(start, end); - const res = await message.addSpellCheck(start, end); + const res = await message.addFeedback(start, end); if (res) { selection.removeAllRanges(); diff --git a/frontend/src/lib/types/message.ts b/frontend/src/lib/types/message.ts index 87acfd307db6cfe4807a45d9428ca93911d85f52..35f00f6ce06e17e54bbcacfc36f823f5e012b0d8 100644 --- a/frontend/src/lib/types/message.ts +++ b/frontend/src/lib/types/message.ts @@ -1,6 +1,6 @@ import Session from './session'; import User from './user'; -import { updateMessageAPI, addMessageSpellCheckAPI } from '$lib/api/sessions'; +import { updateMessageAPI, addMessageFeedbackAPI } from '$lib/api/sessions'; import { toastAlert } from '$lib/utils/toasts'; import { writable, type Writable } from 'svelte/store'; @@ -74,14 +74,14 @@ export default class Message { return true; } - async localUpdate(content: string): Promise<boolean> { + async localUpdate(content: string, force: boolean = false): Promise<boolean> { this._content = content; - this._edited = true; + if (!force) this._edited = true; return true; } - async addSpellCheck(start: number, end: number): Promise<boolean> { + async addFeedback(start: number, end: number): Promise<boolean> { for (let i = 0; i < start + 1; i++) { if (this._content[i] == '¤' || this._content[i] == 'µ') { start++; @@ -89,7 +89,7 @@ export default class Message { } } - const response = await addMessageSpellCheckAPI(this._session.id, this._id, start, end); + const response = await addMessageFeedbackAPI(this._session.id, this._id, start, end); if (!response) return false; diff --git a/frontend/src/lib/types/session.ts b/frontend/src/lib/types/session.ts index 828ac2390d3907ae601b08bc5eff8fb68aa53f64..9051f7c2cb48331c590e574d67d1cfa478cbedcb 100644 --- a/frontend/src/lib/types/session.ts +++ b/frontend/src/lib/types/session.ts @@ -263,15 +263,24 @@ export default class Session { } } else if (data['action'] === 'update') { const message = Message.parse(data['data']); - if (message && !get(this._messages).find((m) => m.id === message.id)) { - this._messages.update((messages) => { - const mEdited = messages.find((m) => m.message_id === message.message_id); - if (!mEdited) return messages; - mEdited.localUpdate(message.content); - return messages.map((m) => (m.message_id === message.message_id ? mEdited : m)); - }); - - return; + if (message) { + if (get(this._messages).find((m) => m.id === message.id)) { + this._messages.update((messages) => { + const mEdited = messages.find((m) => m.id === message.id); + if (!mEdited) return messages; + mEdited.localUpdate(message.content, true); + return messages.map((m) => (m.id === message.id ? mEdited : m)); + }); + } else { + this._messages.update((messages) => { + const mEdited = messages.find((m) => m.message_id === message.message_id); + if (!mEdited) return messages; + mEdited.localUpdate(message.content); + return messages.map((m) => (m.message_id === message.message_id ? mEdited : m)); + }); + + return; + } } } else if (data['action'] == 'typing') { this._lastTyping.set(new Date());