public HttpResponseMessage DownloadLevel(Int64?id, Int32?version = -1) { try { LevelDataDTO level = this.levelsDAL.GetLevel(id ?? -1, version ?? -1); return(HttpResponseFactory.Response200Plain(level.ToString())); } catch (PR2Exception ex) { return(HttpResponseFactory.Response200Plain(StatusKeys.ERROR, ex.Message)); } catch (Exception ex) { return(HttpResponseFactory.Response500Plain(ex.Message)); } }
public void SaveLevel(Int64 userId, String username, LevelDataDTO levelData, String ipAddress) { // TODO - Validation of level data. // TODO - Consider the difference based approach when saving levels. if (levelData == null) { throw new PR2Exception(ErrorMessages.ERR_NO_LEVEL_DATA); } else if (String.IsNullOrEmpty(levelData.Title)) { throw new PR2Exception(ErrorMessages.ERR_NO_LEVEL_TITLE); } else if (levelData.GameMode == GameMode.Unknown) { throw new PR2Exception(ErrorMessages.ERR_INVALID_GAME_MODE); } else if (!String.IsNullOrEmpty(levelData.Items) && !Regex.IsMatch(levelData.Items, ValidationConstraints.LEVEL_ITEMS_PATTERN)) { throw new PR2Exception(ErrorMessages.ERR_INVALID_ITEMS); } using (MD5Wrapper md5 = new MD5Wrapper()) { String hash = md5.GetHashedString( String.Concat(levelData.Title, username?.ToLower() ?? String.Empty, levelData.Data, Pepper.LEVEL_SAVE)); if (String.CompareOrdinal(hash, levelData.Hash) != 0) { throw new PR2Exception(ErrorMessages.ERR_LEVEL_DATA_HASH_MISMATCH); } } DateTime utcDateMinus1min = DateTime.UtcNow.AddMinutes(-1); // To prevent usage of SQL functions. LevelVersion lastSaved = this.dbContext.LevelVersions .Where(v => v.Level != null && v.Level.AuthorId == userId && DateTime.Compare(v.SubmittedDate, utcDateMinus1min) > 0) .OrderByDescending(v => v.SubmittedDate).FirstOrDefault(); if (lastSaved != null) { throw new PR2Exception(String.Format( ErrorMessages.ERR_WAIT_BEFORE_SAVING, Math.Round(TimeSpan.FromMinutes(1).Subtract(DateTime.UtcNow.Subtract(lastSaved.SubmittedDate.ToUniversalTime())).TotalSeconds))); } Level level = this.dbContext.Levels.FirstOrDefault(l => l.AuthorId == userId && l.Title == levelData.Title); if (level == null) { level = new Level { AuthorId = userId, Title = levelData.Title, IsDeleted = false }; this.dbContext.Levels.Add(level); } level.IsPublished = levelData.Live; this.dbContext.LevelVersions.Add(new LevelVersion { Level = level, SubmittedDate = DateTime.UtcNow, SubmittedIP = ipAddress, Note = levelData.Note, GameMode = levelData.GameMode, MinRank = levelData.MinLevel, CowboyChance = levelData.CowboyChance, Gravity = levelData.Gravity, Song = levelData.Song, MaxTime = levelData.MaxTime, Items = levelData.Items, Data = levelData.Data, PassHash = levelData.PassHash }); this.dbContext.SaveChanges(); }