No description
  • Go 93.8%
  • PLpgSQL 4.6%
  • Dockerfile 1.6%
Find a file
linuxfight 481fa8fbe8
Some checks failed
Build and Test / build-and-push-image (push) Has been cancelled
fix(ci): update golangci
2026-03-13 14:37:24 +03:00
.github fix(ci): update golangci 2026-03-13 14:37:24 +03:00
cmd feat: add http proxy for youtube api 2026-03-13 14:32:52 +03:00
internal feat: add http proxy for youtube api 2026-03-13 14:32:52 +03:00
pkg feat: add http proxy for youtube api 2026-03-13 14:32:52 +03:00
sql fix(sql): remove unsused value of external_id 2025-12-22 10:09:50 +03:00
tests fix: cyclic dep 2026-03-13 14:32:52 +03:00
tools fix: simplify app functionality 2026-03-13 14:32:52 +03:00
.gitignore fix: simplify app functionality 2026-03-13 14:32:52 +03:00
compose.yml refactor(docker): fix sqlite C requirements 2025-12-22 00:12:41 +03:00
dev-compose.yml fix: cyclic dep 2026-03-13 14:32:52 +03:00
Dockerfile fix: cyclic dep 2026-03-13 14:32:52 +03:00
embed.go DDD attempt 2025-10-02 00:48:53 +03:00
go.mod fix: remove unused 2026-03-13 14:32:52 +03:00
go.sum fix: remove unused 2026-03-13 14:32:52 +03:00
README.md Update README.md 2026-03-06 19:57:57 +03:00
sqlc.yml refactor: DDD beginning 2025-12-08 17:21:02 +03:00
Taskfile.yml fix: simplify app functionality 2026-03-13 14:32:52 +03:00

Muse Backend

PROD TODO:

  • добавить лимит на количество треков
  • добавить пагинацию на получение треков в плейлисте
  • изменить логику получения роли (теперь роль кэшируется при действии с ней, см. handlers/group.go и handlers/chataction.go)
  • добавить для YoutubeAPI прокси

API TODO:

  • дока
  • тесты
  • отель
  • ютуб
  • спотик
  • иноагенты

Запуск

# 1. докер прям надо
docker compose -f dev-compose.yml up -d

# 2. Запуск
go run cmd/main.go

Структура проекта

├── .gitignore
├── Dockerfile # Docker образ
├── .dockerignore # файлы, которые надо игнорировать при сборке
├── README.md
├── Taskfile.yml # аналог makefile, хранилище для скриптов
├── cmd 
│ └── main.go # входная точка
├── compose.yml # PROD compose
├── dev-compose.yml # зависимости для dev режима
├── dev.env
├── embed.go # доступ до файлов, которые нужно хранить в бинарнике (миграции)
├── go.mod
├── go.sum
├── initdata.py # скрипт для генерации Telegram Init Data Raw
├── internal
│ ├── infra # базовые части приложения
│ │ ├── config.go
│ │ ├── db.go
│ │ ├── echo.go
│ │ ├── huma.go
│ │ ├── logger.go
│ │ └── queries # сгенерированный код для взаимодействия с PostgreSQL
│ │     ├── db.go
│ │     ├── models.go
│ │     └── queries.sql.go
│ ├── interfaces # интерфейсы для тестов, сервисов и хэндлеров
│ │ ├── api.go
│ │ └── service.go
│ ├── service # сервисы с логикой
│ │ ├── auth.go
│ │ ├── permission.go
│ │ ├── playlist.go
│ │ ├── track.go
│ │ └── user.go
│ └── transport 
│     ├── api # REST API
│     │ ├── dto
│     │ │ ├── auth.go
│     │ │ ├── playlist.go
│     │ │ └── track.go
│     │ ├── handlers
│     │ │ ├── auth.go
│     │ │ ├── playlist.go
│     │ │ ├── setup.go
│     │ │ └── track.go
│     │ └── middlewares
│     │     ├── auth.go
│     │     └── logger.go
│     └── bot # Telegram Bot
│         ├── handlers
│         │ ├── chataction.go
│         │ ├── group.go
│         │ ├── setup.go
│         │ └── start.go
│         ├── models
│         │ └── permission.go
│         └── utils
│             ├── chat.go
│             ├── extract.go
│             ├── iterate.go
│             └── participant.go
├── pkg
│ ├── utils # функции хелперы
│ │ ├── db.go
│ │ └── errorz.go
│ └── youtube # Innertube API
│     ├── api.go
│     ├── models.go
│     └── parser.go
├── sql # сырые SQL запросы (миграции, код для SQLC)
│ ├── migrations
│ │ └── 20250926213346_init.sql
│ ├── queries.sql
│ └── schema.sql
└── sqlc.yml # конфиг SQLC

Roles

  • owner (создатель плейлиста, может аппрувить треки и удалить плейлист ЕСТЬ НЮАНС СМ Types)
  • moderator (модератор, может аппрувить треки)
  • viewer (юзер, может просто кидать треки на аппрув)

Как получить

  • owner выдаётся, если юзер - владелец канала или чата.
  • moderator выдаётся, если юзер - администратор чата или канала (есть хотя бы подпись админа)
  • viewer выдаётся, если юзер - член чата или канала
  • роль убирается, если юзера забанят или он ливнет с чата

Types

  • custom (создан через миниапп, добавлять людей нельзя, но можно удалить вручную)
  • tg (создаётся, если добавить бота в группу, удалить можно только удалив бота из группы, автоматически подгружает роли для юзеров из группы в тг)

user story без нашего решения (сбор через гугл формы):

  • нужно собирать треки вручную
  • нет возможности пользователю сразу указать какой трек нужен (если нет возможности приложить ссылку)
  • модерация треков слишком сложная (нужно найти трек, если не указана ссылка)
  • скачивание сложное (нужно писать скрипты для загрузки аудио, нет единой площадки)

user story с нашим решением

  • автоматическая система ролей (легко сделать модерацию от кучи людей)
  • одна площадка
  • лёгкая загрузка треков
  • сразу можно увидеть информацию про трек
  • пользователь может быть уверен, что скинет точно тот трек, который хотел

плюсы

процесс поиска трека по названию автоматизирован и сразу видно информацию о треке, то модераторы могут не тратить на это время, а значит основная задача - упрощение, выполнена

можно не тратить время на поиск треков на сторонних площадках и на поиск ссылки на их скачивание