예제 #1
0
        public IActionResult GetUserNames()
        {
            try
            {
                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_REQUEST_SONGS);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetUserNames() キャッシュ有効: ");
                    return(NotModified());
                }

                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
                String[] results = requestSongs.Where(x => x.UserId == String.Empty).Select(x => x.UserName).GroupBy(y => y).Select(z => z.Key).ToArray();

                // 追加ヘッダー
                AddTotalCountToHeader(results.Length);

                // 予約者名一覧
                EntityTagHeaderValue eTag = GenerateEntityTag(YbdCommon.DateTimeToModifiedJulianDate(lastModified));
                return(File(JsonSerializer.SerializeToUtf8Bytes(results), ServerConstants.MIME_TYPE_JSON, lastModified, eTag));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約者名一覧取得サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #2
0
        public IActionResult GetRequestSongs(String?query)
        {
            try
            {
                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_REQUEST_SONGS);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetRequestSongs() キャッシュ有効: " + query);
                    return(NotModified());
                }

                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                // 追加ヘッダー
                AddTotalCountToHeader(requestSongs.Count());

                // 予約一覧
                Dictionary <String, String> parameters = YbdCommon.AnalyzeQuery(query);
                Int32                page    = YbdCommon.GetPageFromQueryParameters(parameters);
                RequestSong[]        results = requestSongs.OrderByDescending(x => x.Sort).Skip(YbdConstants.PAGE_SIZE * page).Take(YbdConstants.PAGE_SIZE).ToArray();
                EntityTagHeaderValue eTag    = GenerateEntityTag(YbdCommon.DateTimeToModifiedJulianDate(lastModified));
                return(File(JsonSerializer.SerializeToUtf8Bytes(results), ServerConstants.MIME_TYPE_JSON, lastModified, eTag));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約一覧取得サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #3
0
        public IActionResult DeleteRequestAll()
        {
            try
            {
                // 管理者権限が必要
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser) || !loginUser.IsAdmin)
                {
                    return(Unauthorized());
                }

                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
                if (!requestSongs.Any())
                {
                    return(NotAcceptable());
                }
                requestSongContext.Database.EnsureDeleted();
                requestSongContext.Database.EnsureCreated();

                SendSse(YbdConstants.SSE_DATA_REQUEST_CHANGED);
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約一括削除サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #4
0
        public IActionResult ManageRequestSong(String requestSongId, [FromBody] String?command)
        {
            try
            {
                if (!Int32.TryParse(requestSongId, out Int32 requestSongIdNum))
                {
                    return(BadRequest());
                }
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                // 操作対象の予約
                RequestSong?requestSong = requestSongs.SingleOrDefault(x => x.RequestSongId == requestSongIdNum);
                if (requestSong == null)
                {
                    return(NotAcceptable());
                }

                IActionResult result;
                switch (command)
                {
                case YbdConstants.REQUEST_PARAM_VALUE_UP:
                    result = MoveUpRequestSong(requestSongs, requestSong);
                    break;

                case YbdConstants.REQUEST_PARAM_VALUE_DOWN:
                    result = MoveDownRequestSong(requestSongs, requestSong);
                    break;

                case YbdConstants.REQUEST_PARAM_VALUE_NEXT:
                    result = MoveNextRequestSong(requestSongs, requestSong);
                    break;

                default:
                    return(BadRequest());
                }
                if (result is not OkResult)
                {
                    return(result);
                }

                requestSongContext.SaveChanges();
                SendSse(YbdConstants.SSE_DATA_REQUEST_CHANGED);
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("指定曲操作サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
 public IActionResult GetPlayingSong()
 {
     try
     {
         using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
         RequestSong?result = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Playing || x.PlayStatus == PlayStatus.Pause);
         if (result == null)
         {
             return(NotAcceptable());
         }
         return(File(JsonSerializer.SerializeToUtf8Bytes(result), ServerConstants.MIME_TYPE_JSON));
     }
     catch (Exception excep)
     {
         Debug.WriteLine("再生曲取得サーバーエラー:\n" + excep.Message);
         Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
         return(InternalServerError());
     }
 }
        public IActionResult PlayOrPause([FromBody] Int32 _)
        {
            try
            {
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
                RequestSong?requestSong;
                requestSong = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Playing);
                if (requestSong != null)
                {
                    // 再生中の曲を一時停止する
                    requestSong.PlayStatus = PlayStatus.Pause;
                    requestSongContext.SaveChanges();
                    return(Ok());
                }

                requestSong = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Pause);
                if (requestSong != null)
                {
                    // 一時停止中の曲を再生する
                    requestSong.PlayStatus = PlayStatus.Playing;
                    requestSongContext.SaveChanges();
                    return(Ok());
                }

                requestSong = requestSongs.Where(x => x.PlayStatus == PlayStatus.Unplayed).OrderBy(x => x.Sort).FirstOrDefault();
                if (requestSong != null)
                {
                    // 未再生の曲を再生する
                    requestSong.PlayStatus = PlayStatus.Playing;
                    requestSongContext.SaveChanges();
                    return(Ok());
                }

                return(NotAcceptable());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("再生/一時停止サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
        public IActionResult Played(String requestSongId, [FromBody] String?command)
        {
            try
            {
                if (!Int32.TryParse(requestSongId, out Int32 requestSongIdNum))
                {
                    return(BadRequest());
                }
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                // 操作対象の予約
                RequestSong?requestSong = requestSongs.SingleOrDefault(x => x.RequestSongId == requestSongIdNum);
                if (requestSong == null)
                {
                    return(NotAcceptable());
                }

                switch (command)
                {
                case YbdConstants.REQUEST_PARAM_VALUE_PLAYED:
                    requestSong.PlayStatus = PlayStatus.Played;
                    break;

                case YbdConstants.REQUEST_PARAM_VALUE_UNPLAYED:
                    requestSong.PlayStatus = PlayStatus.Unplayed;
                    break;

                default:
                    return(BadRequest());
                }

                requestSongContext.SaveChanges();
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("指定曲操作サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #8
0
        // ====================================================================
        // API(ApiController)
        // ====================================================================

        // --------------------------------------------------------------------
        // 状態を返す
        // --------------------------------------------------------------------
        public override String ControllerStatus()
        {
            String status;

            try
            {
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                // FirstOrDefault を使用すると列の不足を検出できる
                requestSongs.FirstOrDefault(x => x.RequestSongId == 0);

                status = "正常 / 予約曲数:" + requestSongs.Count();
            }
            catch (Exception excep)
            {
                status = "エラー / " + excep.Message;
                Debug.WriteLine("予約 API 状態取得サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
            }
            return(status);
        }
        public IActionResult Prev([FromBody] Int32 dummy)
        {
            try
            {
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                RequestSong?currentSong = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Playing || x.PlayStatus == PlayStatus.Pause);
                if (currentSong != null)
                {
                    // 再生中・一時停止中の曲を未再生にする
                    currentSong.PlayStatus = PlayStatus.Unplayed;
                    requestSongContext.SaveChanges();
                }

                RequestSong?playedSong = requestSongs.Where(x => x.PlayStatus == PlayStatus.Played).OrderByDescending(x => x.Sort).FirstOrDefault();
                if (playedSong != null)
                {
                    // 再生済みの曲を未再生にする
                    playedSong.PlayStatus = PlayStatus.Unplayed;
                    requestSongContext.SaveChanges();
                }
                else
                {
                    if (currentSong == null)
                    {
                        // 再生済みの曲も再生中の曲も無い場合は戻れない
                        return(NotAcceptable());
                    }
                }

                return(PlayOrPause(dummy));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("前曲再生サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #10
0
        public IActionResult DeleteRequest(String?requestSongId)
        {
            try
            {
                if (!Int32.TryParse(requestSongId, out Int32 requestSongIdNum))
                {
                    return(BadRequest());
                }

                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                // 削除対象の予約
                RequestSong?deleteSong = requestSongs.SingleOrDefault(x => x.RequestSongId == requestSongIdNum);
                if (deleteSong == null)
                {
                    return(NotAcceptable());
                }

                // 削除対象より上にある予約を下へ
                IQueryable <RequestSong> downs = requestSongs.Where(x => x.Sort > deleteSong.Sort);
                foreach (RequestSong down in downs)
                {
                    down.Sort--;
                }

                requestSongs.Remove(deleteSong);
                requestSongContext.SaveChanges();

                SendSse(YbdConstants.SSE_DATA_REQUEST_CHANGED);
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約削除サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
        public IActionResult Next([FromBody] Int32 dummy)
        {
            try
            {
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);

                RequestSong?currentSong = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Playing || x.PlayStatus == PlayStatus.Pause);
                if (currentSong != null)
                {
                    // 再生中・一時停止中の曲を再生済みにする
                    currentSong.PlayStatus = PlayStatus.Played;
                    requestSongContext.SaveChanges();
                }

                return(PlayOrPause(dummy));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("次曲再生サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
예제 #12
0
        public IActionResult AddRequestSong([FromBody] RequestSong requestSong)
        {
            try
            {
                if (!requestSong.IsValid())
                {
                    return(BadRequest());
                }

                // 予約者のユーザー ID が指定されている場合はその正当性を確認(なりすまし予約防止)
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out DbSet <StockSong> stockSongs, out DbSet <HistorySong> historySongs);
                if (!String.IsNullOrEmpty(requestSong.UserId))
                {
                    if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser) || requestSong.UserId != loginUser.Id)
                    {
                        return(Unauthorized());
                    }
                }

                // 追加する曲の位置は最後
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
                Int32 sort;
                if (requestSongs.Any())
                {
                    sort = requestSongs.Max(x => x.Sort) + 1;
                }
                else
                {
                    sort = 1;
                }
                requestSong.Sort = sort;

                // 予約追加
                requestSongs.Add(requestSong);
                requestSongContext.SaveChanges();

                if (!String.IsNullOrEmpty(requestSong.UserId))
                {
                    // 予約者のユーザー ID が指定されている場合は履歴追加
                    HistorySong historySong = new();
                    YbdCommon.CopyHistorySongProperty(requestSong, historySong);
                    historySongs.Add(historySong);

                    // 後で歌う予定リストに追加されている場合はリストから削除
                    StockSong?stockSong = SearchStockSongByRequestSong(stockSongs, requestSong);
                    if (stockSong != null)
                    {
                        stockSongs.Remove(stockSong);
                    }

                    userProfileContext.SaveChanges();
                }

                SendSse(YbdConstants.SSE_DATA_REQUEST_CHANGED);
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約追加サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }