Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

СРС 2 #45

Open
wants to merge 11 commits into
base: easyjson
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,8 @@ cover_html: |
go test -v ./... -coverprofile=c.out ./... -coverpkg=./...
cat c.out | grep -v "cmd" | grep -v "_mock.go" | grep -v ".pb" | grep -v "_easyjson.go" > tmp.out
go tool cover -html=tmp.out

.PHONY: pgbadger
pgbadger: |
sudo apt-get install pgbadger || true
pgbadger /var/log/postgresql/*.json -o logs/pgbadger/report.html
54 changes: 51 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@

[Репозиторий фронта](https://github.com/frontend-park-mail-ru/2023_1_Brigade)

## Ссылка на деплой (ОБЯЗАТЕЛЬНО ДОБАВИТЬ ПЕРЕД РК)
https://technogramm.ru/

## Состав

- [Геворк Габриелян](https://github.com/Gev0rg)
Expand All @@ -16,3 +13,54 @@ https://technogramm.ru/

Ментор по беку - [Олег Реуцкий](https://github.com/astlok)
Ментор по фронту - [Антон Елагин](https://github.com/AntonElagin)

## Путь сообщения

![first_iter](https://github.com/go-park-mail-ru/2023_1_Brigade/blob/marcussss1-patch-4/photo_2023-06-01_17-28-13.jpg)

## 1. Что за сервис? Для чего он нужен? Какие проблемы и задачи пользователей он решает?

Technogram - это бесплатный мессенджер для мгновенного обмена текстовыми сообщениями, медиа контентом, эмодзи и стикерами.

Наш сервис дает пользователю возможности:
- Обмена фото, и текстовыми сообщениями с одним или несколькими пользователями почти, особенно полезно для людей, которые хотят оставаться на связи с друзьями и коллегами;
- Создание групповых чатов. Это может быть полезно для командной работы, обсуждения интересов, организации мероприятий и т.д.
- Создание каналов. Каждый пользователь может создать канал, в который может выкладывать свои сообщения и сообщения с других каналов. На каналы можно подписываться, что позволит пользователям - - получать интересующий их контент.
- Просмотр и поиск каналов по ключевым словам, что означает, что каждый желающий сможет найти интересующий его контент, а также подходящее комьюнити;
- Отправка стикеров;
- Хранение данных во вложениях, объем вложенных данных будет выше, чем у конкурентов. Это может быть полезно для того, чтобы не потерять интересный контент;


## 2. Кто его целевая аудитория, какими критериями её можно описать?

Наш сервис нацелен на аудиторию в возрасте 10-70 лет, это люди, которые хотят общаться с друзьями и коллегами, создавать групповые чаты для командной работы, обсуждения интересов, организации мероприятий и т.д, также для людей, которые:
- Хотят пользоваться удобным и интуитивно понятным интерфейсом, который позволяет быстро и легко общаться с друзьями, коллегами и близкими.
- Хотят быстро обменяться информацией с друзьями и знакомыми в личных сообщениях или личном блоге
- Хотят быть в курсе горячих новостей, пользуясь каналами
- Хотят иметь возможность оценивать посты и сообщения, за счет эмодзи
- Хотят иметь возможность сохранять ссылки, медиа, и файлы, которые будут хранится в диалоге/канале


## 3. В чем плюсы и минусы вашего сервиса, чем он круче конкурентов?

### Плюсы:

- Папки каналов и чатов
- Закреп сообщений
- Реакции на сообщения
- Хранилище с избранными сообщениями - по клику переходим на позицию в месте, в котором сообщение было создано.

### Минусы:

- Отсутствие звонков

Что делает сервис лучше конкурентов:
- Родительский режим — безопасный просмотр текстовых сообщений — мат-фильтр, цензура для устанавливаемого пользователем набора слов
- Поиск сообщений по подстроке


## 4. Экономическая модель
Монетизация:
- Премиум подписка: позволяет создавать больше каналов и папок, отправлять уникальные стикеры, иметь рядом с ником анимированный эмодзи
- Платные подписки на каналы
- Ненавязчивая реклама, всплывающая при просмотре канала после самого последнего сообщения
120 changes: 69 additions & 51 deletions cmd/api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,18 @@ import (
"github.com/centrifugal/centrifuge-go"
"os"
"os/signal"
clientAuth "project/internal/microservices/auth/delivery/grpc/client"
clientChat "project/internal/microservices/chat/delivery/grpc/client"
authUserRepository "project/internal/microservices/auth/repository"
usecaseAuth "project/internal/microservices/auth/usecase"
repositoryChat "project/internal/microservices/chat/repository"
usecaseChat "project/internal/microservices/chat/usecase"
clientMessages "project/internal/microservices/messages/delivery/grpc/client"
clientUser "project/internal/microservices/user/delivery/grpc/client"
repositoryMessages "project/internal/microservices/messages/repository"
repositoryUser "project/internal/microservices/user/repository"
usecaseUser "project/internal/microservices/user/usecase"
//clientAuth "project/internal/microservices/auth/delivery/grpc/client"
//clientChat "project/internal/microservices/chat/delivery/grpc/client"
//clientMessages "project/internal/microservices/messages/delivery/grpc/client"
//clientUser "project/internal/microservices/user/delivery/grpc/client"
"project/internal/pkg/serialization"

"github.com/jmoiron/sqlx"
Expand Down Expand Up @@ -164,35 +172,35 @@ func main() {
log.Error(err)
}

grpcConnChats, err := grpc.Dial(
config.ChatsService.Addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
log.Fatal("cant connect to grpc ", err)
}
defer func() {
err = grpcConnChats.Close()
if err != nil {
log.Error(err)
}
}()

grpcConnUsers, err := grpc.Dial(
config.UsersService.Addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
log.Fatal("cant connect to grpc ", err)
}
defer func() {
err = grpcConnUsers.Close()
if err != nil {
log.Error(err)
}
}()
//grpcConnChats, err := grpc.Dial(
// config.ChatsService.Addr,
// grpc.WithTransportCredentials(insecure.NewCredentials()),
// grpc.WithBlock(),
//)
//if err != nil {
// log.Fatal("cant connect to grpc ", err)
//}
//defer func() {
// err = grpcConnChats.Close()
// if err != nil {
// log.Error(err)
// }
//}()
//
//grpcConnUsers, err := grpc.Dial(
// config.UsersService.Addr,
// grpc.WithTransportCredentials(insecure.NewCredentials()),
// grpc.WithBlock(),
//)
//if err != nil {
// log.Fatal("cant connect to grpc ", err)
//}
//defer func() {
// err = grpcConnUsers.Close()
// if err != nil {
// log.Error(err)
// }
//}()

grpcConnMessages, err := grpc.Dial(
config.MessagesService.Addr,
Expand All @@ -209,32 +217,42 @@ func main() {
}
}()

grpcConnAuth, err := grpc.Dial(
config.AuthService.Addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
log.Fatal("cant connect to grpc ", err)
}
defer func() {
err = grpcConnAuth.Close()
if err != nil {
log.Error(err)
}
}()

authService := clientAuth.NewAuthUserServiceGRPSClient(grpcConnAuth)
chatService := clientChat.NewChatServiceGRPSClient(grpcConnChats)
userService := clientUser.NewUserServiceGRPSClient(grpcConnUsers)
messagesService := clientMessages.NewMessagesServiceGRPSClient(grpcConnMessages)
//grpcConnAuth, err := grpc.Dial(
// config.AuthService.Addr,
// grpc.WithTransportCredentials(insecure.NewCredentials()),
// grpc.WithBlock(),
//)
//if err != nil {
// log.Fatal("cant connect to grpc ", err)
//}
//defer func() {
// err = grpcConnAuth.Close()
// if err != nil {
// log.Error(err)
// }
//}()

authUserRepository := authUserRepository.NewAuthUserMemoryRepository(db)
//authSessionRepository := authSessionRepository.NewAuthSessionMemoryRepository(db)
//imagesRepository := repositoryImages.NewImagesMemoryRepository(userAvatarsClient, chatAvatarsClient, chatImagesClient)
chatRepo := repositoryChat.NewChatMemoryRepository(db)
userRepo := repositoryUser.NewUserMemoryRepository(db)
messagesRepo := repositoryMessages.NewMessagesMemoryRepository(db)

imagesRepository := repositoryImages.NewImagesMemoryRepository(userAvatarsClient, chatAvatarsClient, chatImagesClient)
authSessionRepository := repositoryAuthSession.NewAuthSessionMemoryRepository(db)

authSessionUsecase := usecaseAuthSession.NewAuthUserUsecase(authSessionRepository)
imagesUsecase := usecaseImages.NewImagesUsecase(imagesRepository)

authService := usecaseAuth.NewAuthUserUsecase(authUserRepository, userRepo, chatRepo, imagesUsecase)
chatService := usecaseChat.NewChatUsecase(chatRepo, userRepo, messagesRepo, imagesUsecase)
userService := usecaseUser.NewUserUsecase(userRepo, authUserRepository)
//authService := clientAuth.NewAuthUserServiceGRPSClient(grpcConnAuth)
//chatService := clientChat.NewChatServiceGRPSClient(grpcConnChats)
//userService := clientUser.NewUserServiceGRPSClient(grpcConnUsers)
messagesService := clientMessages.NewMessagesServiceGRPSClient(grpcConnMessages)

e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowMethods: config.Cors.AllowMethods,
Expand Down
65 changes: 1 addition & 64 deletions db/001_init_up.sql
Original file line number Diff line number Diff line change
@@ -1,66 +1,3 @@
-- CREATE TABLE IF NOT EXISTS profile (
-- id SERIAL UNIQUE PRIMARY KEY,
-- avatar VARCHAR(1024),
-- username VARCHAR(255),
-- nickname VARCHAR(255),
-- email VARCHAR(255),
-- status VARCHAR(255),
-- password VARCHAR(255)
-- );
--
-- CREATE TABLE IF NOT EXISTS session (
-- cookie VARCHAR(255),
-- profile_id INTEGER,
-- FOREIGN KEY (profile_id) REFERENCES profile(id)
-- );
--
-- CREATE TABLE IF NOT EXISTS chat (
-- id SERIAL UNIQUE PRIMARY KEY,
-- master_id INTEGER,
-- type INTEGER,
-- avatar VARCHAR(1024),
-- title VARCHAR(255),
-- FOREIGN KEY (master_id) REFERENCES profile(id)
-- );
--
-- CREATE TABLE IF NOT EXISTS message (
-- id VARCHAR(255) UNIQUE,
-- image_url VARCHAR(1024),
-- type INTEGER,
-- body VARCHAR(1024), -- валидация, со стороны приложения
-- id_chat INTEGER,
-- author_id INTEGER,
-- created_at VARCHAR(255),
-- FOREIGN KEY (author_id) REFERENCES profile(id),
-- FOREIGN KEY (id_chat) REFERENCES chat(id)
-- );
--
-- CREATE TABLE IF NOT EXISTS chat_members (
-- id_chat INTEGER,
-- id_member INTEGER,
-- FOREIGN KEY (id_chat) REFERENCES chat(id),
-- FOREIGN KEY (id_member) REFERENCES profile(id)
-- );
--
-- CREATE TABLE IF NOT EXISTS user_contacts (
-- id_user INTEGER,
-- id_contact INTEGER,
-- FOREIGN KEY (id_user) REFERENCES profile(id),
-- FOREIGN KEY (id_contact) REFERENCES profile(id)
-- );
--
-- CREATE TABLE IF NOT EXISTS chat_messages (
-- id_chat INTEGER,
-- id_message VARCHAR(255),
-- FOREIGN KEY (id_chat) REFERENCES chat(id),
-- FOREIGN KEY (id_message) REFERENCES message(id)
-- );
--
-- INSERT INTO profile (id, avatar, username, nickname, email, status, password)
-- VALUES (0, 'https://brigade_chat_avatars.hb.bizmrg.com/logo.png', 'Technogramm', 'Technogramm', '', 'Technogramm', '123');



CREATE TABLE IF NOT EXISTS profile (
id SERIAL UNIQUE PRIMARY KEY,
avatar VARCHAR(1024),
Expand Down Expand Up @@ -89,7 +26,7 @@ CREATE TABLE IF NOT EXISTS chat (
CREATE TABLE IF NOT EXISTS message (
id VARCHAR(255) UNIQUE,
type INTEGER,
body VARCHAR(1024), -- валидация, со стороны приложения
body VARCHAR(1024),
id_chat INTEGER,
author_id INTEGER,
created_at VARCHAR(255),
Expand Down
6 changes: 6 additions & 0 deletions db/grant_brigade_chats_user.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
GRANT SELECT ON
attachments,
chat,
chat_messages,
message
TO brigade_chats;
12 changes: 12 additions & 0 deletions db/grant_brigade_user.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
GRANT SELECT, UPDATE, INSERT, DELETE ON
attachments,
chat,
chat_id_seq,
chat_members,
chat_messages,
message,
profile,
profile_id_seq,
session,
user_contacts
TO brigade;
Loading