Skip to content

lintang-b-s/chat-be

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

chat-be

highly scalable chat backend api using websocket, redis, and postgres.

fitur:

 1. autentikasi (login, register, logout, renewAccToken)
 2. add user to contact & get user contact
 3. private chat dg chatbot
 4. private_chat dg user lain yang sudah ditambahkan ke contact
 5. create group chat , add member to group chat, remove member from group chat
 6. group chat dg user yg sudah ditambahkan sebagai member groupchat
 7. memanggil chatbot di groupchat 
 8. mendapatkan semua message private chat & message private by friend
 9. mendapatkan semua message di groupchat
 10. Meski user terhubung ke chat-server yang berbeda-beda , mereka tetap akan bisa berkomunikasi karena adanya redis pub-sub 

Content

ChatHub struct & User struct

ChatHub struct & User Struct

1 on 1 Chat Flow (UserA dan UserB terhubung ke instan chat-server yang sama)

one-on-one chat flow server sama

1 on 1 Chat Flow (Semua user terhubung ke instan chat-server yang berbeda)

one-on-one chat flow server beda

one-on-one chat flow 2

Message table for 1 on 1 chat

message table for 1 on 1 chat

Messages_id digenerate menggunakan https://github.com/sony/sonyflake, yg mana besarnya integer id yg digenerate tergantung waktu saat id digeneraete
untuk mendapatkan messages yang diurutkan berdasarkan time (dari paling lama -> terbaru) bisa pakai query "order by id asc".

Group Chat Flow

group-chat flow

Message table for group chat

group-chat message table

API docs

ada di docs/swagger.yaml

postman collection ada di https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a&target_code=64d73c34516d85e5cb485c9c40a91be8 & jalankan di postman dekstop karena localhost ( setiap koneksi websocket harus menggunakan otp / harus login lagi)

Quick Start

  1. install golang & set GOPATH Variabel di OS kalian:
 Windows: https://www.youtube.com/watch?v=xYpqI7GRrvE
 Mac: https://www.youtube.com/watch?v=HrFqH6Dj6kk
 Linux: https://www.youtube.com/watch?v=G36tXSWlUnE
 
 GOPATH: 
 https://www.youtube.com/watch?v=eJVq-idZDMo
 windows: https://www.youtube.com/watch?v=kjr3mOPv8Sk
 windows & unix: https://github.com/golang/go/wiki/SettingGOPATH
 mac: https://www.youtube.com/watch?v=FTDOW8UbKjQ
  1. install go-migrate
    go install -tags "postgres,mysql" github.com/golang-migrate/migrate/v4/cmd/migrate@latest
    untuk mengecek sudah diinstal belum: ketik migrate
  1. install makefile
    windowss: https://linuxhint.com/run-makefile-windows/
    mac: https://formulae.brew.sh/formula/make
    linux:  https://www.youtube.com/watch?v=PLFzCOPPrPc
    
  1. install docker
    windows: https://www.youtube.com/watch?v=XgRGI0Pw2mM
    mac: https://www.youtube.com/watch?v=-y1BmDbcaEU
        
  1. jalankan redis & postgresqql di local;
 redis:
  mac: brew services start redis
  windows: https://linuxhint.com/install-run-redis-windows/

  
  1. (optional jika belum install redis & postgres) buat container postgresql, redis di docker
    docker compose up -d
  1. create migration file
    migrate create -ext sql -dir migrations create_chat_app_table
  1. open pg-admin in localhost:5050 or enter postggres cli. create database chat
  2. execute this command in query-tool pg-admin
    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

  1. menjalankan migration
    migrate -database "postgres://postgres:pass@localhost:5432/chat?sslmode=disable" -path migrations up
  1. buat file .env dan isi sesuai .env.example & buat akun https://www.edenai.co/ & copy EDENAPI_KEY ke .env dg key "EDENAI_APIKEY"

  2. ubah config.yml sesuai addr,username, password postgres dan redis anda

  3. membuat dokumentasi swaggger

    make swag-v1
  1. menjalankan aplikasi
    make run
  1. jalankan request postman collection yg lengkap & ada websocket di https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a&target_code=64d73c34516d85e5cb485c9c40a91be8 & jalankan di postman dekstop karena localhost atau import postman collection di docs/pelatihan umum(chat app)postman_collection.json (tapi tidak lengkap & tidak ada websocket) & jalankan request di postman

  2. buka collection https://app.getpostman.com/join-team?invite_code=3aa872d85da6ae474265256597513a0a&target_code=64d73c34516d85e5cb485c9c40a91be8 & ganti query parameter otp dan username dg otp dan username yang diberikan saat login

    jalankan request websocket di link postman tsb
    setiap koneksi websocket harus menggunakan otp (harus login lagi)

Online Presence

Login & Logout

user login mechanism

Heartbeat

heartbeat mechanism

Online Status Fanout

Flow

online status fanout

Online status fanout message

online status message fanout

Kenapa menggunakan redis pubsub untuk menerima chat dari user lain?

Redis' 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.

Karena jika subscriber offline subscriber, lalu online lagi. user subsriber tidak akan mendapatkan message yg dikrimkan user lain saat dia offline, melainkan hanya mendapatkan message dari pubSub saat dia online dan user lain mengirimkan message. Message yg dikrimkan user lain saat user offline akan difetch dari database postgresql

ref

slides: https://docs.google.com/presentation/d/1YfvlHW2Rf2RRQYP2sZ-hJteuNslNzviLhz0bMs3jT0M/edit?usp=sharing