chat room persistent db model

This commit is contained in:
2019-05-08 03:13:07 +01:00
parent f9364b7d26
commit c1e90a554e
7 changed files with 378 additions and 21 deletions

View File

@ -0,0 +1,186 @@
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Authorization;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc;
using Microsoft.Data.Entity;
using Yavsc.Models;
using Yavsc.Models.Chat;
namespace Yavsc.Controllers
{
[Produces("application/json")]
[Route("api/ChatRoomAccessApi")]
public class ChatRoomAccessApiController : Controller
{
private ApplicationDbContext _context;
public ChatRoomAccessApiController(ApplicationDbContext context)
{
_context = context;
}
// GET: api/ChatRoomAccessApi
[HttpGet, Authorize("AdministratorOnly")]
public IEnumerable<ChatRoomAccess> GetChatRoomAccess()
{
return _context.ChatRoomAccess;
}
// GET: api/ChatRoomAccessApi/5
[HttpGet("{id}", Name = "GetChatRoomAccess"), Authorize("AdministratorOnly")]
public async Task<IActionResult> GetChatRoomAccess([FromRoute] string id)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
ChatRoomAccess chatRoomAccess = await _context.ChatRoomAccess.SingleAsync(m => m.ChannelName == id);
if (chatRoomAccess == null)
{
return HttpNotFound();
}
var uid = User.GetUserId();
if (uid != chatRoomAccess.UserId && uid != chatRoomAccess.Room.OwnerId
&& ! User.IsInRole(Constants.AdminGroupName))
{
ModelState.AddModelError("UserId","get refused");
return HttpBadRequest(ModelState);
}
return Ok(chatRoomAccess);
}
// PUT: api/ChatRoomAccessApi/5
[HttpPut("{id}")]
public async Task<IActionResult> PutChatRoomAccess([FromRoute] string id, [FromBody] ChatRoomAccess chatRoomAccess)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
var uid = User.GetUserId();
if (id != chatRoomAccess.ChannelName)
{
return HttpBadRequest();
}
var room = _context.ChatRoom.First(channel => channel.Name == chatRoomAccess.ChannelName );
if (uid != room.OwnerId && ! User.IsInRole(Constants.AdminGroupName))
{
ModelState.AddModelError("ChannelName", "access put refused");
return HttpBadRequest(ModelState);
}
_context.Entry(chatRoomAccess).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ChatRoomAccessExists(id))
{
return HttpNotFound();
}
else
{
throw;
}
}
return new HttpStatusCodeResult(StatusCodes.Status204NoContent);
}
// POST: api/ChatRoomAccessApi
[HttpPost]
public async Task<IActionResult> PostChatRoomAccess([FromBody] ChatRoomAccess chatRoomAccess)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
var uid = User.GetUserId();
var room = _context.ChatRoom.First(channel => channel.Name == chatRoomAccess.ChannelName );
if (room == null || (uid != room.OwnerId && ! User.IsInRole(Constants.AdminGroupName)))
{
ModelState.AddModelError("ChannelName", "access post refused");
return HttpBadRequest(ModelState);
}
_context.ChatRoomAccess.Add(chatRoomAccess);
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (ChatRoomAccessExists(chatRoomAccess.ChannelName))
{
return new HttpStatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
throw;
}
}
return CreatedAtRoute("GetChatRoomAccess", new { id = chatRoomAccess.ChannelName }, chatRoomAccess);
}
// DELETE: api/ChatRoomAccessApi/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteChatRoomAccess([FromRoute] string id)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
ChatRoomAccess chatRoomAccess = await _context.ChatRoomAccess.Include(acc => acc.Room).SingleAsync(m => m.ChannelName == id);
if (chatRoomAccess == null)
{
return HttpNotFound();
}
var uid = User.GetUserId();
var room = _context.ChatRoom.First(channel => channel.Name == chatRoomAccess.ChannelName );
if (room == null || (uid != room.OwnerId && chatRoomAccess.UserId != uid && ! User.IsInRole(Constants.AdminGroupName)))
{
ModelState.AddModelError("UserId", "access drop refused");
return HttpBadRequest(ModelState);
}
_context.ChatRoomAccess.Remove(chatRoomAccess);
await _context.SaveChangesAsync();
return Ok(chatRoomAccess);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_context.Dispose();
}
base.Dispose(disposing);
}
private bool ChatRoomAccessExists(string id)
{
return _context.ChatRoomAccess.Count(e => e.ChannelName == id) > 0;
}
}
}

View File

@ -0,0 +1,167 @@
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc;
using Microsoft.Data.Entity;
using Yavsc.Models;
using Yavsc.Models.Chat;
namespace Yavsc.Controllers
{
[Produces("application/json")]
[Route("api/ChatRoomApi")]
public class ChatRoomApiController : Controller
{
private ApplicationDbContext _context;
public ChatRoomApiController(ApplicationDbContext context)
{
_context = context;
}
// GET: api/ChatRoomApi
[HttpGet]
public IEnumerable<ChatRoom> GetChatRoom()
{
return _context.ChatRoom;
}
// GET: api/ChatRoomApi/5
[HttpGet("{id}", Name = "GetChatRoom")]
public async Task<IActionResult> GetChatRoom([FromRoute] string id)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
ChatRoom chatRoom = await _context.ChatRoom.SingleAsync(m => m.Name == id);
if (chatRoom == null)
{
return HttpNotFound();
}
return Ok(chatRoom);
}
// PUT: api/ChatRoomApi/5
[HttpPut("{id}")]
public async Task<IActionResult> PutChatRoom([FromRoute] string id, [FromBody] ChatRoom chatRoom)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
if (id != chatRoom.Name)
{
return HttpBadRequest();
}
if (User.GetUserId() != chatRoom.OwnerId )
{
return HttpBadRequest(new {error = "OwnerId"});
}
_context.Entry(chatRoom).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ChatRoomExists(id))
{
return HttpNotFound();
}
else
{
throw;
}
}
return new HttpStatusCodeResult(StatusCodes.Status204NoContent);
}
// POST: api/ChatRoomApi
[HttpPost]
public async Task<IActionResult> PostChatRoom([FromBody] ChatRoom chatRoom)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
if (User.GetUserId() != chatRoom.OwnerId )
{
return HttpBadRequest(new {error = "OwnerId"});
}
_context.ChatRoom.Add(chatRoom);
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (ChatRoomExists(chatRoom.Name))
{
return new HttpStatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
throw;
}
}
return CreatedAtRoute("GetChatRoom", new { id = chatRoom.Name }, chatRoom);
}
// DELETE: api/ChatRoomApi/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteChatRoom([FromRoute] string id)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
ChatRoom chatRoom = await _context.ChatRoom.SingleAsync(m => m.Name == id);
if (chatRoom == null)
{
return HttpNotFound();
}
if (User.GetUserId() != chatRoom.OwnerId )
{
if (!User.IsInRole(Constants.AdminGroupName))
return HttpBadRequest(new {error = "OwnerId"});
}
_context.ChatRoom.Remove(chatRoom);
await _context.SaveChangesAsync();
return Ok(chatRoom);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_context.Dispose();
}
base.Dispose(disposing);
}
private bool ChatRoomExists(string id)
{
return _context.ChatRoom.Count(e => e.Name == id) > 0;
}
}
}

View File

@ -25,7 +25,8 @@ namespace Yavsc.Controllers
public IEnumerable<ChatUserInfo> GetUserList() public IEnumerable<ChatUserInfo> GetUserList()
{ {
List<ChatUserInfo> result = new List<ChatUserInfo>(); List<ChatUserInfo> result = new List<ChatUserInfo>();
var cxsQuery = dbContext.ChatConnection?.Include(c=>c.Owner).GroupBy( c => c.ApplicationUserId ); var cxsQuery = dbContext.ChatConnection?.Include(c=>c.Owner)
.Where(cx => cx.Connected).GroupBy( c => c.ApplicationUserId );
// List<ChatUserInfo> result = new List<ChatUserInfo>(); // List<ChatUserInfo> result = new List<ChatUserInfo>();
if (cxsQuery!=null) if (cxsQuery!=null)
@ -48,5 +49,7 @@ namespace Yavsc.Controllers
} }
return result; return result;
} }
} }
} }

View File

@ -1,47 +1,47 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Data.Entity; using Microsoft.Data.Entity;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Yavsc.Helpers.Google namespace Yavsc.Helpers.Auth
{ {
using Yavsc.Models; using Yavsc.Models;
using Yavsc.Models.Auth; using Yavsc.Models.Auth;
public static class GoogleStoreHelper { public static class ExternalAuthStoreHelper {
public static Task<OAuth2Tokens> GetTokensAsync(this ApplicationDbContext context, string googleUserId) public static Task<OAuth2Tokens> GetTokensAsync(this ApplicationDbContext context, string externalUserId)
{ {
if (string.IsNullOrEmpty(googleUserId)) if (string.IsNullOrEmpty(externalUserId))
{ {
throw new ArgumentException("email MUST have a value"); throw new ArgumentException("externalUserId MUST have a value");
} }
var item = context.Tokens.FirstOrDefault(x => x.UserId == googleUserId); var item = context.OAuth2Tokens.FirstOrDefault(x => x.UserId == externalUserId);
// TODO Refresh token // TODO Refresh token
return Task.FromResult(item); return Task.FromResult(item);
} }
public static Task StoreTokenAsync(this ApplicationDbContext context, string googleUserId, JObject response, string accessToken, public static Task StoreTokenAsync(this ApplicationDbContext context, string externalUserId, JObject response, string accessToken,
string tokenType, string refreshToken, string expiresIn string tokenType, string refreshToken, string expiresIn
) )
{ {
if (string.IsNullOrEmpty(googleUserId)) if (string.IsNullOrEmpty(externalUserId))
{ {
throw new ArgumentException("googleUserId MUST have a value"); throw new ArgumentException("googleUserId MUST have a value");
} }
var item = context.Tokens.SingleOrDefaultAsync(x => x.UserId == googleUserId).Result; var item = context.OAuth2Tokens.SingleOrDefaultAsync(x => x.UserId == externalUserId).Result;
if (item == null) if (item == null)
{ {
context.Tokens.Add(new OAuth2Tokens context.OAuth2Tokens.Add(new OAuth2Tokens
{ {
TokenType = "Bearer", TokenType = "Bearer",
AccessToken = accessToken, AccessToken = accessToken,
RefreshToken = refreshToken, RefreshToken = refreshToken,
Expiration = DateTime.Now.AddSeconds(int.Parse(expiresIn)), Expiration = DateTime.Now.AddSeconds(int.Parse(expiresIn)),
UserId = googleUserId UserId = externalUserId
}); });
} }
else else
@ -50,9 +50,9 @@ namespace Yavsc.Helpers.Google
item.Expiration = DateTime.Now.AddMinutes(int.Parse(expiresIn)); item.Expiration = DateTime.Now.AddMinutes(int.Parse(expiresIn));
if (refreshToken != null) if (refreshToken != null)
item.RefreshToken = refreshToken; item.RefreshToken = refreshToken;
context.Tokens.Update(item); context.OAuth2Tokens.Update(item);
} }
context.SaveChanges(googleUserId); context.SaveChanges(externalUserId);
return Task.FromResult(0); return Task.FromResult(0);
} }
} }

View File

@ -1,8 +1,6 @@
using System; using System;
using Microsoft.Data.Entity; using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Infrastructure; using Microsoft.Data.Entity.Infrastructure;
using Microsoft.Data.Entity.Metadata;
using Microsoft.Data.Entity.Migrations;
using Yavsc.Models; using Yavsc.Models;
namespace Yavsc.Migrations namespace Yavsc.Migrations

View File

@ -33,7 +33,7 @@ namespace Yavsc.Models
using Attributes; using Attributes;
using Bank; using Bank;
using Payment; using Payment;
using Yavsc.Models.Calendar; using Calendar;
using Blog; using Blog;
using Yavsc.Abstract.Identity; using Yavsc.Abstract.Identity;
using Yavsc.Server.Models.Blog; using Yavsc.Server.Models.Blog;
@ -130,7 +130,7 @@ namespace Yavsc.Models
/// open auth tokens /// open auth tokens
/// </summary> /// </summary>
/// <returns>tokens</returns> /// <returns>tokens</returns>
public DbSet<OAuth2Tokens> Tokens { get; set; } public DbSet<OAuth2Tokens> OAuth2Tokens { get; set; }
/// <summary> /// <summary>
/// References all declared external NativeConfidential devices /// References all declared external NativeConfidential devices
@ -255,7 +255,8 @@ namespace Yavsc.Models
public DbSet<Comment> Comment { get; set; } public DbSet<Comment> Comment { get; set; }
public DbSet<Announce> Announce { get; set; } public DbSet<Announce> Announce { get; set; }
// TODO useless, to drop
public DbSet<ChatConnection> ChatConnection { get; set; } public DbSet<ChatConnection> ChatConnection { get; set; }
public DbSet<ChatRoom> ChatRoom { get; set; } public DbSet<ChatRoom> ChatRoom { get; set; }
@ -270,5 +271,7 @@ namespace Yavsc.Models
public DbSet<LiveFlow> LiveFlow { get; set; } public DbSet<LiveFlow> LiveFlow { get; set; }
public DbSet<ChatRoomAccess> ChatRoomAccess { get; set; }
} }
} }

View File

@ -23,8 +23,8 @@ namespace Yavsc {
using System.Threading.Tasks; using System.Threading.Tasks;
using Auth; using Auth;
using Extensions; using Extensions;
using Helpers.Google;
using Models; using Models;
using Yavsc.Helpers.Auth;
public partial class Startup { public partial class Startup {
public static CookieAuthenticationOptions ExternalCookieAppOptions { get; private set; } public static CookieAuthenticationOptions ExternalCookieAppOptions { get; private set; }