{"id":20510291,"url":"https://github.com/lintang-b-s/chat-be","last_synced_at":"2026-01-21T06:04:21.818Z","repository":{"id":198268004,"uuid":"699921352","full_name":"lintang-b-s/chat-be","owner":"lintang-b-s","description":"highly scalable chat backend api using websocket, redis, edenAI API, and postgres.  whatsapp clone. Postman: https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a\u0026target_code=64d73c34516d85e5cb485c9c40a91be8 . ","archived":false,"fork":false,"pushed_at":"2024-04-23T06:50:59.000Z","size":728,"stargazers_count":3,"open_issues_count":12,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T20:57:16.262Z","etag":null,"topics":["ai","clean-arc","gin","go","golang","postgresql","redis","websocket"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lintang-b-s.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":"2023-10-03T15:44:38.000Z","updated_at":"2024-04-23T06:51:02.000Z","dependencies_parsed_at":"2024-11-15T20:39:06.021Z","dependency_job_id":null,"html_url":"https://github.com/lintang-b-s/chat-be","commit_stats":null,"previous_names":["lintang-b-s/chat-be"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lintang-b-s%2Fchat-be","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lintang-b-s%2Fchat-be/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lintang-b-s%2Fchat-be/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lintang-b-s%2Fchat-be/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lintang-b-s","download_url":"https://codeload.github.com/lintang-b-s/chat-be/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281424,"owners_count":21077423,"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":["ai","clean-arc","gin","go","golang","postgresql","redis","websocket"],"created_at":"2024-11-15T20:28:52.766Z","updated_at":"2026-01-21T06:04:21.791Z","avatar_url":"https://github.com/lintang-b-s.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chat-be\n highly scalable chat backend api using websocket, redis, and postgres.\n \u003cbr/\u003e \u003cbr/\u003e\n fitur: \n```\n 1. autentikasi (login, register, logout, renewAccToken)\n 2. add user to contact \u0026 get user contact\n 3. private chat dg chatbot\n 4. private_chat dg user lain yang sudah ditambahkan ke contact\n 5. create group chat , add member to group chat, remove member from group chat\n 6. group chat dg user yg sudah ditambahkan sebagai member groupchat\n 7. memanggil chatbot di groupchat \n 8. mendapatkan semua message private chat \u0026 message private by friend\n 9. mendapatkan semua message di groupchat\n 10. Meski user terhubung ke chat-server yang berbeda-beda , mereka tetap akan bisa berkomunikasi karena adanya redis pub-sub \n```\n\n## Content\n- [General System Design Part 1](##1-on-1-chat-flow-usera-dan-userb-terhubung-ke-instan-chat-server-yang-sama)\n- [API Docs](#api-docs)\n- [Quick Start / Cara menjalankan Aplikasi](#quick-start)\n- [General System Design Part 2](#online-presence)\n\n\n## ChatHub struct \u0026 User struct\n![ChatHub struct \u0026 User Struct](https://res.cloudinary.com/dex4u3rw4/image/upload/v1697371903/ChatHubdanUser_vjzyku.png)\n\n\n\n## 1 on 1 Chat Flow (UserA dan UserB terhubung ke instan chat-server yang sama)\n![one-on-one chat flow server sama ](https://res.cloudinary.com/dex4u3rw4/image/upload/v1697371903/one-on-one-server-sama_ohixbk.png)\n\n## 1 on 1 Chat Flow (Semua user terhubung ke instan chat-server yang berbeda)\n![one-on-one chat flow server beda](https://res.cloudinary.com/dex4u3rw4/image/upload/v1697371913/one-on-one-beda-server_n2so7t.png)\n\n-\n\n![one-on-one chat flow 2](https://res.cloudinary.com/dex4u3rw4/image/upload/v1696433562/one-on-one_copy_v2my4l.jpg)\n\n## Message table for 1 on 1 chat\n![message table for 1 on 1 chat](https://res.cloudinary.com/di0pjroxh/image/upload/v1697274479/one-on-one-messageTable_ptublq.png)\n\nMessages_id digenerate menggunakan https://github.com/sony/sonyflake, yg mana besarnya integer id yg digenerate tergantung waktu saat id digeneraete\n\u003cbr/\u003e\nuntuk mendapatkan messages yang diurutkan berdasarkan time (dari paling lama -\u003e terbaru) bisa pakai query \"order by id asc\".\n\n## Group Chat Flow\n![group-chat flow](https://bytebytego.com/_next/image?url=%2Fimages%2Fcourses%2Fsystem-design-interview%2Fdesign-a-chat-system%2Ffigure-12-14-DRZR5QM7.png\u0026w=1080\u0026q=75)\n\n## Message table for group chat\n![group-chat message table](https://bytebytego.com/_next/image?url=%2Fimages%2Fcourses%2Fsystem-design-interview%2Fdesign-a-chat-system%2Ffigure-12-10-2TIQVS3D.png\u0026w=750\u0026q=75)\n\n## API docs\nada di docs/swagger.yaml \u003cbr/\u003e \u003cbr/\u003e\npostman collection ada di https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a\u0026target_code=64d73c34516d85e5cb485c9c40a91be8 \u0026 jalankan di postman dekstop karena localhost ( setiap koneksi websocket harus menggunakan otp / harus login lagi)\n\n## Quick Start\n\n\n1. install golang \u0026 set GOPATH Variabel di OS kalian: \n```\n Windows: https://www.youtube.com/watch?v=xYpqI7GRrvE\n Mac: https://www.youtube.com/watch?v=HrFqH6Dj6kk\n Linux: https://www.youtube.com/watch?v=G36tXSWlUnE\n \n GOPATH: \n https://www.youtube.com/watch?v=eJVq-idZDMo\n windows: https://www.youtube.com/watch?v=kjr3mOPv8Sk\n windows \u0026 unix: https://github.com/golang/go/wiki/SettingGOPATH\n mac: https://www.youtube.com/watch?v=FTDOW8UbKjQ\n```\n\n\n2. install go-migrate\n```\n    go install -tags \"postgres,mysql\" github.com/golang-migrate/migrate/v4/cmd/migrate@latest\n    untuk mengecek sudah diinstal belum: ketik migrate\n```\n\n3. install makefile\n```\n    windowss: https://linuxhint.com/run-makefile-windows/\n    mac: https://formulae.brew.sh/formula/make\n    linux:  https://www.youtube.com/watch?v=PLFzCOPPrPc\n    \n```\n\n3. install docker\n```\n    windows: https://www.youtube.com/watch?v=XgRGI0Pw2mM\n    mac: https://www.youtube.com/watch?v=-y1BmDbcaEU\n        \n```\n\n4. jalankan redis \u0026 postgresqql di local;\n```\n redis:\n  mac: brew services start redis\n  windows: https://linuxhint.com/install-run-redis-windows/\n\n  \n```\n\n4. (optional jika belum install redis \u0026 postgres) buat container postgresql, redis di docker\n```\n    docker compose up -d\n```\n\n5. create migration file\n```\n    migrate create -ext sql -dir migrations create_chat_app_table\n```\n\n6. open pg-admin in localhost:5050 or enter postggres cli. create database chat\n7. execute this command in query-tool pg-admin\n```\n    CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n\n```\n8. menjalankan migration\n```\n    migrate -database \"postgres://postgres:pass@localhost:5432/chat?sslmode=disable\" -path migrations up\n```\n\n9. buat file .env dan isi sesuai .env.example \u0026 buat akun https://www.edenai.co/ \u0026 copy EDENAPI_KEY ke .env dg key \"EDENAI_APIKEY\"\n10. ubah config.yml sesuai addr,username, password postgres dan redis anda\n\n11. membuat dokumentasi swaggger\n```\n    make swag-v1\n```\n\n12. menjalankan aplikasi\n```\n    make run\n```\n\n13. jalankan request postman collection yg lengkap \u0026 ada websocket di https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a\u0026target_code=64d73c34516d85e5cb485c9c40a91be8 \u0026 jalankan di postman dekstop karena localhost atau  import postman collection di docs/pelatihan umum(chat app)postman_collection.json (tapi tidak lengkap \u0026 tidak ada websocket) \u0026 jalankan request di postman \n\n14. buka collection https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a\u0026target_code=64d73c34516d85e5cb485c9c40a91be8\n \u0026 ganti query parameter otp dan username dg otp dan username yang diberikan saat login \n```\n    jalankan request websocket di link postman tsb\n    setiap koneksi websocket harus menggunakan otp (harus login lagi)\n```\n\n\n## Online Presence\n\n### Login \u0026 Logout\n![user login mechanism](https://res.cloudinary.com/dex4u3rw4/image/upload/v1697362511/UserLoginLogout_cy1qtu.png)\n\n\n### Heartbeat\n![heartbeat mechanism](https://res.cloudinary.com/di0pjroxh/image/upload/v1697272518/untitled_2_prfsgc.png)\n\n## Online Status Fanout\n\n### Flow\n![online status fanout](https://res.cloudinary.com/dex4u3rw4/image/upload/v1697362511/online-status-fanout_ymceo7.png)\n\n### Online status fanout message\n![online status message fanout](https://res.cloudinary.com/di0pjroxh/image/upload/v1697272778/online-fanout-message_fb6q0e.png)\n\n\n## Kenapa menggunakan redis pubsub untuk menerima chat dari user lain?\nRedis' Pub/Sub exhibits at-most-once message delivery semantics. As the name suggests, it means that a message will be delivered once if at all. Once the message is sent by the Redis server, there's no chance of it being sent again. If the subscriber is unable to handle the message (for example, due to an error or a network disconnect) the message is forever lost.\n\u003cbr/\u003e\u003cbr/\u003e\nKarena jika subscriber offline subscriber, lalu online lagi. user subsriber tidak akan mendapatkan message yg dikrimkan user lain saat dia offline, melainkan hanya mendapatkan\nmessage dari pubSub  saat dia online dan user lain mengirimkan message. Message yg dikrimkan user lain saat user offline akan difetch dari database postgresql\n\n\n### ref\n slides: https://docs.google.com/presentation/d/1YfvlHW2Rf2RRQYP2sZ-hJteuNslNzviLhz0bMs3jT0M/edit?usp=sharing\n- code template from https://github.com/evrone/go-clean-template\n- image: https://bytebytego.com/courses/system-design-interview/design-a-chat-system\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flintang-b-s%2Fchat-be","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flintang-b-s%2Fchat-be","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flintang-b-s%2Fchat-be/lists"}