Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.
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
6 changes: 3 additions & 3 deletions Api/Controllers/PluginController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ public async Task<ActionResult<Plugin>> CreatePlugin([FromBody] PluginCreateRequ
{
string userId = GetUserId();

if (await pluginRepository.HasReachedPluginQuota(userId))
if (await pluginRepository.HasReachedPluginQuota(User))
return BadRequest("Max plugins reached");

var plugin = mapper.Map<Plugin>(request);
plugin.UserId = userId;
var createdPlugin = await pluginRepository.Add(plugin, userId);
var createdPlugin = await pluginRepository.Add(plugin,User);

return CreatedAtAction(nameof(CreatePlugin), new { userId = createdPlugin.UserId, pluginId = createdPlugin.Id }, createdPlugin);
}
Expand All @@ -48,7 +48,7 @@ public async Task<ActionResult<PluginsResponse>> GetPlugins()
var plugins = await pluginRepository.GetByUserId(userId);

var result = mapper.Map<PluginsResponse>(plugins);
result.MaxPlugins = await subscriptionRepository.IsUserPremium(userId) ? 3 : 1;
result.MaxPlugins = await pluginRepository.maxPlugins(userId, User);
return Ok(result);
}

Expand Down
9 changes: 8 additions & 1 deletion Api/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ static void AddServices(WebApplicationBuilder builder, string version)
var contactUrl = builder.Configuration.GetValue<string>("ContactLogicApp:Url");
ArgumentNullException.ThrowIfNull(contactUrl);
builder.Services.AddSingleton(new ContactSetting() { Url = contactUrl });

builder.Services.AddScoped<IPluginRepository, PluginRepository>();
builder.Services.AddScoped<SubscriptionRepository>();
builder.Services.AddScoped<IChatService, ChatService>();
Expand Down Expand Up @@ -116,6 +116,13 @@ void AddConfigrations(WebApplicationBuilder builder)
var gptSettings = new GPTSettings();
builder.Configuration.GetSection("GPTSettings").Bind(gptSettings);
builder.Services.AddSingleton(gptSettings);
var AdminEmails = builder.Configuration.GetSection("AdminEmail").Get<List<string>>();
if (AdminEmails != null)
{
var adminWhitelist = new AdminWhitelist();
adminWhitelist.emails = AdminEmails;
builder.Services.AddSingleton(adminWhitelist);
}

builder.Services.AddSingleton(x => x.GetRequiredService<IConfiguration>().GetValue<string>("FrontendDomain")!); //make this an obj
}
12 changes: 12 additions & 0 deletions Application/Plugins/AdminWhitelist.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
public class AdminWhitelist
{
public List<string>? emails { get; set; }
public bool Contains(string email)
{
if (email == null)
{
return false;
}
return this.emails != null && this.emails.Any(e => string.Equals(e, email, StringComparison.OrdinalIgnoreCase));
}
}
4 changes: 3 additions & 1 deletion Application/Plugins/IPluginRepository.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Security.Claims;
using AiPlugin.Application.common;
using AiPlugin.Domain.Plugin;

Expand All @@ -6,5 +7,6 @@ namespace AiPlugin.Application.Plugins;
public interface IPluginRepository : IBaseRepository<Plugin>
{
public Task<IEnumerable<Plugin>> GetByUserId(string userid, CancellationToken cancellationToken = default);
public Task<bool> HasReachedPluginQuota(string userId);
public Task<bool> HasReachedPluginQuota(ClaimsPrincipal user);
public Task<int> maxPlugins(string userId, ClaimsPrincipal? user = null);
}
32 changes: 25 additions & 7 deletions Application/Plugins/PluginRepository.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
using AiPlugin.Application.Plugins;
using System.Security.Claims;
using System.Text.RegularExpressions;
using AiPlugin.Domain.Plugin;
using AiPlugin.Infrastructure;
using Microsoft.EntityFrameworkCore;

namespace AiPlugin.Application.Plugins;

public class PluginRepository : IPluginRepository
{
private readonly AiPluginDbContext dbContext;
private readonly SubscriptionRepository subscriptionRepository;
private readonly AdminWhitelist adminWhitelist;

public PluginRepository(AiPluginDbContext dbContext, SubscriptionRepository subscriptionRepository)
public PluginRepository(AiPluginDbContext dbContext, SubscriptionRepository subscriptionRepository, AdminWhitelist adminWhitelist)
{
this.dbContext = dbContext;
this.subscriptionRepository = subscriptionRepository;
this.adminWhitelist = adminWhitelist;
}

public async Task<Plugin> Add(Plugin entity, string userId, CancellationToken cancellationToken = default)
public async Task<Plugin> Add(Plugin entity, ClaimsPrincipal user, CancellationToken cancellationToken = default)
{
CheckPlugin(entity);
if (await HasReachedPluginQuota(userId))
if (await HasReachedPluginQuota(user))
{
throw new Exception("Max plugins reached");
}
Expand Down Expand Up @@ -70,16 +73,31 @@ public async Task Delete(Guid id, CancellationToken cancellationToken = default)
await dbContext.SaveChangesAsync(cancellationToken);
}

public async Task<bool> HasReachedPluginQuota(string userId)
public async Task<bool> HasReachedPluginQuota(ClaimsPrincipal user)
{
var isPremium = await subscriptionRepository.IsUserPremium(userId);
var userId = user.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? throw new UnauthorizedAccessException("UserId not found");
var userEmail = user?.FindFirst(ClaimTypes.Email)?.Value;
if (userEmail != null && adminWhitelist.Contains(userEmail))
{
return false;
}

return (await dbContext
.Plugins
.Include(x => x.Sections)
.Where(x => !x.isDeleted)
.CountAsync(x => x.UserId == userId)
) >= (isPremium ? 3 : 1);
) >= await maxPlugins(userId, user);
}
public async Task<int> maxPlugins(string userId, ClaimsPrincipal? user = null)
{
var userEmail = user?.FindFirst(ClaimTypes.Email)?.Value;
if (userEmail != null && adminWhitelist.Contains(userEmail))
{
return 10000;
}
var isPremium = await subscriptionRepository.IsUserPremium(userId);
return isPremium ? 3 : 1;
}
private void CheckPlugin(Plugin entity)
{
Expand Down
3 changes: 2 additions & 1 deletion Application/common/IBaseRepository.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Security.Claims;
using AiPlugin.Domain.Common;
using AiPlugin.Domain.Plugin;

namespace AiPlugin.Application.common;

public interface IBaseRepository<T> where T : EntityBase
{
public Task<T> Add(T entity, string userId, CancellationToken cancellationToken = default);
public Task<T> Add(T entity,ClaimsPrincipal user, CancellationToken cancellationToken = default);
public Task<T> Get(Guid id, CancellationToken cancellationToken = default);
public Task<T> Update(T entity, CancellationToken cancellationToken = default);
public Task Delete(Guid id, CancellationToken cancellationToken = default);
Expand Down