{"openapi":"3.0.3","info":{"title":"paperlesspaper API","version":"1.0.0"},"servers":[{"url":"https://api.paperlesspaper.de/"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Papers","description":"Paperlesspaper screens and content"},{"name":"Render","description":"Image rendering utilities"},{"name":"Devices","description":"Device management endpoints (shared OpenIoT)"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT Bearer authentication"},"x-api-key":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key for authentication"}},"schemas":{"User":{"type":"object","properties":{"id":{"type":"string","example":"1212121"},"name":{"type":"string","example":"John Doe"},"age":{"type":"number","example":42}},"required":["id","name","age"]}},"parameters":{}},"paths":{"/usersnnn/{id}":{"get":{"summary":"Get a single user","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}}},"/users/{id}":{"get":{"description":"Get user data by its id","summary":"Get a single user","parameters":[{"schema":{"type":"string","example":"1212121"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"204":{"description":"No content - successful operation"}}}},"/users/":{"get":{"summary":"Get a list of users","description":"Retrieves a paginated list of all users in the current organization.\n\n\nMiddlewares: `authMiddleware`, `validateQueryOrganization`","x-middlewares":["`authMiddleware`","`validateQueryOrganization`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Users"],"parameters":[{"schema":{"type":"string","example":"John","description":"Name to filter by"},"required":false,"description":"Name to filter by","name":"name","in":"query"},{"schema":{"type":"string","example":"admin","description":"Role to filter by"},"required":false,"description":"Role to filter by","name":"role","in":"query"},{"schema":{"type":"string","example":"createdAt","description":"Field to sort by"},"required":false,"description":"Field to sort by","name":"sortBy","in":"query"},{"schema":{"type":"string","example":"","description":"Search term to filter results"},"required":false,"description":"Search term to filter results","name":"search","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":10,"description":"Number of items per page"},"required":false,"description":"Number of items per page","name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"maximum":100000,"example":0,"description":"Offset for pagination, used to skip a number of items"},"required":false,"description":"Offset for pagination, used to skip a number of items","name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":1,"description":"Page number for pagination"},"required":false,"description":"Page number for pagination","name":"page","in":"query"},{"schema":{"type":"string","example":"60c72b2f9b1e8d001c8e4f3a","description":"Filter users by organization ObjectId"},"required":true,"description":"Filter users by organization ObjectId","name":"organization","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]}}}}}}}},"/users/{userId}":{"get":{"summary":"Get a user by ID","description":"Fetches a single user’s details by their unique ID.\n\n\nMiddlewares: `authMiddleware`, `validateParamsUser`","x-middlewares":["`authMiddleware`","`validateParamsUser`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Users"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"userId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]}}}}}}},"post":{"summary":"Update a user by ID","description":"Replaces a user’s full record with the provided data.\n\n\nMiddlewares: `authMiddleware`, `validateParamsUser`","x-middlewares":["`authMiddleware`","`validateParamsUser`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Users"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"userId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"User full name"},"timezone":{"type":"string","description":"IANA timezone"},"avatar":{"type":"string","description":"Avatar URL"},"meta":{"type":"object","properties":{},"description":"Additional metadata"},"category":{"type":"string","enum":["doctor","nurse","patient","pharmacist","relative"],"description":"User category"},"email":{"type":"string","nullable":true,"format":"email","description":"User email address"},"role":{"type":"string","enum":["user","admin","patient","onlyself"],"description":"User role"},"inviteCode":{"type":"string","nullable":true,"description":"Invite code"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"Organization ObjectId"}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]}}}}}},"patch":{"summary":"Partially update a user by ID","description":"Applies partial updates to a user’s record by ID.\n\n\nMiddlewares: `authMiddleware`, `validateParamsUser`","x-middlewares":["`authMiddleware`","`validateParamsUser`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Users"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"userId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"User full name"},"timezone":{"type":"string","description":"IANA timezone"},"avatar":{"type":"string","description":"Avatar URL"},"meta":{"type":"object","properties":{},"description":"Additional metadata"},"category":{"type":"string","enum":["doctor","nurse","patient","pharmacist","relative"],"description":"User category"},"email":{"type":"string","nullable":true,"format":"email","description":"User email address"},"role":{"type":"string","enum":["user","admin","patient","onlyself"],"description":"User role"},"inviteCode":{"type":"string","nullable":true,"description":"Invite code"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"Organization ObjectId"}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]}}}}}},"delete":{"summary":"Delete a user by ID","description":"Removes a user from the system by their unique ID.\n\n\nMiddlewares: `authMiddleware`, `validateParamsUser`","x-middlewares":["`authMiddleware`","`validateParamsUser`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Users"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"userId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}}}}},"/accounts/{accountId}":{"get":{"summary":"Get an account by ID","description":"\n\nMiddlewares: `authMiddleware`, `validateParamsAccount`","x-middlewares":["`authMiddleware`","`validateParamsAccount`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Accounts"],"parameters":[{"schema":{"type":"string","example":"auth0|60452f4c0dc85b0062326","description":"Auth Account ID"},"required":true,"description":"Auth Account ID","name":"accountId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"organizationId":{"type":"string","format":"uuid"},"roles":{"type":"array","items":{"type":"string"}},"isMfaEnabled":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","email","organizationId","roles","isMfaEnabled","createdAt","updatedAt"]}}}}}}},"/organizations/":{"post":{"summary":"Create a new organization","description":"Creates a new organization with the provided details.\n\n\nMiddlewares: `authMiddleware`","x-middlewares":["`authMiddleware`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","example":"private","description":"The type or category of the organization"}},"required":["kind"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}},"get":{"summary":"Get all organizations","description":"Retrieves all organizations accessible to the current user.\n\n\nMiddlewares: `authMiddleware`","x-middlewares":["`authMiddleware`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}}}},"/organizations/{organizationId}":{"get":{"summary":"Get an organization by ID","description":"Retrieves the details of a specific organization by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateOrganization`","x-middlewares":["`authMiddleware`","`validateOrganization`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"organizationId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}},"patch":{"summary":"Update an organization by ID","description":"Updates the details of a specific organization by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateOrganization`, `validateOrganizationUpdate`","x-middlewares":["`authMiddleware`","`validateOrganization`","`validateOrganizationUpdate`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"organizationId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Acme Inc.","description":"The name of the organization"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"kind":{"type":"string","example":"private","description":"The type or category of the organization"},"meta":{"type":"object","additionalProperties":{"nullable":true},"example":{"key":"value"},"description":"Additional metadata for the entry"}},"required":["organization"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}},"post":{"summary":"Update an organization by ID","description":"Updates the details of a specific organization by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateOrganization`, `validateOrganizationUpdate`","x-middlewares":["`authMiddleware`","`validateOrganization`","`validateOrganizationUpdate`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"organizationId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Acme Inc.","description":"The name of the organization"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"kind":{"type":"string","example":"private","description":"The type or category of the organization"},"meta":{"type":"object","additionalProperties":{"nullable":true},"example":{"key":"value"},"description":"Additional metadata for the entry"}},"required":["organization"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}},"delete":{"summary":"Delete an organization by ID","description":"Deletes a specific organization by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateOrganization`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateOrganization`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Organizations"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"organizationId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"kind":{"type":"string"}},"required":["id","name","email"]}}}}}}},"/devices/":{"post":{"summary":"Create a new device","description":"Create a new device and associate it with the current organization.\n\n\nMiddlewares: `authMiddleware`, `validateBodyOrganization`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateBodyOrganization`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"patient":{"type":"string","nullable":true,"example":null,"description":"Patient ObjectId"},"paper":{"type":"string","nullable":true,"example":null,"description":"Paper ObjectId"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"Organization ObjectId"}},"required":["organization"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"serialNumber":{"type":"string"},"status":{"type":"string","enum":["online","offline","error"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","createdAt","updatedAt"]}}}}}},"get":{"summary":"Query devices by user","description":"Retrieve a paginated list of devices visible to the authenticated user.\n\n\nMiddlewares: `authMiddleware`, `validateQuerySearchUserAndOrganization`","x-middlewares":["`authMiddleware`","`validateQuerySearchUserAndOrganization`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"John","description":"Name to filter by"},"required":false,"description":"Name to filter by","name":"name","in":"query"},{"schema":{"type":"string","example":"admin","description":"Role to filter by"},"required":false,"description":"Role to filter by","name":"role","in":"query"},{"schema":{"type":"string","example":"createdAt","description":"Field to sort by"},"required":false,"description":"Field to sort by","name":"sortBy","in":"query"},{"schema":{"type":"string","example":"","description":"Search term to filter results"},"required":false,"description":"Search term to filter results","name":"search","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":10,"description":"Number of items per page"},"required":false,"description":"Number of items per page","name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"maximum":100000,"example":0,"description":"Offset for pagination, used to skip a number of items"},"required":false,"description":"Offset for pagination, used to skip a number of items","name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":1,"description":"Page number for pagination"},"required":false,"description":"Page number for pagination","name":"page","in":"query"},{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"required":false,"description":"A valid MongoDB ObjectId","name":"patient","in":"query"},{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":false,"description":"A valid MongoDB ObjectId","name":"organization","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"serialNumber":{"type":"string"},"status":{"type":"string","enum":["online","offline","error"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","createdAt","updatedAt"]}}}}}}}},"/devices/events/{deviceId}":{"get":{"summary":"Get events for a device","description":"Fetch a chronological list of events generated by the specified device.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"DateStart","in":"query"},{"schema":{"type":"string"},"required":true,"name":"DateEnd","in":"query"},{"schema":{"type":"string"},"required":false,"name":"TypeFilter","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"deviceId":{"type":"string"},"type":{"type":"string"},"payload":{"type":"object","additionalProperties":{"nullable":true}},"timestamp":{"type":"string"}},"required":["id","deviceId","type","payload","timestamp"]}}}}}}}},"/devices/{deviceId}":{"get":{"summary":"Get a device by ID","description":"Retrieve detailed information for the device identified by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"deviceId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"serialNumber":{"type":"string"},"status":{"type":"string","enum":["online","offline","error"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","createdAt","updatedAt"]}}}}}},"post":{"summary":"Update a device","description":"Modify the properties of an existing device identified by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`, `validateOrganizationUpdate`","x-middlewares":["`authMiddleware`","`validateDevice`","`validateOrganizationUpdate`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"deviceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"intake":{"type":"object","additionalProperties":{"nullable":true}},"meta":{"type":"object","additionalProperties":{"nullable":true}},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"patient":{"type":"string","nullable":true,"example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"paper":{"type":"string","nullable":true,"example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"kind":{"type":"string"},"deviceId":{"type":"string"},"alarmEnable":{"type":"integer"},"takeOffsetTime":{"type":"integer"},"iotDevice":{"type":"object","additionalProperties":{"nullable":true}},"payment":{"type":"object","additionalProperties":{"nullable":true}}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"serialNumber":{"type":"string"},"status":{"type":"string","enum":["online","offline","error"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","createdAt","updatedAt"]}}}}}},"delete":{"summary":"Delete a device","description":"Remove the specified device from the system.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateDevice`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"deviceId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"nullable":true},"description":"Generic response payload"}}}}}}},"/devices/registerdevice/{deviceId}":{"post":{"summary":"Register a device","description":"Associate an existing device with the authenticated organization.\n\n\nMiddlewares: `authMiddleware`, `validateBodyOrganization`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateBodyOrganization`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","description":"Device serial","example":"DEVICE-EXAMPLE"},"required":true,"description":"Device serial","name":"deviceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"enable":{"type":"boolean"},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"patient":{"type":"string","nullable":true,"example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"paper":{"type":"string","nullable":true,"example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"}},"required":["enable","organization"],"example":{"enable":true,"organization":"682fd0d7d4a6325d9d45b86d","patient":"682fd0d7d4a6325d9d45b86d","paper":null}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"nullable":true},"description":"Generic response payload"}}}}}}},"/devices/ping/{deviceId}":{"get":{"summary":"Ping a device","description":"Check connectivity and round-trip time to the specified device.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"},{"schema":{"type":"string","description":"Data response","example":"false"},"required":true,"description":"Data response","name":"dataResponse","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"nullable":true},"description":"Generic response payload"}}}}}}},"/devices/reset/{deviceId}":{"post":{"summary":"Reset the sensors of a device","description":"Remotely reset all sensors on the target device to factory defaults.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateDevice`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Reset all Variables and Memory and reboot Device: nrf-352656106701140","description":"Response message from reset operation"},"success":{"type":"boolean","example":true,"description":"Indicates if the reset operation was successful"}},"required":["message","success"]}}}}}}},"/devices/reboot/{deviceId}":{"post":{"summary":"Reboot a device","description":"Initiate a remote reboot of the specified device.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`, `validateOrganizationDelete`","x-middlewares":["`authMiddleware`","`validateDevice`","`validateOrganizationDelete`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"deviceId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"nullable":true},"description":"Generic response payload"}}}}}}},"/iotdevice/events/{deviceId}":{"get":{"summary":"Get events for a device","description":"Fetches event records for the specified device by its ID.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["IoTDevice"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"},{"schema":{"type":"string","description":"Start date (ISO‐string)","example":"2025-05-01T00:00:00Z"},"required":true,"description":"Start date (ISO‐string)","name":"DateStart","in":"query"},{"schema":{"type":"string","description":"End date (ISO‐string)","example":"2025-05-31T23:59:59Z"},"required":true,"description":"End date (ISO‐string)","name":"DateEnd","in":"query"},{"schema":{"type":"string","default":"","description":"Optional type filter","example":""},"required":false,"description":"Optional type filter","name":"TypeFilter","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"eventId":{"type":"string"},"deviceId":{"type":"string"},"timestamp":{"type":"string"},"type":{"type":"string"},"payload":{"nullable":true}},"required":["eventId","deviceId","timestamp","type"]}}}}}}}},"/iotdevice/status/{kind}":{"get":{"summary":"Get API status by kind","description":"Retrieves the IoT API status information for a given status kind to monitor system health or performance. Can be accessed without authentication for monitoring purposes.\n\n\nMiddlewares: ","x-middlewares":[],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["IoTDevice"],"parameters":[{"schema":{"type":"string","description":"Kind of API status","example":"iot"},"required":true,"description":"Kind of API status","name":"kind","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"status":{"type":"string","enum":["ok","degraded","down"]},"uptimeSeconds":{"type":"number"}},"required":["kind","status","uptimeSeconds"]}}}}}}},"/papers/uploadSingleImage/{paperId}":{"post":{"summary":"Upload a single image for a paper","description":"Handles uploading one or more images and attaches them to the specified paper.","security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"picture":{"type":"string","format":"binary","description":"Source image file. Older clients may send this field twice."},"pictureDevice":{"type":"string","format":"binary","description":"Optional device-ready image uploaded without extra processing."},"pictureEditable":{"type":"string","description":"Optional JSON string with editable canvas state."},"settings":{"type":"string","description":"Optional JSON string merged into paper.meta before upload."}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}}},"/papers/":{"post":{"summary":"Create a new paper entry","description":"Creates a new screen (paper) to be displayed on the ePaper device.\n\n\nMiddlewares: `authMiddleware`, `validateDeviceIsInOrganization`","x-middlewares":["`authMiddleware`","`validateDeviceIsInOrganization`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"deviceId":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"devicePaperId":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"kind":{"type":"string"},"meta":{"nullable":true},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"}},"required":["deviceId","kind","organization"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}},"get":{"summary":"Query papers by device or organization","description":"Retrieves paper entries (screens) filtered by device or by organization when no device is provided.\n\n\nMiddlewares: `authMiddleware`, `validateDeviceOrOrganizationQuery`","x-middlewares":["`authMiddleware`","`validateDeviceOrOrganizationQuery`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"John","description":"Name to filter by"},"required":false,"description":"Name to filter by","name":"name","in":"query"},{"schema":{"type":"string","example":"admin","description":"Role to filter by"},"required":false,"description":"Role to filter by","name":"role","in":"query"},{"schema":{"type":"string","example":"createdAt","description":"Field to sort by"},"required":false,"description":"Field to sort by","name":"sortBy","in":"query"},{"schema":{"type":"string","example":"","description":"Search term to filter results"},"required":false,"description":"Search term to filter results","name":"search","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":10,"description":"Number of items per page"},"required":false,"description":"Number of items per page","name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"maximum":100000,"example":0,"description":"Offset for pagination, used to skip a number of items"},"required":false,"description":"Offset for pagination, used to skip a number of items","name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100000,"example":1,"description":"Page number for pagination"},"required":false,"description":"Page number for pagination","name":"page","in":"query"},{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"required":false,"description":"A valid MongoDB ObjectId","name":"deviceId","in":"query"},{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"},"required":false,"description":"A valid MongoDB ObjectId","name":"organization","in":"query"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"nullable":true}},"totalResults":{"type":"number","example":100,"description":"Total number of items"},"totalPages":{"type":"number","example":10,"description":"Total number of pages"},"page":{"type":"number","example":1,"description":"Current page number"},"limit":{"type":"number","example":10,"description":"Number of items per page"}},"required":["results","totalResults","totalPages","page","limit"]}}}}}}},"/papers/{paperId}":{"get":{"summary":"Get a paper entry by ID","description":"Fetches the details of a single paper (screen) by its ID.\n\n\nMiddlewares: `authMiddleware`, `validatePaper`","x-middlewares":["`authMiddleware`","`validatePaper`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"return":{"type":"string"}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}},"post":{"summary":"Update a paper entry by ID","description":"Updates the content or settings of an existing paper (screen).\n\n\nMiddlewares: `authMiddleware`, `validateDeviceIsInOrganization`, `validatePaper`","x-middlewares":["`authMiddleware`","`validateDeviceIsInOrganization`","`validatePaper`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"deviceId":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"A valid MongoDB ObjectId"},"devicePaperId":{"type":"string","example":"682fd0d7d4a6325d9d45b86d","description":"A valid MongoDB ObjectId"},"kind":{"type":"string"},"meta":{"nullable":true},"organization":{"type":"string","example":"682fd0d7d4a6325d9d45b86e","description":"A valid MongoDB ObjectId"}},"required":["deviceId","kind","organization"]}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}}},"/papers/calendar/{paperId}":{"get":{"summary":"Get calendar data for a paper entry","description":"Generates and returns calendar view data for the given paper.\n\n\nMiddlewares: `authMiddleware`, `validatePaper`","x-middlewares":["`authMiddleware`","`validatePaper`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}}},"/papers/{paperId}/calendar-preview":{"post":{"summary":"Preview Google Calendar data","description":"Fetches the latest Google Calendar events for the specified paper without persisting any other paper changes.\n\n\nMiddlewares: `authMiddleware`, `validatePaper`","x-middlewares":["`authMiddleware`","`validatePaper`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"selectedCalendars":{"type":"object","additionalProperties":{"type":"boolean"}},"dayRange":{"type":"number","minimum":1,"maximum":100},"maxEvents":{"type":"number","minimum":1,"maximum":200}},"example":{"selectedCalendars":{"primary":true},"dayRange":7,"maxEvents":10}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"calendarAuth":{"type":"object","additionalProperties":{}},"calendarData":{"type":"object","properties":{"calendars":{"type":"array","items":{"nullable":true}},"events":{"type":"array","items":{"nullable":true}}},"required":["calendars","events"]}}}}}}}}},"/papers/image/{paperId}":{"post":{"summary":"Generate a signed file URL for a paper image","description":"Creates a temporary signed URL for uploading an image to storage.\n\n\nMiddlewares: `authMiddleware`, `validatePaper`","x-middlewares":["`authMiddleware`","`validatePaper`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Papers"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b870","description":"A valid MongoDB ObjectId"},"required":true,"description":"A valid MongoDB ObjectId","name":"paperId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"return":{"type":"string"}}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"author":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"imageUpdatedAt":{"type":"string"}},"required":["id","title","author","createdAt","updatedAt"]}}}}}}},"/devices/image/{deviceId}/{uuid}":{"get":{"summary":"Fetch an image by UUID","description":"Download a previously uploaded image for the device by its UUID.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"},{"schema":{"type":"string","description":"Image UUID"},"required":true,"description":"Image UUID","name":"uuid","in":"path"}],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}}}}},"/devices/updateSingleImageMeta/{deviceId}":{"post":{"summary":"Update image metadata","description":"Modify metadata (e.g., title, tags) for an existing device image.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","additionalProperties":{"nullable":true}},"uuid":{"type":"string"}},"description":"Image metadata updates"}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"deviceMeta":{"nullable":true},"deviceUpdate":{"nullable":true},"iotUpload":{"nullable":true},"url":{"type":"string"}}}}}}}}},"/devices/uploadSingleImage/{deviceId}":{"post":{"summary":"Upload one or two images","description":"Upload up to two image files to the device for processing or storage.\n\n\nMiddlewares: `authMiddleware`, `multerMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`multerMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"parameters":[{"schema":{"type":"string","example":"682fd0d7d4a6325d9d45b86f","description":"Device ObjectId"},"required":true,"description":"Device ObjectId","name":"deviceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","description":"Optional image UUID","example":"mock-uuid"}},"description":"Multipart body is mocked during tests.","example":{"uuid":"mock-uuid"}}}}},"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"deviceMeta":{"nullable":true},"deviceUpdate":{"nullable":true},"iotUpload":{"nullable":true},"url":{"type":"string"}}}}}}}}},"/devices/updateSingleImageFromWebsite/{deviceId}":{"post":{"summary":"Upload image from website URL","description":"Fetch and upload an image to the device by providing its URL.\n\n\nMiddlewares: `authMiddleware`, `validateDevice`","x-middlewares":["`authMiddleware`","`validateDevice`"],"security":[{"bearerAuth":[]},{"x-api-key":[]}],"tags":["Devices"],"responses":{"200":{"description":"Object with user data.","content":{"application/json":{"schema":{"type":"object","properties":{"deviceMeta":{"nullable":true},"deviceUpdate":{"nullable":true},"iotUpload":{"nullable":true}}}}}}}}}}}