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/server/src/routers/setup-router.ts b/server/src/routers/setup-router.ts
index 3bc3088..d6f4831 100644
--- a/server/src/routers/setup-router.ts
+++ b/server/src/routers/setup-router.ts
@@ -19,7 +19,7 @@
 import { Router } from 'express';
 import asyncHandler from 'express-async-handler';
 import { ParamsDictionary, Request } from 'express-serve-static-core';
-import { HttpStatusCode } from 'jami-web-common';
+import { AccessToken, AdminCredentials, HttpStatusCode } from 'jami-web-common';
 import { Container } from 'typedi';
 
 import { checkAdminSetup } from '../middleware/setup.js';
@@ -30,14 +30,14 @@
 
 export const setupRouter = Router();
 
-setupRouter.get('/check', (_req, res, _next) => {
+setupRouter.get('/check', (_req, res) => {
   const isSetupComplete = adminAccount.get() !== undefined;
   res.send({ isSetupComplete });
 });
 
 setupRouter.post(
   '/admin/create',
-  asyncHandler(async (req: Request<ParamsDictionary, string, { password?: string }>, res, _next) => {
+  asyncHandler(async (req: Request<ParamsDictionary, string, Partial<AdminCredentials>>, res) => {
     const { password } = req.body;
     if (password === undefined) {
       res.status(HttpStatusCode.BadRequest).send('Missing password in body');
@@ -71,28 +71,26 @@
 
 setupRouter.post(
   '/admin/login',
-  asyncHandler(
-    async (req: Request<ParamsDictionary, { accessToken: string } | string, { password: string }>, res, _next) => {
-      const { password } = req.body;
-      if (password === undefined) {
-        res.status(HttpStatusCode.BadRequest).send('Missing password in body');
-        return;
-      }
-
-      const hashedPassword = adminAccount.get();
-      if (hashedPassword === undefined) {
-        res.status(HttpStatusCode.InternalServerError).send('Admin password not found');
-        return;
-      }
-
-      const isPasswordVerified = await argon2.verify(hashedPassword, password);
-      if (!isPasswordVerified) {
-        res.status(HttpStatusCode.Forbidden).send('Incorrect password');
-        return;
-      }
-
-      const jwt = await signJwt('admin');
-      res.send({ accessToken: jwt });
+  asyncHandler(async (req: Request<ParamsDictionary, AccessToken | string, Partial<AdminCredentials>>, res) => {
+    const { password } = req.body;
+    if (password === undefined) {
+      res.status(HttpStatusCode.BadRequest).send('Missing password in body');
+      return;
     }
-  )
+
+    const hashedPassword = adminAccount.get();
+    if (hashedPassword === undefined) {
+      res.status(HttpStatusCode.InternalServerError).send('Admin password not found');
+      return;
+    }
+
+    const isPasswordVerified = await argon2.verify(hashedPassword, password);
+    if (!isPasswordVerified) {
+      res.status(HttpStatusCode.Forbidden).send('Incorrect password');
+      return;
+    }
+
+    const jwt = await signJwt('admin');
+    res.send({ accessToken: jwt });
+  })
 );