Skip to content
Merged
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
309 changes: 236 additions & 73 deletions Integrations/MCP/ScriptBee.MCP/Generated/GatewayApi.g.cs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion ScriptBeeWebApp/src/Common/Common/DateTimeProvider.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace ScriptBee.Common;

public class DateTimeProvider : IDateTimeProvider
public sealed class DateTimeProvider : IDateTimeProvider
{
public DateTimeOffset UtcNow() => DateTimeOffset.UtcNow;
}
2 changes: 1 addition & 1 deletion ScriptBeeWebApp/src/Common/Common/GuidProvider.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace ScriptBee.Common;

public class GuidProvider : IGuidProvider
public sealed class GuidProvider : IGuidProvider
{
public Guid NewGuid() => Guid.CreateVersion7();
}
6 changes: 6 additions & 0 deletions ScriptBeeWebApp/src/Common/Common/ISecureRandomProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ScriptBee.Common;

public interface ISecureRandomProvider
{
byte[] GetBytes(int count);
}
8 changes: 8 additions & 0 deletions ScriptBeeWebApp/src/Common/Common/SecureRandomProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Security.Cryptography;

namespace ScriptBee.Common;

public sealed class SecureRandomProvider : ISecureRandomProvider
{
public byte[] GetBytes(int count) => RandomNumberGenerator.GetBytes(32);
}
13 changes: 13 additions & 0 deletions ScriptBeeWebApp/src/Common/Model/Project/ProjectToken.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using ScriptBee.Domain.Model.User;

namespace ScriptBee.Domain.Model.Project;

public record ProjectToken(
ProjectTokenId Id,
ProjectId ProjectId,
string TokenHash,
string? Description,
UserRole Role,
DateTimeOffset CreatedAt,
DateTimeOffset ExpiresAt
);
6 changes: 6 additions & 0 deletions ScriptBeeWebApp/src/Common/Model/Project/ProjectTokenId.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ScriptBee.Domain.Model.Project;

public readonly record struct ProjectTokenId(string Value)
{
public override string ToString() => Value;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using ScriptBee.Domain.Model.Project;
using ScriptBee.Domain.Model.User;
using ScriptBee.Persistence.Mongodb.Repository;

namespace ScriptBee.Persistence.Mongodb.Entity;

[BsonIgnoreExtraElements]
public class MongodbProjectToken : IDocument
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = null!;

public required string ProjectId { get; init; }
public required string TokenHash { get; init; }
public string? Description { get; init; }

public required string Role { get; init; }

public required DateTimeOffset CreatedAt { get; init; }
public required DateTimeOffset ExpiresAt { get; init; }

public ProjectToken ToProjectToken()
{
return new ProjectToken(
new ProjectTokenId(Id),
Domain.Model.Project.ProjectId.FromValue(ProjectId),
TokenHash,
Description,
new UserRole(Role),
CreatedAt,
ExpiresAt
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public IServiceCollection AddResourceMembersAdapters(IMongoDatabase mongoDatabas
.AddSingleton<IRemoveProjectMember, ResourceMembersPersistenceAdapter>();
}

public IServiceCollection AddUserManagementAdaptersAdapters(IMongoDatabase mongoDatabase)
public IServiceCollection AddUserManagementAdapters(IMongoDatabase mongoDatabase)
{
return services
.AddMongoCollection<MongodbUser>(mongoDatabase, "Users")
Expand All @@ -52,5 +52,14 @@ public IServiceCollection AddUserManagementAdaptersAdapters(IMongoDatabase mongo
.AddSingleton<IGetOrAddUser, UserManagementPersistenceAdapter>()
.AddSingleton<IGetAllUsers, UserManagementPersistenceAdapter>();
}

public IServiceCollection AddProjectTokensAdapters(IMongoDatabase mongoDatabase)
{
return services
.AddMongoCollection<MongodbProjectToken>(mongoDatabase, "ProjectTokens")
.AddSingleton<ICreateProjectToken, ProjectTokensPersistenceAdapter>()
.AddSingleton<IGetAllProjectTokens, ProjectTokensPersistenceAdapter>()
.AddSingleton<IDeleteProjectToken, ProjectTokensPersistenceAdapter>();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using MongoDB.Driver;
using ScriptBee.Domain.Model.Project;
using ScriptBee.Domain.Model.User;
using ScriptBee.Persistence.Mongodb.Entity;
using ScriptBee.Persistence.Mongodb.Repository;
using ScriptBee.Ports.Permissions;

namespace ScriptBee.Persistence.Mongodb;

public sealed class ProjectTokensPersistenceAdapter(
IMongoRepository<MongodbProjectToken> mongoRepository
) : ICreateProjectToken, IGetAllProjectTokens, IDeleteProjectToken
{
public async Task<ProjectToken> CreateToken(
ProjectId projectId,
string tokenHash,
string? description,
UserRole role,
DateTimeOffset expiresAt,
CancellationToken cancellationToken
)
{
var mongoToken = new MongodbProjectToken
{
ProjectId = projectId.Value,
Description = description,
TokenHash = tokenHash,
Role = role.Value,
CreatedAt = DateTimeOffset.UtcNow,
ExpiresAt = expiresAt,
};

await mongoRepository.CreateDocument(mongoToken, cancellationToken);

return mongoToken.ToProjectToken();
}

public async Task<List<ProjectToken>> GetAllForProjectId(
ProjectId projectId,
CancellationToken cancellationToken
)
{
var tokens = await mongoRepository.GetAllDocuments(
token => token.ProjectId == projectId.Value,
cancellationToken
);
return [.. tokens.Select(t => t.ToProjectToken())];
}

public async Task DeleteToken(
ProjectId projectId,
ProjectTokenId tokenId,
CancellationToken cancellationToken
)
{
var filter = Builders<MongodbProjectToken>.Filter.And(
Builders<MongodbProjectToken>.Filter.Eq(m => m.ProjectId, projectId.Value),
Builders<MongodbProjectToken>.Filter.Eq(m => m.Id, tokenId.Value)
);

await mongoRepository.MongoCollection.DeleteOneAsync(filter, cancellationToken);
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.ComponentModel;
using ScriptBee.Domain.Model.Project;
using ScriptBee.Domain.Model.User;
using ScriptBee.UseCases.Gateway;

namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

[Description("Command used to create a new project toke.")]
public record WebCreateProjectTokenRequest(
string? Description,
string Role,
DateTimeOffset ExpiresAt
)
{
public CreateProjectTokenCommand Map(ProjectId projectId)
{
return new CreateProjectTokenCommand(projectId, Description, new UserRole(Role), ExpiresAt);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using ScriptBee.UseCases.Gateway;

namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebCreateProjectTokenResponse(
string Id,
string Token,
string? Description,
string Role,
DateTimeOffset CreatedAt,
DateTimeOffset ExpiresAt
)
{
public static WebCreateProjectTokenResponse Map(NewProjectTokenResult result)
{
return new WebCreateProjectTokenResponse(
result.Token.Id.Value,
result.UnhashedToken,
result.Token.Description,
result.Token.Role.Value,
result.Token.CreatedAt,
result.Token.ExpiresAt
);
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.Project.Contracts;
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebGetAllUsersResponse(IEnumerable<WebUserInfo> Users);
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.Project.Contracts;
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebGetAvailableRolesResponse(IEnumerable<WebRoleInfo> Roles);
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.Project.Contracts;
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebGetProjectMembersResponse(IEnumerable<WebProjectMember> Members);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebGetProjectTokensResponse(IEnumerable<WebProjectToken> Tokens);
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace ScriptBee.Web.EndpointDefinitions.Project.Contracts;
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebGetUserPermissionsForProjectResponse(
string? Role,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using ScriptBee.Domain.Model.User;

namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebProjectMember(string MemberId, string MemberType, string Role)
{
public static WebProjectMember Map(ProjectMember member)
{
return new WebProjectMember(member.MemberId, member.MemberType, member.Role.Value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using ScriptBee.Domain.Model.Project;

namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebProjectToken(
string Id,
string? Description,
string Role,
DateTimeOffset CreatedAt,
DateTimeOffset ExpiresAt
)
{
public static WebProjectToken Map(ProjectToken token)
{
return new WebProjectToken(
token.Id.Value,
token.Description,
token.Role.Value,
token.CreatedAt,
token.ExpiresAt
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebRoleInfo(string Id, string Description);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebUpdateProjectMemberCommand(string Role, string MemberType);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

public record WebUserInfo(string Id, string Name);
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
using ScriptBee.Domain.Model.Project;
using ScriptBee.Service.Gateway;
using ScriptBee.UseCases.Gateway;
using ScriptBee.Web.EndpointDefinitions.Project.Contracts;
using ScriptBee.Web.EndpointDefinitions.ProjectAccess.Contracts;

namespace ScriptBee.Web.EndpointDefinitions.Project;
namespace ScriptBee.Web.EndpointDefinitions.ProjectAccess;

public class GetProjectPermissionsEndpoint : IEndpointDefinition
{
Expand Down
Loading
Loading