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()); } }
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()); } }
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()); } }
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()); } }
// ==================================================================== // 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()); } }
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()); } }
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()); } }