示例#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());
            }
        }
        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());
            }
        }
示例#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());
            }
        }
 // --------------------------------------------------------------------
 // サムネイル生成
 // --------------------------------------------------------------------
 private static Thumbnail?CreateThumbnail(String moviePath, String imageFileName, Int32 maxWidth, Int32 maxHeight)
 {
     try
     {
         using FileStream sourceStream = new FileStream(imageFileName, FileMode.Open);
         return(new Thumbnail
         {
             Path = moviePath,
             Bitmap = ServerCommon.CreateThumbnail(sourceStream, ServerConstants.MIME_TYPE_PNG, maxWidth, maxHeight, false),
             Mime = ServerConstants.MIME_TYPE_PNG,
             LastModified = YbdCommon.DateTimeToModifiedJulianDate(ServerCommon.LastModified(imageFileName)),
         });
     }
     catch (Exception excep)
     {
         Debug.WriteLine("サムネイル作成エラー:\n" + excep.Message);
         Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
         return(null);
     }
 }
        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());
            }
        }
        public IActionResult GetThumbnail(String?id)
        {
            try
            {
                RegisteredUser?registeredUser = null;
                if (String.IsNullOrEmpty(id))
                {
                    // 引数が空の場合は、ゲストのプロフィール画像を返す
                    if (DefaultGuestUserThumbnail == null)
                    {
                        throw new Exception();
                    }
                    registeredUser = new()
                    {
                        Bitmap       = DefaultGuestUserThumbnail.Bitmap,
                        Mime         = DefaultGuestUserThumbnail.Mime,
                        LastModified = YbdConstants.INVALID_MJD,
                    };
                }
                else
                {
                    using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                    registeredUser = registeredUsers.SingleOrDefault(x => x.Id == id);
                    if (registeredUser == null)
                    {
                        return(NotAcceptable());
                    }

                    // 指定されたユーザーにプロフィール画像が設定されていない場合
                    if (registeredUser.Bitmap.Length == 0)
                    {
                        Thumbnail?defaultThumbnail;
                        if (registeredUser.IsAdmin)
                        {
                            defaultThumbnail = DefaultAdminUserThumbnail;
                        }
                        else
                        {
                            defaultThumbnail = DefaultRegisteredUserThumbnail;
                        }
                        if (defaultThumbnail == null)
                        {
                            throw new Exception();
                        }
                        registeredUser = new()
                        {
                            Bitmap       = defaultThumbnail.Bitmap,
                            Mime         = defaultThumbnail.Mime,
                            LastModified = YbdConstants.INVALID_MJD,
                        };
                    }
                }

                // キャッシュチェック
                DateTime lastModified = YbdCommon.ModifiedJulianDateToDateTime(registeredUser.LastModified);
                if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified)))
                {
                    Debug.WriteLine("GetThumbnail() プロフィール画像キャッシュ有効: " + id);
                    return(NotModified());
                }

                // プロフィール画像を返す
                Debug.WriteLine("GetThumbnail() プロフィール画像キャッシュ無効: " + id);
                EntityTagHeaderValue eTag = GenerateEntityTag(registeredUser.LastModified);
                return(File(registeredUser.Bitmap, registeredUser.Mime, lastModified, eTag));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("プロフィール画像取得サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
示例#8
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());
            }
        }