{"id":20008652,"url":"https://github.com/whysobad/tria-backend","last_synced_at":"2026-05-15T07:08:59.399Z","repository":{"id":144087274,"uuid":"402544570","full_name":"WhySoBad/tria-backend","owner":"WhySoBad","description":"Backend for the tria messenger","archived":false,"fork":false,"pushed_at":"2021-09-23T19:57:24.000Z","size":660,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-12T14:27:27.419Z","etag":null,"topics":["backend","chat","messenger","node","tria","typescript"],"latest_commit_sha":null,"homepage":"https://tria.chat","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WhySoBad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-02T19:49:21.000Z","updated_at":"2021-09-26T14:21:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"a6473221-4ffe-4602-9730-54f1622061ab","html_url":"https://github.com/WhySoBad/tria-backend","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WhySoBad%2Ftria-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WhySoBad%2Ftria-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WhySoBad%2Ftria-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WhySoBad%2Ftria-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WhySoBad","download_url":"https://codeload.github.com/WhySoBad/tria-backend/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241447079,"owners_count":19964254,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","chat","messenger","node","tria","typescript"],"created_at":"2024-11-13T07:11:08.339Z","updated_at":"2026-05-15T07:08:54.359Z","avatar_url":"https://github.com/WhySoBad.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![backend_banner](https://user-images.githubusercontent.com/49595640/130368274-f91f047e-635f-44c7-ac6d-36e2559ad043.png)\n\n# Backend\n\n## Related Projects\n\n- [tria-frontend](https://github.com/WhySoBad/tria-frontend)\n- [tria-client](https://github.com/WhySoBad/tria-client)\n\n## Usage\n\n### Installation\n\n```cmd\ngit clone https://github.com/WhySoBad/tria-backend.git\n```\n\n```cmd\ncd tria-backend\n```\n\n```cmd\nnpm install\n```\n\n### Developer Mode\n\n```cmd\nnpm run start:dev\n```\n\nAPI is available on [localhost at port 443](http://localhost:443)\n\n### Build\n\n```cmd\nnpm run start\n```\n\nAPI is available on [localhost at port 443](http://localhost:443)\n\n## API\n\n### Validate Auth Token\n\n\u003e Endpoint to validate an user auth token\n\n\u003e Authorization header required\n\n```http\nGET /auth/validate\n```\n\n#### Response\n\nBoolean whether the token is valid or not\n\n#### Errors\n\n```http\n400 No Token Provided\n```\n\n### Login\n\n\u003e Endpoint to log an user in using its credentials\n\n```http\nPOST /auth/login\n```\n\n#### Body\n\n```typescript\n{\n  username: string,\n  password: string,\n}\n```\n\n#### Response\n\nUser auth token as string\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n400 Invalid Credentials\n```\n\n### Create Private Chat\n\n\u003e Endpoint to create a new private chat with another user\n\n\u003e Authorization header required\n\n```http\nPOST /chat/create/private\n```\n\n#### Body\n\n```typescript\n{\n  user: string,\n}\n```\n\n#### Response\n\nChat uuid as string\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n404 Participant Not Found\n```\n\n```http\n400 Private Chat Already Exists\n```\n\n### Create Group Chat\n\n\u003e Endpoint to create a new group chat\n\n\u003e Authorization header required\n\n```http\nPOST /chat/create/group\n```\n\n#### Body\n\n```typescript\n{\n  name: string,\n  tag: string,\n  type: ChatType,\n  description: string,\n  members: Array\u003c{ uuid: string; role: GroupRole; }\u003e,\n}\n```\n\n#### Response\n\nChat uuid as string\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n400 Group Tag Has To Be Unique\n```\n\n### Check Group Tag\n\n\u003e Endpoint to check whether a given group tag does already exist\n\n```http\nGET /chat/check/tag/[tag]\n```\n\n#### Response\n\nBoolean whether the tag already exists or not\n\n### Join Group\n\n\u003e Endpoint to join an existing group\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/join\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Group Not Found\n```\n\n```http\n400 Chat Has To Be Group\n```\n\n```http\n403 User Is Banned\n```\n\n```http\n400 User Is Already Joined\n```\n\n```http\n404 User Not Found\n```\n\n### Leave Group\n\n\u003e Endpoint to leave an existing group\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/leave\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Group Not Found\n```\n\n```http\n400 Chat Has To Be Group\n```\n\n```http\n404 User Not Found\n```\n\n```http\n400 Owner Can't Leave The Group\n```\n\n### Delete Chat\n\n\u003e Endpoint to delete an existing chat\n\n\u003e Authorization header required\n\n```http\nDELETE /chat/[uuid]/delete\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n404 User Not Found\n```\n\n```http\n401 Only Owner Can Delete A Group\n```\n\n### Ban Group Member\n\n\u003e Endpoint to ban a member in a group\n\n\u003e Admin role with ban permission or owner role required\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/admin/ban\n```\n\n#### Body\n\n```typescript\n{\n  uuid: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n400 Chat Has To Be Group\n```\n\n```http\n400 User Is Already Banned\n```\n\n```http\n404 User Not Found\n```\n\n```http\n401 Owner Can't Be Banned\n```\n\n### Unban Group Member\n\n\u003e Endpoint to unban a banned member in a group\n\n\u003e Admin role with unban permission or owner role required\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/admin/unban\n```\n\n#### Body\n\n```typescript\n{\n  uuid: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n400 Chat Has To Be Group\n```\n\n```http\n404 User Isn't Banned\n```\n\n```http\n404 User Not Found\n```\n\n### Kick Group Member\n\n\u003e Endpoint to kick a member in a group\n\n\u003e Admin role with kick permission or owner role required\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/admin/kick\n```\n\n#### Body\n\n```typescript\n{\n  uuid: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n400 Chat Has To Be Group\n```\n\n```http\n404 User Not Found\n```\n\n```http\n401 Owner Can't Be Kicked\n```\n\n### Get Group Preview\n\n\u003e Endpoint to get a preview of a chat\n\n```http\nGET /chat/[uuid]/preview\n```\n\n#### Response\n\n```typescript\n{\n  uuid: string,\n  type: ChatType,\n  description: string,\n  name: string,\n  tag: string,\n  size: number,\n  online: number,\n  avatar: string | null,\n}\n```\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n400 Can't Get Preview Of Private Group\n```\n\n```http\n400 Can't Get Preview Of Private Chat\n```\n\n### Get Chat Messages\n\n\u003e Endpoint to get a specific amount of messages older than a given timestamp\n\n\u003e User has to be a member of the chat\n\n\u003e Authorization header required\n\n```http\nGET /chat/[uuid]/messages/get/[timestamp]/[amount]\n```\n\n#### Response\n\n```typescript\n{\n  messages: Array\u003c{\n    uuid: string,\n    sender: string,\n    chat: string,\n    createdAt: Date,\n    editedAt: Date | null,\n    edited: number,\n    text: string,\n  }\u003e,\n  log: Array\u003c{\n    user: string,\n    chat: string,\n    timestamp: Date,\n    joined: boolean,\n  }\u003e,\n  last: boolean,\n}\n```\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n### Read Chat Messages\n\n\u003e Endpoint to mark messages after a given timestamp as read\n\n\u003e User has to be a member of the chat\n\n\u003e Authorization header required\n\n```http\nGET /chat/[uuid]/messages/read/[timestamp]\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Timestamp Can't Be In The Future\n```\n\n```http\n404 User Not Found\n```\n\n```http\n400 User Has Already Read Further\n```\n\n### Get Chat\n\n\u003e Endpoint to get all informations about a chat\n\n\u003e User has to be a member of the chat\n\n\u003e Authorization header required\n\n```http\nGET /chat/[uuid]\n```\n\n#### Response\n\n```typescript\n{\n  uuid: string,\n  type: ChatType,\n  name: string | null,\n  tag: string | null,\n  description: string | null,\n  createdAt: Date,\n  lastRead: Date,\n  members: Array\u003c{\n    joinedAt: Date,\n    role: GroupRole,\n    user: {\n      uuid: string,\n      createdAt: Date,\n      lastSeen: Date,\n      name: string,\n      tag: string,\n      description: string,\n      avatar: string | null,\n      locale: Locale,\n      online: boolean,\n    },\n    promotedAt: Date, //only when member is admin\n    permissions: Array\u003cPermission\u003e, //only when member is admin\n  }\u003e,\n  messages: Array\u003c{\n    uuid: string,\n    sender: string,\n    chat: string,\n    createdAt: Date,\n    editedAt: Date | null,\n    edited: number,\n    text: string,\n  }\u003e,\n  banned: Array\u003c{\n    bannedAt: Date,\n    user: {\n      uuid: string,\n      createdAt: Date,\n      name: string,\n      tag: string,\n      description: string,\n      avatar: string | null,\n    },\n  }\u003e,\n  memberLog: Array\u003c{\n    user: string,\n    chat: string,\n    timestamp: Date,\n    joined: boolean,\n  }\u003e,\n}\n```\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n### Get Group Avatar\n\n\u003e Endpoint to get the avatar of a group\n\n```http\nGET /chat/[uuid]/avatar\n```\n\n#### Response\n\nThe avatar of the chat as a .jpeg file\n\n#### Errors\n\n```http\n404 Avatar Not Found\n```\n\n### Upload Group Avatar\n\n\u003e Endpoint to upload an avatar for a group\n\n\u003e Admin role with chat edit permission or owner role required\n\n\u003e Authorization header required\n\n```http\nPOST /chat/[uuid]/avatar/upload\n```\n\n#### Body\n\nFormData with the name \"avatar\" and an avatar image in the .jpeg format\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Maximum File Size Is 100'000 Bytes\n```\n\n```http\n400 File Has To Be Of Type JPEG\n```\n\n```http\n400 Invalid File\n```\n\n```http\n404 Chat Not Found\n```\n\n### Delete Group Avatar\n\n\u003e Endpoint to delete an avatar of a group\n\n\u003e Admin role with chat edit permission or owner role required\n\n\u003e Authorization header required\n\n```http\nDELETE /chat/[uuid]/avatar/delete\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Chat Not Found\n```\n\n```http\n400 Chat Has To Be Of Type Group\n```\n\n```http\n404 User Not Found\n```\n\n```http\n404 Avatar Not Found\n```\n\n### Search Groups and User\n\n\u003e Endpoint to search new groups and user\n\n\u003e Authorization header required\n\n```http\nPOST /search\n```\n\n#### Body\n\n```typescript\n{\n  text: string,\n  checkUser?: boolean,\n  checkChat?: boolean,\n  checkUuid?: boolean,\n  checkTag?: boolean,\n  checkName?: boolean,\n}\n```\n\n#### Response\n\nArray with UserPreview and ChatPreview objects\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n### Register New User\n\n\u003e Endpoint to register a new user\n\n```http\nPOST /user/register\n```\n\n#### Body\n\n```typescript\n{\n  mail: string,\n  password: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Mail Has To Be Unique\n```\n\n### Validate Register Token\n\n\u003e Endpoint to validate whether a register token is valid or not\n\n```http\nGET /user/register/validate/[token]\n```\n\n#### Response\n\nBoolean whether the token is valid or not\n\n### Finish User Registration\n\n\u003e Endpoint to finish the registration of an user\n\n```http\nPOST /user/register/verify\n```\n\n#### Body\n\n```typescript\n{\n  token: string,\n  name: string,\n  tag: string,\n  description: string,\n  locale: Locale,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Invalid Registration Token\n```\n\n```http\n404 User Not Found\n```\n\n```http\n400 Tag Has To Be Unique\n```\n\n### Check User Tag\n\n\u003e Endpoint to check whether a tag does already exist\n\n```http\nGET /user/check/tag/[tag]\n```\n\n#### Response\n\nBoolean whether the tag does already exist or not\n\n### Check User Mail\n\n\u003e Endpoint to check whether a mail is already used\n\n```http\nGET /user/check/mail/[mail]\n```\n\n#### Response\n\nBoolean whether the mail is already used or not\n\n### Edit User\n\n\u003e Endpoint to edit an user\n\n\u003e Authorization header required\n\n```http\nPUT /user/edit\n```\n\n#### Body\n\n```typescript\n{\n  name?: string,\n  tag?: string,\n  description?: string,\n  locale?: Locale,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n400 Tag Has To Be Unique\n```\n\n### Change Password\n\n\u003e Endpoint to change the password using the old password\n\n\u003e Authorization header required\n\n```http\nPUT /user/password/change\n```\n\n#### Body\n\n```typescript\n{\n  old: string,\n  new: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n400 Invalid Password\n```\n\n### Request Password Reset\n\n\u003e Endpoint to request a mail to reset the password\n\n```http\nPOST /user/password/reset\n```\n\n#### Body\n\n```typescript\n{\n  mail: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 Mail Not Found\n```\n\n```http\n503 Failed To Send Mail\n```\n\n### Validate Password Reset Token\n\n\u003e Endpoint to validate whether a password reset token is valid\n\n```http\nGET /user/password/reset/validate/[token]\n```\n\n#### Response\n\nBoolean whether a password reset token is valid or not\n\n### Confirm Password Reset\n\n\u003e Endpoint to confirm a password reset and to set a new password\n\n```http\nPOST /user/password/reset/confirm\n```\n\n#### Body\n\n```typescript\n{\n  token: string,\n  password: string,\n}\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Invalid Reset Token\n```\n\n```http\n404 User Not Found\n```\n\n### Delete User\n\n\u003e Endpoint to delete an user\n\n\u003e Authorization header required\n\n```http\nDELETE /user/delete\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n### Get User Information\n\n\u003e Endpoint to get all information about an user\n\n\u003e Authorization header required\n\n```http\nGET /user/current\n```\n\n#### Response\n\n```typescript\n{\n  uuid: string,\n  name: string,\n  tag: string,\n  avatar: string | null,\n  description: string,\n  mail: string,\n  locale: Locale,\n  online: boolean,\n  createdAt: Date,\n  lastSeen: Date,\n  chats: Array\u003cstring\u003e,\n}\n```\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n### Get User Preview\n\n\u003e Endpoint to get a preview of an user\n\n```http\nGET /user/[uuid]\n```\n\n#### Response\n\n```typescript\n{\n  uuid: string,\n  name: string,\n  tag: string,\n  avatar: string | null,\n  description: string,\n}\n```\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n### Get User Avatar\n\n\u003e Endpoint to get the avatar of an user\n\n```http\nGET /user/[uuid]/avatar\n```\n\n#### Response\n\nThe avatar of the chat as a .jpeg file\n\n#### Errors\n\n```http\n404 Avatar Not Found\n```\n\n### Upload User Avatar\n\n\u003e Endpoint to upload an avatar for an user\n\n\u003e Authorization header required\n\n```http\nPOST /user/avatar/upload\n```\n\n#### Body\n\nFormData with the name \"avatar\" and an avatar image in the .jpeg format\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n400 Maximum File Size Is 100'000 Bytes\n```\n\n```http\n400 File Has To Be Of Type JPEG\n```\n\n```http\n400 Invalid File\n```\n\n```http\n404 User Not Found\n```\n\n### Delete User Avatar\n\n\u003e Endpoint to delete an avatar of an user\n\n\u003e Authorization header required\n\n```http\nDELETE /user/avatar/delete\n```\n\n#### Response\n\nVoid\n\n#### Errors\n\n```http\n404 User Not Found\n```\n\n```http\n404 Avatar Not Found\n```\n\n## License\n\nAGPL © [WhySoBad](https://github.com/WhySoBad)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhysobad%2Ftria-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhysobad%2Ftria-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhysobad%2Ftria-backend/lists"}