public MazeSolution GetMazeSolution(Guid mazeId, string userId) { Maze maze = _mazeRepository.FindById(mazeId); Guid userGuid = new Guid(userId); User user = _userRepository.FindById(userGuid); UserMaze userMaze = _userMazeRepository.FindById(mazeId, userGuid); if (userMaze != null) { _userMazeRepository.Update(maze.MazeId, user.UserId, "LOCKED", true); } else { userMaze = UserMaze.Create(user, maze, "LOCKED", true, 0, String.Empty.CompressString()); _userMazeRepository.Create(userMaze); } if (maze == null) { return(null); } return(new MazeSolution(maze.Solution.DecompressString(), maze.Width, '1')); }
public MazeDTO CreateMazeByUserId(Guid userId, MazeFE maze) { User user = _userRepository.FindById(userId); if (user == null) { _logger.LogError("User with id " + userId.ToString() + " not in database\n\n"); throw new ApiException(404, "User with id " + userId.ToString() + " not in database"); } string solution; try { solution = _bfsService.ValidateMaze(maze); } catch (ApiException e) { _logger.LogError(e.Message); throw e; } Maze mazeBE = BuildMazeFromMazeFE(maze, solution); Maze storedMaze = CreateMaze(mazeBE); UserMaze userMaze = UserMaze.Create(user, storedMaze); UserMaze retUserMaze = _userMazeRepository.Create(userMaze); return(MazeDTO.Builder() .Id(storedMaze.MazeId) .Name(storedMaze.Name) .OwnerId(user.UserId) .Owner(user.Username) .PlayersCount(0) .Width(storedMaze.Width) .Height(storedMaze.Height) .State(storedMaze.State.DecompressString()) .CreationTime(storedMaze.CreationTime) .Build()); }
public Score Submit(Guid mazeId, string userId, MazeFE userSolution) { Guid userGuid = new Guid(userId); User user = _userRepository.FindById(userGuid); if (_userMazeRepository.FindById(mazeId, userGuid) != null) { throw new ApiException(403, "Already submitted solution for this maze"); } if (!ValidateUserSolution(userSolution)) { throw new ApiException(400, "Invalid solution"); } Maze maze = _mazeRepository.FindById(mazeId); int userSolutionSize = userSolution.PointList.Count(p => p.Value == 4); int solutionSize = maze.Solution.DecompressString().Count(c => c == '1'); int deviation = Convert.ToInt32((userSolutionSize - solutionSize) * 100 / solutionSize); int accuracy = Math.Max(0, 100 - deviation); string userSolutionString = ""; foreach (Point point in userSolution.PointList) { userSolutionString += point.Value; } UserMaze um = UserMaze.Create(user, maze, "LOCKED", true, accuracy, userSolutionString.CompressString()); _userMazeRepository.Create(um); return(new Score(accuracy)); }