Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added ErrorOr to not throw Errors anymore #50

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,16 @@ public SessionController(ISessionService SessionService, IWebSocketHandler webSo
public async Task<ActionResult> CreateSession(SessionDto sessionDto)
{
Devon4NetLogger.Debug($"Create session that will expire at {sessionDto.ExpiresAt}");
try
{
return Ok(await _sessionService.CreateSession(sessionDto));
}
catch (Exception exception)
var errorOrResult = await _sessionService.CreateSession(sessionDto);

if (errorOrResult.IsError)
{
return exception switch
{
InvalidExpiryDateException _ => BadRequest(),
_ => StatusCode(500)
};
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

return Ok(errorOrResult.Value);

}
[HttpPut]
[AllowAnonymous]
Expand All @@ -70,20 +68,16 @@ public async Task<ActionResult> CreateSession(SessionDto sessionDto)
public async Task<IActionResult> InvalidateSession(long id)
{
Devon4NetLogger.Debug($"Put-Request to invalidate session with id: {id}");
var errorOrResult = await _sessionService.InvalidateSession(id);

try
if (errorOrResult.IsError)
{
return Ok(await _sessionService.InvalidateSession(id));
}
catch (Exception exception)
{
return exception switch
{
NotFoundException _ => NotFound(),
InvalidSessionException _ => BadRequest(),
_ => StatusCode(500)
};
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

return Ok(errorOrResult.Value);

}

/// <summary>
Expand All @@ -101,19 +95,15 @@ public async Task<IActionResult> RemoveUserFromSession(long sessionId, String us
{
Devon4NetLogger.Debug($"Put-Request for removing user with id: {userId} from session status with id: {sessionId}");

try
{
var leaveResult = await _sessionService.RemoveUserFromSession(sessionId, userId);
var errorOrResult = await _sessionService.RemoveUserFromSession(sessionId, userId);

return new ObjectResult(JsonConvert.SerializeObject(leaveResult));
}
catch (Exception exception)
if (errorOrResult.IsError)
{
return exception switch
{
NotFoundException _ => StatusCode(500),
};
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

return new ObjectResult(JsonConvert.SerializeObject(errorOrResult.Value));
}

/// <summary>
Expand All @@ -132,26 +122,25 @@ public async Task<ActionResult<UserDto>> AddUserToSession(string inviteToken, [F

var (username, desiredRole) = joinDto;

var (completed, result) = await _sessionService.AddUserToSession(inviteToken, username, desiredRole);
var errorOrResult = await _sessionService.AddUserToSession(inviteToken, username, desiredRole);

if (completed)
if (errorOrResult.IsError)
{
var (sessionId, userId, _, role, token) = result;

Message<UserDto> Message = new Message<UserDto>
{
Type = MessageType.UserJoined,
Payload = new UserDto { Id = userId, Role = role, Token = token, Username = username },
};
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

await _webSocketHandler.Send(Message, sessionId);
var (sessionId, userId, _, role, token) = errorOrResult.Value.Item2;

return new ObjectResult(JsonConvert.SerializeObject(result));
}
else
Message<UserDto> Message = new Message<UserDto>
{
return BadRequest();
}
Type = MessageType.UserJoined,
Payload = new UserDto { Id = userId, Role = role, Token = token, Username = username },
};

await _webSocketHandler.Send(Message, sessionId);

return new ObjectResult(JsonConvert.SerializeObject(errorOrResult.Value.Item2));
}

[HttpPost]
Expand All @@ -169,22 +158,24 @@ public async Task<ActionResult> AddTask(long sessionId, [FromBody] TaskDto task)

Devon4NetLogger.Debug($"{userId}");

var (finished, taskDto) = await _sessionService.AddTaskToSession(sessionId, userId, task);
var errorOrResult = await _sessionService.AddTaskToSession(sessionId, userId, task);

if (finished)
if (errorOrResult.IsError)
{
Message<TaskDto> Message = new Message<TaskDto>
{
Type = MessageType.TaskCreated,
Payload = taskDto
};
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

await _webSocketHandler.Send(Message, sessionId);
Message<TaskDto> Message = new Message<TaskDto>
{
Type = MessageType.TaskCreated,
Payload = errorOrResult.Value.Item2
};

return Ok();
}
await _webSocketHandler.Send(Message, sessionId);

return Ok();

return BadRequest();
}

[HttpDelete]
Expand All @@ -197,31 +188,24 @@ public async Task<ActionResult> DeleteTask(long sessionId, string taskId)
{
Devon4NetLogger.Debug($"Delete-Request to delete task with id: {taskId} from session with id: {sessionId}");

try
{
var finished = await _sessionService.DeleteTask(sessionId, taskId);

if (finished)
{
Message<string> message = new Message<string>
{
Type = MessageType.TaskDeleted,
Payload = taskId
};
await _webSocketHandler.Send(message, sessionId);
return Ok();
}

var errorOrResult = await _sessionService.DeleteTask(sessionId, taskId);

if (errorOrResult.IsError)
{
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}
catch (Exception exception)

Message<string> message = new Message<string>
{
return exception switch
{
NotFoundException or TaskNotFoundException => NotFound(),
_ => StatusCode(500)
};
}
Type = MessageType.TaskDeleted,
Payload = taskId
};
await _webSocketHandler.Send(message, sessionId);
return Ok();


}

/// <summary>
Expand All @@ -240,11 +224,17 @@ public async Task<ActionResult<EstimationDto>> AddNewEstimation(long sessionId,

var (taskId, voteBy, complexity) = estimationDto;

var result = await _sessionService.AddNewEstimation(sessionId, taskId, voteBy, complexity);
var errorOrResult = await _sessionService.AddNewEstimation(sessionId, taskId, voteBy, complexity);

if (errorOrResult.IsError)
{
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

await _webSocketHandler.Send(new Message<EstimationDto> { Type = MessageType.EstimationAdded, Payload = estimationDto }, sessionId);

return StatusCode(StatusCodes.Status201Created, result);
return StatusCode(StatusCodes.Status201Created, errorOrResult.Value);
}

[HttpPut]
Expand All @@ -257,18 +247,19 @@ public async Task<IActionResult> ChangeTaskStatus(long sessionId, [FromBody] Tas
{
// Changing the status of a task requires other elements to be modified.
// There can always be only one open or evaluated task at the same time.
var (finished, modifiedTasks) = await _sessionService.ChangeTaskStatus(sessionId, statusChange);

if (finished)
{
await _webSocketHandler.Send(new Message<List<TaskStatusChangeDto>> { Type = MessageType.TaskStatusModified, Payload = modifiedTasks }, sessionId);
var errorOrResult = await _sessionService.ChangeTaskStatus(sessionId, statusChange);

return Ok(modifiedTasks);
}
else
if (errorOrResult.IsError)
{
return BadRequest("Zero entries got updated due to errors. Please ensure the task exists.");
Devon4NetLogger.Debug(errorOrResult.FirstError.Description);
return BadRequest();
}

await _webSocketHandler.Send(new Message<List<TaskStatusChangeDto>> { Type = MessageType.TaskStatusModified, Payload = errorOrResult.Value.Item2 }, sessionId);

return Ok(errorOrResult.Value.Item2);

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,26 @@ public async Task<IActionResult> GetSessionStatus(long id)
{
Devon4NetLogger.Debug($"Get-Request for session status with id: {id}");

try
{
var (isValid, inviteToken, tasks, users) = await _sessionService.GetStatus(id);
var errorOrStatus = await _sessionService.GetStatus(id);

Devon4NetLogger.Debug($"Session is valid: {isValid}");
if (errorOrStatus.IsError)
{
Devon4NetLogger.Debug(errorOrStatus.FirstError.Description);
return BadRequest();
}

var statusResult = new StatusDto
{
IsValid = isValid,
InviteToken = inviteToken,
Tasks = tasks.Select(item => TaskConverter.ModelToDto(item)).ToList(),
Users = users.Select(item => UserConverter.ModelToDto(item)).ToList(),
};
Devon4NetLogger.Debug($"Session is valid: {errorOrStatus.Value.Item1}");

return new ObjectResult(JsonConvert.SerializeObject(statusResult));
}
catch (Exception exception)
var statusResult = new StatusDto
{
Devon4NetLogger.Debug($"Exception thrown: {exception.Message}");
IsValid = errorOrStatus.Value.Item1,
InviteToken = errorOrStatus.Value.Item2,
Tasks = errorOrStatus.Value.Item3.Select(item => TaskConverter.ModelToDto(item)).ToList(),
Users = errorOrStatus.Value.Item4.Select(item => UserConverter.ModelToDto(item)).ToList(),
};

return exception switch
{
NotFoundException _ => NotFound(),
_ => StatusCode(500),
};
}
return new ObjectResult(JsonConvert.SerializeObject(statusResult));
}

}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Devon4Net.Application.WebAPI.Implementation.Domain.Entities;
using Devon4Net.Application.WebAPI.Implementation.Business.SessionManagement.Dtos;

using LiteDB;
using ErrorOr;

namespace Devon4Net.Application.WebAPI.Implementation.Business.SessionManagement.Service
{
Expand All @@ -10,38 +9,40 @@ namespace Devon4Net.Application.WebAPI.Implementation.Business.SessionManagement
/// </summary>
public interface ISessionService
{
public ErrorOr<bool> validateSession(Session session, long? sessionId);

public Task<Session> GetSession(long id);

public Task<Session> FindSessionWithInviteToken(string token);

public Task<(bool, string?, List<Devon4Net.Application.WebAPI.Implementation.Domain.Entities.Task>, List<User>)> GetStatus(long sessionId);
public Task<ErrorOr<(bool, string?, List<Domain.Entities.Task>, List<User>)>> GetStatus(long sessionId);

/// <summary>
/// CreateSession
/// </summary>
/// <param name="sessionDto"></param>
/// <returns></returns>
public Task<ResultCreateSessionDto> CreateSession(SessionDto sessionDto);
public Task<bool> InvalidateSession(long sessionId);
public Task<ErrorOr<ResultCreateSessionDto>> CreateSession(SessionDto sessionDto);
public Task<ErrorOr<bool>> InvalidateSession(long sessionId);

public Task<Estimation> AddNewEstimation(long sessionId, string taskId, string voteBy, int complexity);
public Task<ErrorOr<Estimation>> AddNewEstimation(long sessionId, string taskId, string voteBy, int complexity);

public Task<bool> RemoveUserFromSession(long id, String userId);
public Task<ErrorOr<bool>> RemoveUserFromSession(long id, String userId);

/// <summary>
/// Add an User to a given session
/// </summary>
public Task<(bool, JoinSessionResultDto?)> AddUserToSession(string inviteToken, string username, Role desiredRole);
public Task<ErrorOr<(bool, JoinSessionResultDto?)>> AddUserToSession(string inviteToken, string username, Role desiredRole);

public Task<(bool, TaskDto?)> AddTaskToSession(long sessionId, string userId, TaskDto task);
public Task<ErrorOr<(bool, TaskDto?)>> AddTaskToSession(long sessionId, string userId, TaskDto task);

/// <summary>
/// Delete a Task
/// </summary>
public Task<bool> DeleteTask(long sessionId, string taskId);
public Task<ErrorOr<bool>> DeleteTask(long sessionId, string taskId);

public Task<(bool, List<TaskStatusChangeDto>)> ChangeTaskStatus(long sessionId, TaskStatusChangeDto statusChange);
public Task<ErrorOr<(bool, List<TaskStatusChangeDto>)>> ChangeTaskStatus(long sessionId, TaskStatusChangeDto statusChange);

public Task<bool> isPrivilegedUser(long sessionId, string userId);
public Task<ErrorOr<bool>> isPrivilegedUser(long sessionId, string userId);
}
}
Loading