Skip to content

JSON Session Format

renambot edited this page Mar 15, 2024 · 13 revisions

JSON Session Format

Schemas

Here is defined the file format to store the content of a board, including asset definitions and application states.

The base of the schema for the collection (zod definition):

export const SBSchema = z.object({
  _id: z.string(),
  _createdAt: z.number(),
  _updatedAt: z.number(),
  _updatedBy: z.string(),
  _createdBy: z.string(),
});

The application instance schema is:

export type AppSchema = {
  title: string;
  roomId: string;
  boardId: string;
  position: Position;    // { x: z.number(), y: z.number(), z: z.number() }
  rotation: Rotation;    // { x: z.number(), y: z.number(), z: z.number() }
  size: Size;            // { width: z.number(), height: z.number(), depth: z.number() }
  type: AppName;         // string, set of all the application names
  state: AppState;       // Application specific schema
  raised: boolean;
  dragging: boolean;
  pinned: boolean;
};

The application collection stores a union of SBSchema and AppSchema:

export type App = SBDoc & { data: AppSchema };

Each application defines its own AppState. For instance, the Stickie application schema is:

export const schema = z.object({
  text: z.string(),
  fontSize: z.number(),
  color: z.string(),
  lock: z.boolean(),
});

So the s3json file format for now is defined as an array of assets and an array of apps:

{
  "assets": [],
  "apps": []
}

Assets

Assets are pre-defined because they are loaded by some applications. An asset is:

{
   "id": "3ab878bf-e001-4cfa-b845-39fe31627df8",  // UUID
   "url": "http://example.com/file.jpg",          // a public URL where it can be downloaded
   "filename": "2017-05-23 16.59.17.jpg"          // a filename
}

Applications

Applications are dumped from the data collection:

    {
      "_id": "cdd91b9e-5baa-410d-9b99-07c41c6c2af5",
      "_createdAt": 1709585019165,
      "_createdBy": "0fefb25a-1431-4258-8eb8-71c240abf0b1",
      "_updatedAt": 1709585034551,
      "_updatedBy": "0fefb25a-1431-4258-8eb8-71c240abf0b1",
      "data": {
        "title": "Luc",
        "roomId": "521f75cc-0a02-4ae2-8f3f-0b190bc2b1a0",
        "boardId": "93590012-544d-4691-8df8-ef5e92713ae3",
        "position": {
          "x": 1494351,
          "y": 1499951,
          "z": 0
        },
        "size": {
          "width": 728,
          "height": 121,
          "depth": 0
        },
        "rotation": { "x": 0, "y": 0, "z": 0 },
        "type": "Stickie",
        "state": {
          "text": "Todos for next week",
          "fontSize": 48,
          "color": "pink",
          "lock": false,
        },
        "raised": false,
        "dragging": false,
        "pinned": false
      }
    },

Example

Hence a full example of a .s3json file is:

{
  "assets": [
    {
      "id": "96999240-2b64-4f45-b31f-91040e15bf4a",
      "url": "http://localhost:4200/api/files/96999240-2b64-4f45-b31f-91040e15bf4a/3b3155b4-0aaa-5b19-898b-c912256f8463",
      "filename": "Community Presentation 2021.pdf"
    },
    {
      "id": "3ab878bf-e001-4cfa-b845-39fe31627df8",
      "url": "http://localhost:4200/api/files/3ab878bf-e001-4cfa-b845-39fe31627df8/5cd70f15-9f71-5cc3-9806-93e77456701c",
      "filename": "2017-05-23 16.59.17.jpg"
    }
  ],
  "apps": [
    {
      "_id": "eb318e96-7425-4f4c-b5ff-38e1c3306112",
      "_createdAt": 1699398754569,
      "_createdBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "_updatedAt": 1699398775242,
      "_updatedBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "data": {
        "title": "Community Presentation 2021.pdf - 1 of 10",
        "roomId": "1276086a-b8d9-4a74-83e0-45dfca4c0a9c",
        "boardId": "07cc3d9e-e766-4eb2-9961-6a82b0d31a7e",
        "position": {
          "x": 1504176,
          "y": 1501889,
          "z": 0
        },
        "size": {
          "width": 400,
          "height": 224.96,
          "depth": 0
        },
        "rotation": {
          "x": 0,
          "y": 0,
          "z": 0
        },
        "type": "PDFViewer",
        "state": {
          "assetid": "96999240-2b64-4f45-b31f-91040e15bf4a",
          "currentPage": 0,
          "numPages": 10,
          "displayPages": 1,
          "executeInfo": {
            "executeFunc": "",
            "params": {}
          },
          "analyzed": "",
          "client": ""
        },
        "raised": false,
        "dragging": false,
        "pinned": false
      }
    },
    {
      "_id": "2464611c-51d3-42a8-90cd-52806adb1c74",
      "_createdAt": 1699398774369,
      "_createdBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "_updatedAt": 1699405663473,
      "_updatedBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "data": {
        "title": "Luc Renambot",
        "roomId": "1276086a-b8d9-4a74-83e0-45dfca4c0a9c",
        "boardId": "07cc3d9e-e766-4eb2-9961-6a82b0d31a7e",
        "position": {
          "x": 1504530,
          "y": 1501485,
          "z": 0
        },
        "size": {
          "width": 400,
          "height": 216,
          "depth": 0
        },
        "rotation": {
          "x": 0,
          "y": 0,
          "z": 0
        },
        "type": "Stickie",
        "state": {
          "text": "Note 1",
          "fontSize": 36,
          "color": "yellow",
          "lock": false,
          "executeInfo": {
            "executeFunc": "",
            "params": {}
          }
        },
        "raised": false,
        "dragging": false,
        "pinned": false
      }
    },
    {
      "_id": "04365291-9664-4b46-affc-5fc7a4c51690",
      "_createdAt": 1699398754569,
      "_createdBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "_updatedAt": 1699407884319,
      "_updatedBy": "733cef8b-b464-4de1-a160-dd1bf89620b8",
      "data": {
        "title": "2017-05-23 16.59.17.jpg",
        "roomId": "1276086a-b8d9-4a74-83e0-45dfca4c0a9c",
        "boardId": "07cc3d9e-e766-4eb2-9961-6a82b0d31a7e",
        "position": {
          "x": 1504627,
          "y": 1501919,
          "z": 0
        },
        "size": {
          "width": 400,
          "height": 253.125,
          "depth": 0
        },
        "rotation": {
          "x": 0,
          "y": 0,
          "z": 0
        },
        "type": "ImageViewer",
        "state": {
          "executeInfo": {
            "executeFunc": "",
            "params": {}
          },
          "assetid": "3ab878bf-e001-4cfa-b845-39fe31627df8",
          "annotations": false,
          "boxes": {}
        },
        "raised": false,
        "dragging": false,
        "pinned": false
      }
    }
  ]
}

SAGE3LightMode

Clone this wiki locally