- Загрузить рабочую область
- Включить участников и пользователей
- Проверить, принадлежит ли текущий пользователь рабочей области
- Вернуть 404/403 соответственно
Код: Выделить всё
var workspace = await db.Workspaces
.Include(w => w.Members)
.ThenInclude(m => m.User)
.FirstOrDefaultAsync(w => w.Id == workspaceId);
if (workspace is null)
return NotFound();
if (!workspace.Members.Any(m => m.User.Email == User.Identity!.Name))
return Forbid();
Я пробовал использовать политики авторизации, но для моего текущего масштаба это похоже на перепроектирование.
Мне бы очень хотелось от этого избавиться. Что бы вы сделали в этом случае?
Полный пример кода конечной точки:
Код: Выделить всё
[HttpPost("{workspaceId}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task Create(Guid workspaceId, [FromBody] AppointmentCreateModel model)
{
var workspace = await db.Workspaces
.Include(w => w.Members)
.ThenInclude(m => m.User)
.FirstOrDefaultAsync(w => w.Id == workspaceId);
if (workspace is null)
return NotFound();
if (!workspace.Members.Any(m => m.User.Email == User.Identity!.Name))
return Forbid();
var appointment = new Appointment
{
WorkspaceId = workspaceId,
ContactName = model.ContactName,
OriginalName = model.ContactName,
AppointmentTime = model.AppointmentTime,
Source = AppointmentSource.Dashboard,
CreatedAt = DateTime.UtcNow,
};
db.Appointments.Add(appointment);
await db.SaveChangesAsync();
return Ok(new AppointmentDto(appointment));
}