一个im
kratos new app/gateway --nomod
kratos new app/user --nomod
kratos new app/relation --nomod
kratos new app/conversation --nomod
kratos new app/message --nomod
kratos new app/media --nomod
kratos proto add api/user/v1/user.proto
kratos proto add api/relation/v1/relation.proto
kratos proto add api/conversation/v1/conversation.proto
kratos proto add api/message/v1/message.proto
kratos proto add api/media/v1/media.proto
A -> ws-1 -> 略
B -> ws-2 -> message -> 一致性 hash -> ws-* push message -> A
-> media
-> conversation
-> relation
.
├── CLAUDE.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── api
│ ├── connect
│ │ └── v1
│ │ ├── connect.pb.go
│ │ ├── connect.proto
│ │ ├── connect_grpc.pb.go
│ │ └── connect_http.pb.go
│ ├── conversation
│ │ └── v1
│ │ ├── conversation.pb.go
│ │ ├── conversation.proto
│ │ ├── conversation_grpc.pb.go
│ │ └── conversation_http.pb.go
│ ├── media
│ │ └── v1
│ │ ├── media.pb.go
│ │ ├── media.proto
│ │ ├── media_grpc.pb.go
│ │ └── media_http.pb.go
│ ├── message
│ │ └── v1
│ │ ├── message.pb.go
│ │ ├── message.proto
│ │ ├── message_grpc.pb.go
│ │ └── message_http.pb.go
│ ├── push
│ │ └── v1
│ │ ├── push.pb.go
│ │ ├── push.proto
│ │ ├── push_grpc.pb.go
│ │ └── push_http.pb.go
│ ├── relation
│ │ └── v1
│ │ ├── relation.pb.go
│ │ ├── relation.proto
│ │ ├── relation_grpc.pb.go
│ │ └── relation_http.pb.go
│ └── user
│ └── v1
│ ├── user.pb.go
│ ├── user.proto
│ ├── user_grpc.pb.go
│ └── user_http.pb.go
├── apisix
│ ├── apisix.yaml
│ └── dashboard
│ └── conf.yaml
├── app
│ ├── connect
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── api
│ │ ├── bin
│ │ │ └── connect
│ │ ├── cmd
│ │ │ └── connect
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── README.md
│ │ │ ├── biz.go
│ │ │ ├── connection.go
│ │ │ └── errors.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ └── data.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ ├── server.go
│ │ │ └── websocket.go
│ │ └── service
│ │ ├── connect.go
│ │ └── service.go
│ ├── conversation
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── cmd
│ │ │ └── conversation
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── biz.go
│ │ │ └── conversation.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ ├── conversation.go
│ │ │ └── data.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ └── server.go
│ │ └── service
│ │ ├── conversation.go
│ │ └── service.go
│ ├── media
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── cmd
│ │ │ └── media
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── biz.go
│ │ │ └── media.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ ├── data.go
│ │ │ └── media.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ └── server.go
│ │ └── service
│ │ ├── media.go
│ │ └── service.go
│ ├── message
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── bin
│ │ │ └── message
│ │ ├── cmd
│ │ │ └── message
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── biz.go
│ │ │ └── message.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ ├── data.go
│ │ │ ├── kafka_producer.go
│ │ │ ├── message.go
│ │ │ └── relation_client.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ ├── kafka_consumer.go
│ │ │ └── server.go
│ │ └── service
│ │ ├── message.go
│ │ └── service.go
│ ├── push
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── api
│ │ ├── bin
│ │ │ └── push
│ │ ├── cmd
│ │ │ └── push
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── README.md
│ │ │ ├── biz.go
│ │ │ └── push.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ ├── README.md
│ │ │ ├── connect_client.go
│ │ │ └── data.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ ├── kafka_consumer.go
│ │ │ └── server.go
│ │ └── service
│ │ ├── README.md
│ │ ├── push.go
│ │ └── service.go
│ ├── relation
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── bin
│ │ │ └── relation
│ │ ├── cmd
│ │ │ └── relation
│ │ │ ├── main.go
│ │ │ ├── wire.go
│ │ │ └── wire_gen.go
│ │ ├── configs
│ │ │ └── config.yaml
│ │ └── internal
│ │ ├── biz
│ │ │ ├── biz.go
│ │ │ └── relation.go
│ │ ├── conf
│ │ │ ├── conf.pb.go
│ │ │ └── conf.proto
│ │ ├── data
│ │ │ ├── data.go
│ │ │ └── relation.go
│ │ ├── server
│ │ │ ├── grpc.go
│ │ │ ├── http.go
│ │ │ └── server.go
│ │ └── service
│ │ ├── relation.go
│ │ └── service.go
│ └── user
│ ├── Dockerfile
│ ├── Makefile
│ ├── apisix
│ │ └── dashboard
│ ├── bin
│ │ └── user
│ ├── cmd
│ │ └── user
│ │ ├── main.go
│ │ ├── wire.go
│ │ └── wire_gen.go
│ ├── configs
│ │ └── config.yaml
│ ├── ent
│ │ ├── client.go
│ │ ├── ent.go
│ │ ├── enttest
│ │ │ └── enttest.go
│ │ ├── generate.go
│ │ ├── hook
│ │ │ └── hook.go
│ │ ├── migrate
│ │ │ ├── migrate.go
│ │ │ └── schema.go
│ │ ├── mutation.go
│ │ ├── predicate
│ │ │ └── predicate.go
│ │ ├── runtime
│ │ │ └── runtime.go
│ │ ├── runtime.go
│ │ ├── schema
│ │ │ └── user.go
│ │ ├── tx.go
│ │ ├── user
│ │ │ ├── user.go
│ │ │ └── where.go
│ │ ├── user.go
│ │ ├── user_create.go
│ │ ├── user_delete.go
│ │ ├── user_query.go
│ │ └── user_update.go
│ └── internal
│ ├── biz
│ │ ├── biz.go
│ │ ├── jwt_provider.go
│ │ └── user.go
│ ├── conf
│ │ ├── conf.pb.go
│ │ └── conf.proto
│ ├── data
│ │ ├── data.go
│ │ └── user.go
│ ├── server
│ │ ├── grpc.go
│ │ ├── http.go
│ │ └── server.go
│ └── service
│ ├── service.go
│ └── user.go
├── docker-compose.apisix.yml
├── go.mod
├── go.sum
├── openapi.yaml
├── pkg
│ ├── idgen
│ │ └── ulid.go
│ ├── jwtx
│ │ ├── bearer.go
│ │ └── jwtx.go
│ ├── mq
│ │ ├── consumer.go
│ │ ├── producer.go
│ │ └── topics.go
│ ├── password
│ │ └── bcrypt.go
│ └── redis
│ ├── client.go
│ └── online_status.go
├── s-waves
│ └── api
│ └── connect
│ └── v1
│ ├── connect.pb.go
│ ├── connect_grpc.pb.go
│ └── connect_http.pb.go
└── third_party
├── README.md
├── errors
│ └── errors.proto
├── google
│ ├── api
│ │ ├── annotations.proto
│ │ ├── client.proto
│ │ ├── field_behavior.proto
│ │ ├── http.proto
│ │ └── httpbody.proto
│ └── protobuf
│ ├── any.proto
│ ├── api.proto
│ ├── compiler
│ │ └── plugin.proto
│ ├── descriptor.proto
│ ├── duration.proto
│ ├── empty.proto
│ ├── field_mask.proto
│ ├── source_context.proto
│ ├── struct.proto
│ ├── timestamp.proto
│ ├── type.proto
│ └── wrappers.proto
├── openapi
│ └── v3
│ ├── annotations.proto
│ └── openapi.proto
└── validate
├── README.md
└── validate.proto
125 directories, 228 files
curl -X POST http://localhost:8080/api/v1/groups -H "Content-Type: application/json" -H "Authorization: Bearer
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjEsImlzcyI6Inotd2F2ZXMiLCJzdWIiOiJ1c2VyMUBleGFtcGxlLmNvbSIsImV4cCI6MTc2MDM0NzM4MiwibmJmIjoxNzYwMjYwOTgyLCJpYXQiOjE3NjAyNjA5ODJ9.8Z0Tbyl6S4tGLCDZF0eoyD7IFflXxzZxvw69QVDPQmQ" -d '{"name": "Test Group", "description": "A group for testing"}'
curl -X POST http://localhost:8080/api/v1/groups/1/conversation -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjEsImlzcyI6Inotd2F2ZXMiLCJzdWIiOiJ1c2VyMUBleGFtcGxlLmNvbSIsImV4cCI6MTc2MDM0NzM4MiwibmJmIjoxNzYwMjYwOTgyLCJpYXQiOjE3NjAyNjA5ODJ9.8Z0Tbyl6S4tGLCDZF0eoyD7IFflXxzZxvw69QVDPQmQ"