Create new interfaces for objects transmitted using the REST API

Changes:
- Create new IContact, IAccount, and IConversation interfaces in common/
    - These interfaces represent the serialized versions of the models which are transferred
    - The client models are classes which implement these interfaces
- Create new LookupResult interface for nameserver lookup results
- Create new IConversationMember interface for conversation members
    - The client interface ConversationMember extends this interface to have a Contact field rather than IContact
- Create new ConversationInfos interface for conversation infos
- Create new ContactDetails interface for contact details (used by contacts routes)
- Move request and response body interfaces into common/
- Merge AccountConfig into AccountDetails interface
- Create interfaces for server-only objects:
    - ConversationMemberInfos
    - ConversationRequestMetadata
- Ensure interfaces in jami-signal-interfaces.ts do not contain fields with JamiSwig types
- Rename models/ filenames to camelCase as they are not components
- Rewrite client models to have proper TypeScript accessors and remove unused getters
- Rewrite how client models are initialized from the serialized interface using .fromInterface static methods
- Make client models implement the interfaces in common/ for consistency
- Remove unneeded _next parameter for Express.js route handlers
- Use Partial<T> for all Express.js request body types on server
- Type all Axios response body types with interfaces

GitLab: #92
Change-Id: I4b2c75ac632ec5d9bf12a874a5ba04467c76fa6d
diff --git a/client/src/components/ConversationListItem.tsx b/client/src/components/ConversationListItem.tsx
index 41cfbe4..d94733d 100644
--- a/client/src/components/ConversationListItem.tsx
+++ b/client/src/components/ConversationListItem.tsx
@@ -16,6 +16,7 @@
  * <https://www.gnu.org/licenses/>.
  */
 import { Box, ListItem, ListItemAvatar, ListItemText } from '@mui/material';
+import { ContactDetails } from 'jami-web-common';
 import { QRCodeCanvas } from 'qrcode.react';
 import { useCallback, useContext, useMemo, useState } from 'react';
 import { useTranslation } from 'react-i18next';
@@ -25,7 +26,7 @@
 import { useConversationContext } from '../contexts/ConversationProvider';
 import { MessengerContext } from '../contexts/MessengerProvider';
 import { useStartCall } from '../hooks/useStartCall';
-import { Conversation } from '../models/Conversation';
+import { Conversation } from '../models/conversation';
 import { setRefreshFromSlice } from '../redux/appSlice';
 import { useAppDispatch } from '../redux/hooks';
 import ContextMenu, { ContextMenuHandler, useContextMenuHandler } from './ContextMenu';
@@ -56,10 +57,10 @@
   const isSelected = conversation.getDisplayUri() === pathId;
 
   const navigate = useNavigate();
-  const userId = conversation?.getFirstMember()?.contact.getUri();
+  const userId = conversation?.getFirstMember()?.contact.uri;
 
   const onClick = useCallback(() => {
-    const newConversationId = conversation.getId();
+    const newConversationId = conversation.id;
     if (newConversationId) {
       navigate(`/conversation/${newConversationId}`);
     } else {
@@ -116,7 +117,7 @@
   const getContactDetails = useCallback(async () => {
     const controller = new AbortController();
     try {
-      const { data } = await axiosInstance.get(`/contacts/${userId}`, {
+      const { data } = await axiosInstance.get<ContactDetails>(`/contacts/${userId}`, {
         signal: controller.signal,
       });
       console.log('CONTACT LIST - DETAILS: ', data);
@@ -125,7 +126,7 @@
     }
   }, [axiosInstance, userId]);
 
-  const conversationId = conversation.getId();
+  const conversationId = conversation.id;
 
   const menuOptions: PopoverListItemData[] = useMemo(
     () => [