Finalize JamiSwig interface and implement account detail routes

Changes:
- Add missing methods to JamiSwig interface
- Create new stringMapToRecord and itToRecord functions
- Rename id to accountId everywhere for consistency
- Rename jamid to jamiSwig inside Jamid service for clarity
- Implement Jamid functionality:
    - getVolatileAccountDetails
    - getAccountDetails with AccountDetails interface
    - setAccountDetails
    - getDevices
    - getDefaultModerators
- Reorder and rename methods in Jamid for consistency with JamiSwig
- Implement all routes for accountRouter (GET/POST /account)
- Add various TODO comments for future work

Change-Id: Id14ddde3bc8b4484d82ad84c57384567d92bd70f
diff --git a/server/src/jamid/jami-swig.ts b/server/src/jamid/jami-swig.ts
index 63fc307..6ce5a71 100644
--- a/server/src/jamid/jami-swig.ts
+++ b/server/src/jamid/jami-swig.ts
@@ -15,7 +15,7 @@
  * License along with this program.  If not, see
  * <https://www.gnu.org/licenses/>.
  */
-import { itMap, itRange, itToArr, itToMap } from '../utils.js';
+import { itMap, itRange, itToArr, itToMap, itToRecord } from './utils.js';
 
 enum Bool {
   False = 'false',
@@ -33,26 +33,66 @@
   set(k: T, v: U): void;
 }
 
+// TODO: Review these conversion functions
 const swigVecToIt = <T>(v: SwigVec<T>) => itMap(itRange(0, v.size()), (i) => v.get(i));
 const swigMapToIt = <T, U>(m: SwigMap<T, U>) => itMap(swigVecToIt(m.keys()), (k): [T, U] => [k, m.get(k)]);
 
-// type IntVect = SwigVec<number>;
-// type UintVect = SwigVec<number>;
-// type FloatVect = SwigVec<number>;
+// export type IntVect = SwigVec<number>;
+// export type UintVect = SwigVec<number>;
+// export type FloatVect = SwigVec<number>;
 export type StringVect = SwigVec<string>;
-// type IntegerMap = SwigMap<string, number>;
+// export type IntegerMap = SwigMap<string, number>;
 export type StringMap = SwigMap<string, string>;
-// type VectMap = SwigVec<StringMap>;
-// type Blob = SwigVec<number>;
+export type VectMap = SwigVec<StringMap>;
+// export type Blob = SwigVec<number>;
 
-export const stringVectToArr = (sv: StringVect) => itToArr(swigVecToIt(sv));
+// TODO: Consider always converting to Record rather than Map as conversion to interfaces is easier
+export const stringVectToArray = (sv: StringVect) => itToArr(swigVecToIt(sv));
+export const stringMapToRecord = (sm: StringMap) => itToRecord(swigMapToIt(sm));
 export const stringMapToMap = (sm: StringMap) => itToMap(swigMapToIt(sm));
-// const vectMapToJs = (vm: VectMap) => itToArr(itMap(swigVecToIt(vm), stringMapToMap));
+// export const vectMapToArrayMap = (vm: VectMap) => itToArr(itMap(swigVecToIt(vm), stringMapToMap));
 
 export interface JamiSwig {
   init(args: Record<string, unknown>): void;
   fini(): void;
 
+  getAccountDetails(accountId: string): StringMap;
+  getVolatileAccountDetails(accountId: string): StringMap;
+  setAccountDetails(accountId: string, details: StringMap): void;
+  setAccountActive(accountId: string, active: Bool): void;
+
+  addAccount(details: StringMap): string;
+  removeAccount(accountId: string): void;
+
+  getAccountList(): StringVect;
+
+  lookupName(accountId: string, nameserver: string, username: string): boolean;
+  lookupAddress(accountId: string, nameserver: string, address: string): boolean;
+  registerName(accountId: string, password: string, username: string): boolean;
+
+  getKnownRingDevices(accountId: string): StringMap;
+
+  getAudioOutputDeviceList(): StringVect;
+
+  getVolume(device: string): number;
+  setVolume(device: string, value: number): void;
+
+  addContact(accountId: string, contactId: string): void;
+  removeContact(accountId: string, contactId: string, ban: boolean): void;
+  getContacts(accountId: string): VectMap;
+  getContactDetails(accountId: string, contactId: string): StringMap;
+
+  getDefaultModerators(accountId: string): StringVect;
+  setDefaultModerators(accountId: string, uri: string, state: boolean): void;
+
+  getConversations(accountId: string): StringVect;
+  conversationInfos(accountId: string, conversationId: string): StringMap;
+
+  getConversationMembers(accountId: string, conversationId: string): VectMap;
+
+  sendMessage(accountId: string, conversationId: string, message: string, replyTo: string): void;
+  loadConversationMessages(accountId: string, conversationId: string, fromMessage: string, n: number): number;
+
   // IntVect(): IntVect;
   // UintVect(): UintVect;
   // FloatVect(): FloatVect;
@@ -61,17 +101,4 @@
   // StringMap(): StringMap;
   // VectMap(): VectMap;
   // IntegerMap(): IntegerMap;
-
-  addAccount(details: StringMap): string;
-  removeAccount(id: string): void;
-
-  getAccountList(): StringVect;
-
-  registerName(id: string, password: string, username: string): boolean;
-  lookupName(id: string, nameserver: string, username: string): boolean;
-  lookupAddress(id: string, nameserver: string, address: string): boolean;
-
-  getAccountDetails(id: string): StringMap;
-  setAccountDetails(id: string, details: StringMap): void;
-  setAccountActive(id: string, active: Bool): void;
 }