public IActionResult GetStocks()
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out DbSet <StockSong> stockSongs, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser))
                {
                    return(Unauthorized());
                }

                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_USER_PROFILES);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetStocks() キャッシュ有効: ");
                    return(NotModified());
                }

                StockSong[]          results = stockSongs.Where(x => x.UserId == loginUser.Id).OrderByDescending(x => x.RequestTime).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());
            }
        }
Beispiel #2
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());
            }
        }
Beispiel #3
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());
            }
        }
        public IActionResult GetUsers()
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser) || !loginUser.IsAdmin)
                {
                    return(Unauthorized());
                }

                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_USER_PROFILES);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetUsers() キャッシュ有効: ");
                    return(NotModified());
                }

                RegisteredUser[] registeredUsersArray = registeredUsers.Where(x => !x.IsAdmin).OrderBy(x => x.Name).ToArray();
                PublicUserInfo[] results = new PublicUserInfo[registeredUsersArray.Length];
                for (Int32 i = 0; i < registeredUsersArray.Length; i++)
                {
                    PublicUserInfo publicUserInfo = new();
                    registeredUsersArray[i].CopyPublicInfo(publicUserInfo, true);
                    results[i] = publicUserInfo;
                }
                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 GetPublicUserInfo(String?id)
        {
            try
            {
                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_USER_PROFILES);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetPublicUserInfo() キャッシュ有効: " + id);
                    return(NotModified());
                }

                if (String.IsNullOrEmpty(id))
                {
                    return(BadRequest());
                }

                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                RegisteredUser?registeredUser = registeredUsers.SingleOrDefault(x => x.Id == id);
                if (registeredUser == null)
                {
                    return(NotAcceptable());
                }
                PublicUserInfo userInfo = new PublicUserInfo();
                registeredUser.CopyPublicInfo(userInfo, false);

                EntityTagHeaderValue eTag = GenerateEntityTag(YbdCommon.DateTimeToModifiedJulianDate(lastModified));
                return(File(JsonSerializer.SerializeToUtf8Bytes(userInfo), ServerConstants.MIME_TYPE_JSON, lastModified, eTag));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("公開ユーザー情報取得サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Beispiel #6
0
        public IActionResult SearchByWord(String?query)
        {
            try
            {
                // キャッシュチェック
                DateTime lastModified = ServerCommon.LastModified(ServerConstants.FILE_NAME_AVAILABLE_SONGS);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("SearchByWord() キャッシュ有効: " + query);
                    return(NotModified());
                }

                SearchWord searchWord = new SearchWord(query);
                if (!searchWord.IsValid(out String? errorMessage))
                {
                    return(BadRequest());
                }

                using AvailableSongContext availableSongContext = CreateAvailableSongContext(out DbSet <AvailableSong> availableSongs);
                IQueryable <AvailableSong> searchResults = availableSongs;
                if (searchWord.Type == SearchWordType.AnyWord)
                {
                    // なんでも検索
                    String[] anyWords = SplitKeyword(searchWord.AnyWord);
                    for (Int32 i = 0; i < anyWords.Length; i++)
                    {
                        searchResults = SearchByAnyWord(searchResults, anyWords[i]);
                    }
                }
                else
                {
                    // 曲名
                    // ToDo: SearchBySongName() を関数化すると実行できるが、地の文にすると例外が発生する
                    String[] songNames = SplitKeyword(searchWord.SongName);
                    for (Int32 i = 0; i < songNames.Length; i++)
                    {
                        searchResults = SearchBySongName(searchResults, songNames[i]);
                    }

                    // タイアップ名
                    String[] tieUpNames = SplitKeyword(searchWord.TieUpName);
                    for (Int32 i = 0; i < tieUpNames.Length; i++)
                    {
                        searchResults = SearchByTieUpName(searchResults, tieUpNames[i]);
                    }

                    // 歌手名
                    String[] artistNames = SplitKeyword(searchWord.ArtistName);
                    for (Int32 i = 0; i < artistNames.Length; i++)
                    {
                        searchResults = SearchByArtistName(searchResults, artistNames[i]);
                    }

                    // 制作会社
                    String[] makers = SplitKeyword(searchWord.MakerName);
                    for (Int32 i = 0; i < makers.Length; i++)
                    {
                        searchResults = SearchByMaker(searchResults, makers[i]);
                    }

                    // カラオケ動画制作者
                    String[] workers = SplitKeyword(searchWord.Worker);
                    for (Int32 i = 0; i < workers.Length; i++)
                    {
                        searchResults = SearchByWorker(searchResults, workers[i]);
                    }

                    // ファイル名
                    String[] pathes = SplitKeyword(searchWord.Path);
                    for (Int32 i = 0; i < pathes.Length; i++)
                    {
                        searchResults = SearchByPath(searchResults, pathes[i]);
                    }
                }

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

                // 検索結果は AvailableSongContext の寿命と共に尽きるようなので、ToArray() で新しいコンテナに格納する
                AvailableSong[]      results = SortSearchResult(searchResults, searchWord.Sort).Skip(YbdConstants.PAGE_SIZE * searchWord.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());
            }
        }