mirror of
https://github.com/bitwarden/server.git
synced 2025-07-01 08:02:49 -05:00
share api
This commit is contained in:
66
src/Api/Controllers/SharesController.cs
Normal file
66
src/Api/Controllers/SharesController.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Bit.Core.Repositories;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Bit.Api.Models;
|
||||
using Bit.Core.Exceptions;
|
||||
using Bit.Core.Services;
|
||||
|
||||
namespace Bit.Api.Controllers
|
||||
{
|
||||
[Route("shares")]
|
||||
[Authorize("Application")]
|
||||
public class SharesController : Controller
|
||||
{
|
||||
private readonly IShareRepository _shareRepository;
|
||||
private readonly IUserService _userService;
|
||||
|
||||
public SharesController(
|
||||
IShareRepository shareRepository,
|
||||
IUserService userService)
|
||||
{
|
||||
_shareRepository = shareRepository;
|
||||
_userService = userService;
|
||||
}
|
||||
|
||||
[HttpGet("{id}")]
|
||||
public async Task<ShareResponseModel> Get(string id)
|
||||
{
|
||||
var userId = _userService.GetProperUserId(User).Value;
|
||||
var share = await _shareRepository.GetByIdAsync(new Guid(id), userId);
|
||||
if(share == null)
|
||||
{
|
||||
throw new NotFoundException();
|
||||
}
|
||||
|
||||
return new ShareResponseModel(share);
|
||||
}
|
||||
|
||||
[HttpPost("")]
|
||||
public async Task<ShareResponseModel> Post([FromBody]ShareRequestModel model)
|
||||
{
|
||||
var share = model.ToShare(_userService.GetProperUserId(User).Value);
|
||||
await _shareRepository.CreateAsync(share);
|
||||
|
||||
var response = new ShareResponseModel(share);
|
||||
return response;
|
||||
}
|
||||
|
||||
[HttpDelete("{id}")]
|
||||
[HttpPost("{id}/delete")]
|
||||
public async Task Delete(string id)
|
||||
{
|
||||
var share = await _shareRepository.GetByIdAsync(new Guid(id), _userService.GetProperUserId(User).Value);
|
||||
if(share == null)
|
||||
{
|
||||
throw new NotFoundException();
|
||||
}
|
||||
|
||||
// TODO: permission checks
|
||||
|
||||
await _shareRepository.DeleteAsync(share);
|
||||
}
|
||||
}
|
||||
}
|
35
src/Api/Models/Request/ShareRequestModel.cs
Normal file
35
src/Api/Models/Request/ShareRequestModel.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Bit.Core.Domains;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Bit.Api.Models
|
||||
{
|
||||
public class ShareRequestModel
|
||||
{
|
||||
[Required]
|
||||
[StringLength(36)]
|
||||
public string UserId { get; set; }
|
||||
[Required]
|
||||
[StringLength(36)]
|
||||
public string CipherId { get; set; }
|
||||
public string Key { get; set; }
|
||||
|
||||
public Share ToShare(Guid sharerUserId)
|
||||
{
|
||||
return ToShare(new Share
|
||||
{
|
||||
SharerUserId = sharerUserId
|
||||
});
|
||||
}
|
||||
|
||||
public Share ToShare(Share existingShare)
|
||||
{
|
||||
existingShare.UserId = new Guid(UserId);
|
||||
existingShare.CipherId = new Guid(CipherId);
|
||||
existingShare.Key = Key;
|
||||
|
||||
return existingShare;
|
||||
}
|
||||
}
|
||||
}
|
36
src/Api/Models/Response/ShareResponseModel.cs
Normal file
36
src/Api/Models/Response/ShareResponseModel.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using Bit.Core.Domains;
|
||||
using System.Collections.Generic;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Bit.Api.Models
|
||||
{
|
||||
public class ShareResponseModel : ResponseModel
|
||||
{
|
||||
public ShareResponseModel(Share share)
|
||||
: base("share")
|
||||
{
|
||||
if(share == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(share));
|
||||
}
|
||||
|
||||
Id = share.Id.ToString();
|
||||
UserId = share.UserId.ToString();
|
||||
SharerUserId = share.SharerUserId.ToString();
|
||||
CipherId = share.CipherId.ToString();
|
||||
Key = Key;
|
||||
Permissions = share.Permissions == null ? null :
|
||||
JsonConvert.DeserializeObject<IEnumerable<Core.Enums.SharePermissionType>>(share.Permissions);
|
||||
Status = share.Status;
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
public string UserId { get; set; }
|
||||
public string SharerUserId { get; set; }
|
||||
public string CipherId { get; set; }
|
||||
public string Key { get; set; }
|
||||
public IEnumerable<Core.Enums.SharePermissionType> Permissions { get; set; }
|
||||
public Core.Enums.ShareStatusType? Status { get; set; }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user