generated from VLADIMIR/template
179 lines
6.3 KiB
Go
179 lines
6.3 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
|
|
"evening_detective_server/internal/modules/roles"
|
|
proto "evening_detective_server/proto"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
func canManagePlaylists(ctx context.Context) bool {
|
|
claims, err := claimsFromContext(ctx)
|
|
return err == nil && claims != nil &&
|
|
(roles.HasRole(claims, roles.Author) || roles.HasRole(claims, roles.Organizer))
|
|
}
|
|
|
|
func (s *server) GetPlaylists(ctx context.Context, _ *proto.GetPlaylistsReq) (*proto.GetPlaylistsRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
items, err := s.playlistService.List(ctx)
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось получить плейлисты")
|
|
}
|
|
result := &proto.GetPlaylistsRsp{}
|
|
for _, item := range items {
|
|
result.Playlists = append(result.Playlists, mapPlaylist(item))
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (s *server) CreatePlaylist(ctx context.Context, req *proto.CreatePlaylistReq) (*proto.CreatePlaylistRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
item, err := s.playlistService.Create(ctx, req.GetName())
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось создать плейлист")
|
|
}
|
|
return &proto.CreatePlaylistRsp{Playlist: mapPlaylist(item)}, nil
|
|
}
|
|
|
|
func (s *server) UpdatePlaylist(ctx context.Context, req *proto.UpdatePlaylistReq) (*proto.UpdatePlaylistRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
item, err := s.playlistService.Update(ctx, int(req.GetID()), req.GetName())
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось изменить плейлист")
|
|
}
|
|
return &proto.UpdatePlaylistRsp{Playlist: mapPlaylist(item)}, nil
|
|
}
|
|
|
|
func (s *server) DeletePlaylist(ctx context.Context, req *proto.DeletePlaylistReq) (*proto.DeletePlaylistRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
if err := s.playlistService.Delete(ctx, int(req.GetID())); err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось удалить плейлист")
|
|
}
|
|
return &proto.DeletePlaylistRsp{}, nil
|
|
}
|
|
|
|
func (s *server) UploadPlaylistTrack(ctx context.Context, req *proto.UploadPlaylistTrackReq) (*proto.UploadPlaylistTrackRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
if err := s.playlistService.UploadTrack(
|
|
ctx,
|
|
int(req.GetPlaylistID()),
|
|
int(req.GetGroupID()),
|
|
req.GetName(),
|
|
req.GetFilename(),
|
|
req.GetData(),
|
|
); err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось загрузить MP3")
|
|
}
|
|
item, err := s.playlistService.Get(ctx, int(req.GetPlaylistID()))
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось получить плейлист")
|
|
}
|
|
return &proto.UploadPlaylistTrackRsp{Playlist: mapPlaylist(item)}, nil
|
|
}
|
|
|
|
func (s *server) DeletePlaylistTrack(ctx context.Context, req *proto.DeletePlaylistTrackReq) (*proto.DeletePlaylistTrackRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
if err := s.playlistService.DeleteTrack(
|
|
ctx,
|
|
int(req.GetPlaylistID()),
|
|
int(req.GetTrackID()),
|
|
); err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось удалить трек")
|
|
}
|
|
return &proto.DeletePlaylistTrackRsp{}, nil
|
|
}
|
|
|
|
func (s *server) SetScenarioPlaylist(ctx context.Context, req *proto.SetScenarioPlaylistReq) (*proto.SetScenarioPlaylistRsp, error) {
|
|
claims, err := claimsFromContext(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !roles.HasRole(claims, roles.Author) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
if err := s.playlistService.SetScenario(
|
|
ctx,
|
|
int(req.GetID()),
|
|
int(req.GetPlaylistID()),
|
|
); err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось назначить плейлист сценарию")
|
|
}
|
|
return &proto.SetScenarioPlaylistRsp{}, nil
|
|
}
|
|
|
|
func (s *server) GetGameMusic(ctx context.Context, req *proto.GetGameMusicReq) (*proto.GetGameMusicRsp, error) {
|
|
if !canManageScreens(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
state, err := s.playlistService.GetGame(ctx, int(req.GetGameID()))
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось получить музыку игры")
|
|
}
|
|
playlists, err := s.playlistService.List(ctx)
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось получить плейлисты")
|
|
}
|
|
result := &proto.GetGameMusicRsp{State: mapMusicState(state)}
|
|
for _, item := range playlists {
|
|
result.Playlists = append(result.Playlists, mapPlaylist(item))
|
|
}
|
|
if state.ScenarioID != nil {
|
|
result.ScenarioPlaylistId = int32(*state.ScenarioID)
|
|
}
|
|
if state.GameID != nil {
|
|
result.GamePlaylistId = int32(*state.GameID)
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (s *server) SetGameMusic(ctx context.Context, req *proto.SetGameMusicReq) (*proto.SetGameMusicRsp, error) {
|
|
if !canManageScreens(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
state, err := s.playlistService.SetGame(
|
|
ctx,
|
|
int(req.GetGameID()),
|
|
int(req.GetPlaylistID()),
|
|
int(req.GetTrackIndex()),
|
|
req.GetPositionMs(),
|
|
req.GetVolume(),
|
|
req.GetLoop(),
|
|
int32(req.GetPlayback()),
|
|
int(req.GetGroupId()),
|
|
)
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось изменить музыку игры")
|
|
}
|
|
return &proto.SetGameMusicRsp{State: mapMusicState(state)}, nil
|
|
}
|
|
|
|
func (s *server) ReorderPlaylistTracks(ctx context.Context, req *proto.ReorderPlaylistTracksReq) (*proto.ReorderPlaylistTracksRsp, error) {
|
|
if !canManagePlaylists(ctx) {
|
|
return nil, status.Error(codes.PermissionDenied, "permission denied")
|
|
}
|
|
ids := make([]int, len(req.GetTrackIDs()))
|
|
for i, id := range req.GetTrackIDs() {
|
|
ids[i] = int(id)
|
|
}
|
|
item, err := s.playlistService.Reorder(ctx, int(req.GetPlaylistID()), ids)
|
|
if err != nil {
|
|
return nil, playlistErrorStatus(err, "не удалось сохранить порядок треков")
|
|
}
|
|
return &proto.ReorderPlaylistTracksRsp{Playlist: mapPlaylist(item)}, nil
|
|
}
|