From e39316eeff0ddb80174c16b671c1fcb33d3e375b Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 11 Jun 2022 09:45:47 -0500 Subject: [PATCH] whole create flow with error handling and such --- packages/api/index.ts | 2 +- packages/api/routes/conversations.ts | 6 +++++- packages/core/responses/nirvanaResponse.ts | 8 +++++++- packages/desktop/src/api/NirvanaApi.tsx | 14 +++++++------- .../desktop/src/tree/NewConversationDialog.tsx | 1 + 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/api/index.ts b/packages/api/index.ts index 5797fd2..1941180 100644 --- a/packages/api/index.ts +++ b/packages/api/index.ts @@ -26,7 +26,7 @@ app.use('/api/conversations', getConversationRoutes()); app.use((err: Error, req: Request, res: Response, next: NextFunction) => { // use logger or sentry - if (!res.statusCode) res.status(500); + if (res.statusCode === 200) res.status(500); return res.json(new NirvanaResponse(undefined, err, err.message)); }); diff --git a/packages/api/routes/conversations.ts b/packages/api/routes/conversations.ts index 8d80330..e1f8b44 100644 --- a/packages/api/routes/conversations.ts +++ b/packages/api/routes/conversations.ts @@ -11,6 +11,7 @@ import CreateConversationRequest from '@nirvana/core/requests/CreateConversation import CreateConversationResponse from '@nirvana/core/responses/CreateConversationResponse.response'; import { MemberState } from '../../core/models/conversation.model'; import NirvanaResponse from '@nirvana/core/responses/nirvanaResponse'; +import { ObjectId } from 'mongodb'; import { UserService } from '../services/user.service'; export default function getConversationRoutes() { @@ -38,7 +39,7 @@ const createConversation = async (req: Request, res: Response, next: NextFunctio const createRequest = req.body as CreateConversationRequest; const userInfo = res.locals.userInfo as JwtClaims; - if (!createRequest.otherUsers) { + if (!createRequest.otherUsers || createRequest.otherUsers.length === 0) { return next(new Error('must provide who you want to talk to')); } @@ -49,6 +50,9 @@ const createConversation = async (req: Request, res: Response, next: NextFunctio createRequest.otherUsers.forEach((userObject) => { const newConversationMember = new ConversationMember(MemberRole.regular, MemberState.inbox); + // ! hack as json over the wire converts to string for some reason + userObject._id = new ObjectId(userObject._id); + conversationUserMembers.push({ ...userObject, ...newConversationMember, diff --git a/packages/core/responses/nirvanaResponse.ts b/packages/core/responses/nirvanaResponse.ts index 7317d42..2c4422a 100644 --- a/packages/core/responses/nirvanaResponse.ts +++ b/packages/core/responses/nirvanaResponse.ts @@ -6,7 +6,13 @@ // } // | { data?: T; error: Error }; -export default class NirvanaResponse { +export interface INirvanaResponse { + data?: T; + error?: Error; + message?: string; +} + +export default class NirvanaResponse implements INirvanaResponse { data?: T; error?: Error; message?: string; diff --git a/packages/desktop/src/api/NirvanaApi.tsx b/packages/desktop/src/api/NirvanaApi.tsx index fae3709..2b1eaf3 100644 --- a/packages/desktop/src/api/NirvanaApi.tsx +++ b/packages/desktop/src/api/NirvanaApi.tsx @@ -1,9 +1,9 @@ +import NirvanaResponse, { INirvanaResponse } from '@nirvana/core/responses/nirvanaResponse'; import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios'; -import CreateConversationRequest from '../../../core/requests/CreateConversationRequest.request'; -import CreateConversationResponse from '../../../core/responses/CreateConversationResponse.response'; +import CreateConversationRequest from '@nirvana/core/requests/CreateConversationRequest.request'; +import CreateConversationResponse from '@nirvana/core/responses/CreateConversationResponse.response'; import LoginResponse from '@nirvana/core/responses/login.response'; -import NirvanaResponse from '../../../core/responses/nirvanaResponse'; import UserDetailsResponse from '@nirvana/core/responses/userDetails.response'; import UserSearchResponse from '@nirvana/core/responses/userSearch.response'; @@ -38,13 +38,13 @@ export default class NirvanaApi { res = await fetch(fullUrl); } - if (!res.ok) { - if (res.status === 401) throw new Error('You are not authorized here'); + const resultJson = await res.json(); - throw new Error('Something went wrong'); + if (!res.ok) { + throw Error((resultJson as INirvanaResponse).message); } - return (await res.json()) as T; + return resultJson as T; } } diff --git a/packages/desktop/src/tree/NewConversationDialog.tsx b/packages/desktop/src/tree/NewConversationDialog.tsx index 543b54b..566696d 100644 --- a/packages/desktop/src/tree/NewConversationDialog.tsx +++ b/packages/desktop/src/tree/NewConversationDialog.tsx @@ -110,6 +110,7 @@ export default function NewConversationDialog() { // todo: select conversation Id that was created } catch (error) { console.error(error); + toast.error(error.message); } setIsSubmitting(false);