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 2 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(userId,User))
Comment thread
ElSalvo96 marked this conversation as resolved.
Outdated
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, userId,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(string userId, ClaimsPrincipal? user = null);
public Task<int> maxPlugins(string userId, ClaimsPrincipal? user = null);
}
33 changes: 25 additions & 8 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, string userId, ClaimsPrincipal? user = null, CancellationToken cancellationToken = default)
{
CheckPlugin(entity);
if (await HasReachedPluginQuota(userId))
if (await HasReachedPluginQuota(userId, user))
{
throw new Exception("Max plugins reached");
}
Expand Down Expand Up @@ -70,16 +73,30 @@ 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(string userId, ClaimsPrincipal? user = null)
{
var isPremium = await subscriptionRepository.IsUserPremium(userId);

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, string userId,ClaimsPrincipal? user = null, 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