private ActionResult OnSendMail(GrimRequest request) { if (!request.TryGetParameterByKey("to", out var toParam)) { _logger.LogWarning($"Got get mail send request with missing 'to' parameter"); return(BadRequest()); } else if (!request.TryGetParameterByKey("subject", out var subjectParam)) { _logger.LogWarning($"Got get mail send request with missing 'subject' parameter"); return(BadRequest()); } else if (!request.TryGetParameterByKey("body", out var bodyParam)) { _logger.LogWarning($"Got get mail send request with missing 'body' parameter"); return(BadRequest()); } else if (!request.TryGetParameterByKey("mail_id", out var mailIdParam)) { _logger.LogWarning($"Got get mail send request with missing 'mail_id' parameter"); return(BadRequest()); } // Mail list with 1 is sent var mailList = new MailList() { Mails = new List <Mail>() { new Mail(), } }; return(Ok()); }
public async Task <ActionResult> Post(string server) { var player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } GrimRequest gRequest = await GrimRequest.Deserialize(Request.Body); if (gRequest is null) { return(BadRequest()); } _logger.LogDebug("<- {command}", gRequest.Command); switch (gRequest.Command) { case "photo.deleteimage": return(await OnRequestDeleteImage(player, gRequest)); } _logger.LogDebug("Got unimplemented photo call: {command}", gRequest.Command); return(BadRequest()); }
/// <summary> /// Fired when the player deletes an image, or can also be used for the player /// to sync their local images to the server and removing the ones that the player no longer has. /// </summary> /// <param name="player"></param> /// <param name="gRequest"></param> /// <returns></returns> private async Task <ActionResult> OnRequestDeleteImage(Player player, GrimRequest gRequest) { if (Player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } if (!gRequest.TryGetParameterLongByKey("photo_id", out long photo_id)) { _logger.LogWarning($"Got photo.upload request with missing 'photo_id' parameter"); return(BadRequest()); } var photo = await _photoDb.GetByIDAsync(photo_id); if (photo is null) { return(NotFound()); } if (photo.UserId != player.Data.Id) { return(Forbid()); } await _photoDb.RemoveAsync(photo_id); return(Ok(GrimResult.FromBool(true))); }
/// <summary> /// Fired when the player posts a new comment. /// </summary> /// <param name="player"></param> /// <param name="request"></param> /// <returns></returns> private async Task <ActionResult> OnRequestUpdateComment(Player player, GrimRequest request) { if (!request.TryGetParameterByKey("bbs_board_id", out var bbsBoardIdParam) || !int.TryParse(bbsBoardIdParam.Text, out int bbs_board_id)) { _logger.LogWarning($"Got bbs.updateComment request with missing 'bbs_board_id' parameter"); return(BadRequest()); } if (!request.TryGetParameterByKey("comment", out var comment)) { _logger.LogWarning($"Got bbs.updateComment request with missing 'bbs_comment_id' parameter"); return(BadRequest()); } if (comment.Text.Length == 0 || comment.Text.Length > 140) { _logger.LogWarning("Got bbs.updateComment with empty or too long comment? In: {length}, Max: 30", comment.Text.Length); return(BadRequest()); } // Bbs Board ids is just the user number - get the user using it var user = await _userDb.GetByIDAsync(bbs_board_id); if (user is null) { BadRequest(); } var newComment = new BbsDTO(bbs_board_id, player.Data.Id, comment.Text, DateTime.Now); await _bbsDb.AddAsync(newComment); return(Ok(GrimResult.FromBool(true))); }
private ActionResult OnGetMail(GrimRequest request) { if (!request.TryGetParameterByKey("mail_id", out var mailId)) { _logger.LogWarning($"Got get mail request with missing 'mail_id' parameter"); return(BadRequest()); } if (!request.TryGetParameterByKey("by", out var sortType)) { _logger.LogWarning($"Got get mail request with missing 'by' parameter"); return(BadRequest()); } /* * var result = new Mail() * { * FromUsername = "******", * ToUsername = "******", * FromNickname = "-- from nickname --", * ToNickname = "-- to nickname --", * Body = "-- body --", * MailId = 0, * Subject = "-- subject --", * CreateTime = DateTime.Now * }; */ return(Ok()); }
public async Task <ActionResult> Get() { GrimRequest requestReq = await GrimRequest.Deserialize(Request.Body); if (requestReq is null) { // Handle var badReq = GrimResult.FromInt(-1); return(BadRequest(badReq)); } _logger.LogDebug("<- Got ranking request: {command}", requestReq.Command); switch (requestReq.Command) { case "ranking.calc2": return(OnGetCalc2Ranking(requestReq)); case "ranking.getCount": return(OnGetCount(requestReq)); case "ranking.getListFriends": return(OnGetFriendList(requestReq)); } _logger.LogDebug("<- Got unknown ranking command: {command}", requestReq.Command); var badReqs = GrimResult.FromInt(-1); return(BadRequest(badReqs)); }
/// <summary> /// Fired when the player requests a message board. /// </summary> /// <param name="player"></param> /// <param name="request"></param> /// <returns></returns> private async Task <ActionResult> OnRequestGetCommentList(Player player, GrimRequest request) { if (!request.TryGetParameterByKey("bbs_board_id", out var bbsBoardIdParam) || !int.TryParse(bbsBoardIdParam.Text, out int bbs_board_id)) { _logger.LogWarning($"Got bbs.getCommentList request with missing 'bbs_board_id' parameter"); return(BadRequest()); } if (!request.TryGetParameterByKey("bbs_comment_id", out var commentIdParam) || !int.TryParse(commentIdParam.Text, out int bbs_comment_id)) { _logger.LogWarning($"Got bbs.getCommentList request with missing 'bbs_comment_id' parameter"); return(BadRequest()); } // Bbs Board ids is just the user number - get the user using it var user = await _userDb.GetByIDAsync(bbs_board_id); if (user is null) { BadRequest(); } var entries = await _bbsDb.GetAllCommentsOfBoard(bbs_board_id); var commentList = new BbsCommentList(); foreach (var entry in entries) { if (entry.Id <= bbs_comment_id) { continue; } string creatorUserId = player.Data.PSNUserId; if (entry.AuthorId != player.Data.Id) { creatorUserId = await _userDb.GetPSNNameByIdAsync(entry.AuthorId); if (creatorUserId is null) { break; } } BbsComment comment = new BbsComment(); comment.BoardId = bbs_board_id; comment.Comment = entry.Comment; comment.CreateTime = entry.CreateTime; comment.Nickname = creatorUserId; comment.UserId = creatorUserId; comment.CommentId = entry.Id; commentList.Comments.Add(comment); } return(Ok(commentList)); }
public ActionResult OnGetCount(GrimRequest request) { if (!request.TryGetParameterByKey("board_id", out var boardIdParam)) { _logger.LogWarning("Got ranking getCount request without 'board_id'"); return(BadRequest()); } return(Ok(GrimResult.FromInt(1))); }
private ActionResult OnSetLanguage(GrimRequest gRequest) { if (!gRequest.TryGetParameterByKey("language", out GrimRequestParam param)) { _logger.LogWarning("Got missing language parameter for language.set"); return(BadRequest()); } return(Ok(GrimResult.FromString(param.Text.ToLower()))); }
public ActionResult OnGetFriendList(GrimRequest request) { if (!request.TryGetParameterByKey("board_id", out var boardIdParam)) { _logger.LogWarning("Got ranking getCount request without 'board_id'"); return(BadRequest()); } var rankingList = new RankingList(); return(Ok(rankingList)); }
private ActionResult OnGetServerTime(GrimRequest gRequest) { if (_gsOptions.GameType != GameType.GT5) { _logger.LogWarning("Got servertime.get request for non GT5"); return(BadRequest()); } var result = GrimResult.FromDateTimeRfc3339(DateTime.Now); return(Ok(result)); }
public async Task <ActionResult> Post() { var player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } GrimRequest gRequest = await GrimRequest.Deserialize(Request.Body); if (gRequest is null) { // Handle var badReq = GrimResult.FromInt(-1); return(BadRequest(badReq)); } _logger.LogDebug("<- {command}", gRequest.Command); switch (gRequest.Command) { case "profile.update": return(await OnProfileUpdate(player, gRequest)); case "profile.getspecialstatus": return(OnGetSpecialStatus()); case "profile.updatefriendlist": return(await OnUpdateFriendList(gRequest)); case "profile.getsimplefriendlist": return(await OnGetSimpleFriendList(player)); case "profile.updateNickname": return(await OnUpdateNickname(player, gRequest)); case "profile.setpresence": return(SetPresence(gRequest)); case "profile.getSpecialList": return(await OnGetUserSpecialPresentList(player, gRequest)); } _logger.LogDebug("Received unimplemented profile call: {command}", gRequest.Command); var res = GrimResult.FromInt(-1); return(BadRequest(res)); }
// see requestActionLogList in gtmode.ad private async Task <ActionResult> OnActionPutLog(Player player, GrimRequest gRequest) { if (!gRequest.TryGetParameterByKey("action_type", out var actionTypeParam) || !int.TryParse(actionTypeParam.Text, out int action_type)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'action_type' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("value1", out var value1Param)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'value1' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("value2", out var value2Param)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'value2' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("value3", out var value3Param)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'value3' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("value4", out var value4Param)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'value4' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("value5", out var value5Param)) { _logger.LogWarning($"Got actionlog.putActionLog request with missing 'value5' parameter"); return(BadRequest()); } if (!ActionLog.Tags.TryGetValue(value1Param.Text, out string def)) { return(Ok()); } // TODO: Some actionlog checks LogAction(player, def, value2Param.Text, value3Param.Text, value4Param.Text, value5Param.Text); var log = new ActionLogDTO(player.Data.Id, DateTime.Now, value1Param.Text, value2Param.Text, value3Param.Text, value4Param.Text, value5Param.Text); await _actionLogDb.AddAsync(log); return(Ok(GrimResult.FromBool(true))); }
private async Task <ActionResult> OnUpdateCourse(GrimRequest request, Player player) { if (!request.TryGetParameterByKey("course_id", out var courseIdParam)) { _logger.LogWarning("Got course getlist without 'course_id'"); return(BadRequest()); } if (!request.TryGetParameterByKey("status", out var statusParam)) { _logger.LogWarning("Got course getlist without 'status'"); return(BadRequest()); } return(Ok()); }
public async Task <ActionResult> Post() { var player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } if (_gsOptions.GameType != GameType.GT5) { _logger.LogWarning("Got a bbs request on a non GT5 server from host: {host}", Request.Host); return(Unauthorized()); } GrimRequest gRequest = await GrimRequest.Deserialize(Request.Body); if (gRequest is null) { // Handle var badReq = GrimResult.FromInt(-1); return(BadRequest(badReq)); } _logger.LogDebug("<- {command}", gRequest.Command); switch (gRequest.Command) { case "bbs.getCommentList": return(await OnRequestGetCommentList(player, gRequest)); case "bbs.updateComment": return(await OnRequestUpdateComment(player, gRequest)); case "bbs.deleteComment": return(await OnRequestDeleteComment(player, gRequest)); } _logger.LogDebug("Received unimplemented bbs call: {command}", gRequest.Command); var res = GrimResult.FromInt(-1); return(BadRequest(res)); }
public async Task <ActionResult> Post() { GrimRequest requestReq = await GrimRequest.Deserialize(Request.Body); if (requestReq is null) { return(BadRequest()); } switch (requestReq.Command) { case "itembox.getlist": return(OnGetItemList(requestReq)); } _logger.LogDebug("Received unimplemented itembox command: {command}", requestReq.Command); return(BadRequest()); }
/// <summary> /// Fired when the player deletes a comment from their board. /// </summary> /// <param name="player"></param> /// <param name="request"></param> /// <returns></returns> private async Task <ActionResult> OnRequestDeleteComment(Player player, GrimRequest request) { if (!request.TryGetParameterByKey("bbs_comment_id", out var commentIdParam) || !int.TryParse(commentIdParam.Text, out int bbs_comment_id)) { _logger.LogWarning($"Got bbs.deleteComment request with missing 'bbs_comment_id' parameter"); return(BadRequest()); } // Get user's comment var comment = await _bbsDb.GetByIDAsync(bbs_comment_id); if (comment is null || (comment.BbsBoardId != player.Data.Id && comment.AuthorId != player.Data.Id)) { return(Forbid()); } await _bbsDb.RemoveAsync(bbs_comment_id); return(Ok(GrimResult.FromBool(true))); }
public async Task <ActionResult> Post() { var player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } if (_gsOptions.GameType != GameType.GT6) { _logger.LogWarning("Got course getlist request on non GT6"); return(BadRequest()); } GrimRequest requestReq = await GrimRequest.Deserialize(Request.Body); if (requestReq is null) { // Handle var badReq = GrimResult.FromInt(-1); return(BadRequest(badReq)); } _logger.LogDebug("<- Got course request: {command}", requestReq.Command); switch (requestReq.Command) { case "course.getlist": return(await OnGetList(requestReq, player)); case "course.update": return(await OnUpdateCourse(requestReq, player)); } _logger.LogDebug("<- Got unknown course command: {command}", requestReq.Command); var badReqs = GrimResult.FromInt(-1); return(BadRequest(badReqs)); }
public async Task <ActionResult> Post() { GrimRequest requestReq = await GrimRequest.Deserialize(Request.Body); if (requestReq is null) { return(BadRequest()); } switch (requestReq.Command) { case "servertime.get": return(OnGetServerTime(requestReq)); case "language.set": return(OnSetLanguage(requestReq)); } _logger.LogDebug("Received unimplemented locale command: {command}", requestReq.Command); return(BadRequest()); }
public async Task <ActionResult> Post() { GrimRequest requestReq = await GrimRequest.Deserialize(Request.Body); if (requestReq is null) { return(BadRequest()); } switch (requestReq.Command) { case "mail.getlist": return(OnGetMail(requestReq)); case "mail.send": return(OnSendMail(requestReq)); } _logger.LogDebug($"Received unimplemented mail command: {requestReq.Command}"); return(BadRequest()); }
public async Task <ActionResult> Post(string server) { var player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } if (_gsOptions.GameType != GameType.GT5) { _logger.LogWarning("Got actionlog request on a non GT5 server from host: {host}", Request.Host); return(Unauthorized()); } GrimRequest gRequest = await GrimRequest.Deserialize(Request.Body); if (gRequest is null) { // Handle var badReq = GrimResult.FromInt(-1); return(BadRequest(badReq)); } _logger.LogDebug("<- {command}", gRequest.Command); switch (gRequest.Command) { case "actionlog.putActionLog": return(await OnActionPutLog(player, gRequest)); } _logger.LogDebug("Got unimplemented actionlog call: {command}", gRequest.Command); return(BadRequest()); }
private async Task <ActionResult> OnGetList(GrimRequest request, Player player) { if (!request.TryGetParameterByKey("user_id", out var userIdParam) || userIdParam.Text.Length > 32) { _logger.LogWarning("Got course getlist without 'user_id'"); return(BadRequest()); } var user = await _users.GetByPSNUserIdAsync(player.Data.PSNUserId); var courses = await _courses.GetAllCoursesOfUser(user.Id); var courseList = new CourseList(); courseList.Courses = new List <Course>(); var course = new Course() { Comment = "Track Comment", CourseId = 1001000, Height = 200, OneWay = 0, Status = 2, Straight = 200, Title = "Track Title", Theme = "scenery_andalusia", Length = 7878, OwnerId = player.Data.PSNUserId, Corners = 69, OriginalCreator = player.Data.PSNUserId, PhotoId = 12345678, UpdateTime = DateTime.Now, PhotoHidden = 0, }; courseList.Courses.Add(course); return(Ok(courseList)); }
public ActionResult OnGetItemList(GrimRequest request) { var result = new ItemBoxList(); return(Ok(result)); }
/// <summary> /// Fired when the player requests any kind of profile update. /// </summary> /// <param name="player"></param> /// <param name="requestReq"></param> /// <returns></returns> private async Task <ActionResult> OnProfileUpdate(Player player, GrimRequest requestReq) { // requestUpdateGameStats or updateMyHomeProfile? if (requestReq.TryGetParameterByKey("license_level", out var licenseLevelParam) && int.TryParse(licenseLevelParam.Text, out int license_level)) { if (!requestReq.TryGetParameterByKey("achievement", out var achievementParam) || !int.TryParse(achievementParam.Text, out int achievement)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("trophy", out var trophyParam) || !int.TryParse(trophyParam.Text, out int trophy)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("car_count", out var carCountParam) || !int.TryParse(carCountParam.Text, out int car_count)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("license_gold", out var licenseGoldParam) || !int.TryParse(licenseGoldParam.Text, out int license_gold)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("odometer", out var odometerParam) || !float.TryParse(odometerParam.Text, out float odometer)) { return(BadRequest()); } // Can we assume we have don't have more? If so, it's requestUpdateGameStats if (!requestReq.TryGetParameterByKey("win_count", out var winCountParam)) { return(await OnRequestUpdateGameStats(player, license_level, achievement, trophy, car_count, license_gold, odometer)); } // Then we know its a global profile update - UpdateMyHomeProfile if (!int.TryParse(winCountParam.Text, out int win_count)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("credit", out var creditParam) || !int.TryParse(creditParam.Text, out int credit)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("license_silver", out var licenseSilverParam) || !int.TryParse(licenseSilverParam.Text, out int license_silver)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("license_bronze", out var licenseBronzeParam) || !int.TryParse(licenseBronzeParam.Text, out int license_bronze)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("aspec_level", out var aspecLevelParam) || !int.TryParse(aspecLevelParam.Text, out int aspec_level)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("bspec_level", out var bspecLevelParam) || !int.TryParse(bspecLevelParam.Text, out int bspec_level)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("aspec_exp", out var aspecExpParam) || !int.TryParse(aspecExpParam.Text, out int aspec_exp)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("bspec_exp", out var bspecExpParam) || !int.TryParse(bspecExpParam.Text, out int bspec_exp)) { return(BadRequest()); } var data = player.Data; data.WinCount = win_count; data.Credit = credit; data.LicenseSilverCount = license_silver; data.LicenseBronzeCount = license_bronze; data.ASpecLevel = aspec_level; data.ASpecExp = aspec_exp; data.BSpecLevel = bspec_level; data.BSpecExp = bspec_exp; await _userDB.UpdateMyHomeProfile(data); return(Ok(GrimResult.FromBool(true))); } // Can we assume its requestUpdateOnlineProfile? else if (requestReq.TryGetParameterByKey("profile_level", out var profileLevelParam) && requestReq.Params.ParamList.Count == 5) { if (!int.TryParse(profileLevelParam.Text, out int profile_level)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("comment_level", out var commentLevelParam) || !int.TryParse(commentLevelParam.Text, out int comment_level)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("playtime_level", out var playtimeLevelParam) || !int.TryParse(playtimeLevelParam.Text, out int playtime_level)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("playtime", out var playtimeParam)) { return(BadRequest()); } if (!requestReq.TryGetParameterByKey("comment", out var commentParam)) { return(BadRequest()); } return(await OnUpdateOnlineProfile(player, profile_level, comment_level, playtime_level, playtimeParam.Text, commentParam.Text)); } else if (requestReq.TryGetParameterByKey("welcomemessage", out var welcomeMessage) && requestReq.Params.ParamList.Count == 1) { return(await OnUpdateAutoMessage(player, welcomeMessage.Text)); } else if (requestReq.TryGetParameterByKey("helmet", out var helmet) && requestReq.TryGetParameterByKey("helmet_color", out var helmetColor)) { return(await OnUpdateHelmet(player, helmet.Text, helmetColor.Text)); } else if (requestReq.TryGetParameterByKey("wear", out var wear) && requestReq.TryGetParameterByKey("wear_color", out var wear_color)) { return(await OnUpdateWear(player, wear.Text, wear_color.Text)); } else if (requestReq.TryGetParameterByKey("menu_color", out var menu_color) && requestReq.TryGetParameterByKey("menu_matiere", out var menu_matiere)) { return(await OnUpdateMyHomeDesign(player, menu_color.Text, menu_matiere.Text)); } // No parsing is done. return(BadRequest()); }
private async Task <ActionResult> OnRequestCarList(Player player, GrimRequest request) { var result = new ItemBoxList(); return(Ok(result)); }
public async Task <ActionResult> OnRequestUploadImage() { Player player = Player; if (player is null) { _logger.LogWarning("Could not get current player for host {host}", Request.Host); return(Unauthorized()); } var value = Request.Headers["X-gt-xml"]; if (value.Count != 1) { return(BadRequest()); } string xml = value[0]; if (string.IsNullOrEmpty(xml)) { return(BadRequest()); } GrimRequest gRequest = GrimRequest.Deserialize(xml); if (gRequest is null) { return(BadRequest()); } if (gRequest.Command != "photo.upload") { return(BadRequest()); } if (!gRequest.TryGetParameterByKey("place", out var place)) { _logger.LogWarning($"Got photo.upload request with missing 'place' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("car_name", out var car_name)) { _logger.LogWarning($"Got photo.upload request with missing 'car_name' parameter"); return(BadRequest()); } if (!gRequest.TryGetParameterByKey("comment", out var comment)) { _logger.LogWarning($"Got photo.upload request with missing 'comment' parameter"); return(BadRequest()); } if (comment.Text.Length > 140) { _logger.LogWarning("Received photo.upload request with too long 'comment' parameter (len {comment.Text.Length} > 140)", comment.Text.Length); return(BadRequest()); } // type 3 is regular photo upload, 1 is avatar if (!gRequest.TryGetParameterIntByKey("type", out int type)) { _logger.LogWarning($"Got photo.upload request with missing 'type' parameter"); return(BadRequest()); } // Make sure they don't already have more photos that we allow, gets big quick if (await _photoDb.GetPhotoCountOfUserAsync(player.Data.Id) >= GTConstants.MaxPhotos) { return(Forbid()); } using var ms = Program.StreamManager.GetStream(); await Request.Body.CopyToAsync(ms); ms.Position = 0; // Check the image itself if (!await VerifyImage(ms, GTConstants.MaxPhotoWidth, GTConstants.MaxPhotoHeight)) { return(BadRequest()); } if (type != 3) { return(BadRequest()); } PhotoDTO photo = new PhotoDTO(Player.Data.Id, DateTime.Now, comment.Text, car_name.Text, place.Text); long newId = await _photoDb.AddAsync(photo); Directory.CreateDirectory($"{_gsOptions.XmlResourcePath}/photo/image"); ms.Position = 0; using (var fs = new FileStream($"{_gsOptions.XmlResourcePath}/photo/image/{newId}_0.jpg", FileMode.Create)) await ms.CopyToAsync(fs); // To let the client aware of the photo's online id var result = GrimResult.FromLong(newId); return(Ok(result)); }