cloutier--bird.makeup/src/BirdsiteLive/Controllers/UsersController.cs

79 lines
2.5 KiB
C#
Raw Normal View History

2020-06-06 00:14:42 -04:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
2020-06-06 01:29:13 -04:00
using BirdsiteLive.ActivityPub;
2020-06-06 00:14:42 -04:00
using BirdsiteLive.Domain;
using BirdsiteLive.Twitter;
2020-06-06 01:29:13 -04:00
using Microsoft.AspNetCore.Http;
2020-06-06 00:14:42 -04:00
using Microsoft.AspNetCore.Mvc;
2020-06-06 01:29:13 -04:00
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
2020-06-06 00:14:42 -04:00
namespace BirdsiteLive.Controllers
{
public class UsersController : Controller
{
private readonly ITwitterService _twitterService;
private readonly IUserService _userService;
#region Ctor
public UsersController(ITwitterService twitterService, IUserService userService)
{
_twitterService = twitterService;
_userService = userService;
}
#endregion
[Route("/@{id}")]
[Route("/users/{id}")]
public IActionResult Index(string id)
{
var user = _twitterService.GetUser(id);
if (user == null) return NotFound();
var r = Request.Headers["Accept"].First();
if (r.Contains("application/activity+json"))
{
var apUser = _userService.GetUser(user);
2020-06-06 01:29:13 -04:00
var jsonApUser = JsonConvert.SerializeObject(apUser);
return Content(jsonApUser, "application/json");
2020-06-06 00:14:42 -04:00
}
return View(user);
}
[Route("/users/{id}/inbox")]
[HttpPost]
public async Task<IActionResult> Inbox()
{
var r = Request;
using (var reader = new StreamReader(Request.Body))
{
var body = await reader.ReadToEndAsync();
2020-06-06 01:29:13 -04:00
var activity = ApDeserializer.ProcessActivity(body);
2020-06-06 00:14:42 -04:00
// Do something
2020-06-06 01:29:13 -04:00
switch (activity.type)
{
case "Follow":
var succeeded = await _userService.FollowRequestedAsync(r.Headers["Signature"].First(), r.Method, r.Path, r.QueryString.ToString(), RequestHeaders(r.Headers), activity as ActivityFollow);
2020-06-28 21:56:10 -04:00
if (succeeded) return Accepted();
2020-06-06 01:29:13 -04:00
else return Unauthorized();
break;
default:
return Ok();
}
2020-06-06 00:14:42 -04:00
}
return Ok();
}
2020-06-06 01:29:13 -04:00
private Dictionary<string, string> RequestHeaders(IHeaderDictionary header)
{
2020-06-10 20:40:25 -04:00
return header.ToDictionary<KeyValuePair<string, StringValues>, string, string>(h => h.Key.ToLowerInvariant(), h => h.Value);
2020-06-06 01:29:13 -04:00
}
2020-06-06 00:14:42 -04:00
}
}