Workspace project added #4

Merged
koma merged 1 commits from features/workspaceProject into develop 2 years ago

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Folder Include="Events\" />
<Folder Include="Documents\" />
<Folder Include="Notifications\" />
<Folder Include="Tasks\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\connected.framework\src\Connected.Entities\Connected.Entities.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,114 @@
using Connected.Common.Workspace.Messaging;
using Connected.Entities.Consistency;
using Connected.Security.Identity;
namespace Connected.Common.Workspace;
/// <summary>
/// Specifies the read state of the <see cref="IWorkspaceEntity"/> entity.
/// </summary>
public enum ReadStatus
{
/// <summary>
/// The entity has not been read by the <see cref="IWorkspaceEntity.IdentityId"/>.
/// </summary>
New = 0,
/// <summary>
/// The entity has been read by the <see cref="IWorkspaceEntity.IdentityId"/>.
/// </summary>
Read = 1
}
/// <summary>
/// Specifies what kind of actions can be performed by the identity on each <see cref="IWorkspaceEntity"/> entity.
/// </summary>
[Flags]
public enum IdentityVerbs
{
/// <summary>
/// The entity is read only. Identity cannot perform any actions on it
/// except reading.
/// </summary>
ReadOnly = 0,
/// <summary>
/// The entity can be deleted from the workspace by the identity.
/// </summary>
AllowDelete = 1
}
/// <summary>
/// Represents a base entity for all workspace related entities.
/// </summary>
/// <remarks>
/// Digital Workspace offers many different services serving different purposes. Each service introduces
/// its own set of entities. All top level entities inherits from this entity, for example <see cref="IMessage"/>.
/// </remarks>
public interface IWorkspaceEntity : IConsistentEntity<long>
{
/// <summary>
/// The type of identity to which workspace entity belongs to (like Recipient).
/// </summary>
/// <remarks>
/// The most common type of the identity entity is <see cref="IUser"/>.
/// </remarks>
string IdentityEntity { get; init; }
/// <summary>
/// The id of the identity to which workspace entity belongs. This could be the id of the user,
/// device, organization unit or any other entity id.
/// </summary>
string IdentityId { get; init; }
/// <summary>
/// The date and time the workspace entity has been created.
/// </summary>
/// <remarks>
/// This value can represent the value when the origin entity has been created or when
/// the workspace entity has been created. This value is specific to the service implementation.
/// </remarks>
DateTimeOffset Created { get; init; }
/// <summary>
/// The date and time the workspace entity expires.
/// </summary>
/// <remarks>
/// Expired workspace entities are automatically deleted from the system. If this value is <c>null</c>,
/// workspace entity never expires.
/// </remarks>
DateTimeOffset? Expires { get; init; }
/// <summary>
/// The title of the entity.
/// </summary>
/// <remarks>
/// This should be as short as possible so user can quickly recognize the nature of the entity.
/// </remarks>
string Title { get; init; }
/// <summary>
/// The short description of the entity. Can be <c>null</c>.
/// </summary>
string? Description { get; init; }
/// <summary>
/// The read status of the entity. This serves primary for a UI purpose to enable visual feedback
/// to the user.
/// </summary>
ReadStatus Status { get; init; }
/// <summary>
/// The domain to which this entity belongs.
/// </summary>
/// <remarks>
/// Each workspace entity should have one and only one domain to which it originates.
/// </remarks>
string Domain { get; init; }
/// <summary>
/// Zero or more tags that represents additional meta data of the workspace entity.
/// </summary>
string? Tags { get; init; }
/// <summary>
/// The entity which triggered this workspace entity to be created. Can be <c>null</c> if it was
/// automatically generated by the underlying system.
/// </summary>
string? AuthorEntity { get; init; }
/// <summary>
/// The id of the entity which created this workspace entity. Can be <c>null</c> if it was
/// automatically generated by the underlying system.
/// </summary>
string? AuthorId { get; init; }
/// <summary>
/// Actions that can be performed by the identity on the workspace entity.
/// </summary>
IdentityVerbs Verbs { get; init; }
}

@ -0,0 +1,22 @@
using Connected.Data;
namespace Connected.Common.Workspace.Identities;
/// <summary>
/// Represents the workspace identity.
/// </summary>
/// <remarks>
/// Workspace supports identities through the <see cref="IIdentityService"/>. There could
/// be any number of different identities, such as users or devices which are provided via
/// different identity providers.
/// </remarks>
public interface IIdentity : IPrimaryKey<string>
{
/// <summary>
/// The display name of the identity. This should be short and descriptive.
/// </summary>
string DisplayName { get; init; }
/// <summary>
/// The Url of the identity's avatar if it is supported.
/// </summary>
string Avatar { get; init; }
}

@ -0,0 +1,15 @@
using System.Collections.Immutable;
namespace Connected.Common.Workspace.Identities;
/// <summary>
/// The provider service used for providing identity descriptors.
/// </summary>
public interface IIdentityService
{
/// <summary>
/// Queries identities for the specified set of entity types and their ids.
/// </summary>
/// <param name="args">The arguments containing entity types and their ids.</param>
/// <returns>The list of identities that matches the specified criteria.</returns>
Task<ImmutableList<IIdentity>> Query(QueryIdentitiesArgs args);
}

@ -0,0 +1,9 @@
using Connected.Annotations;
using Connected.ServiceModel;
namespace Connected.Common.Workspace.Identities;
public sealed class QueryIdentitiesArgs : QueryArgs
{
[NonDefault]
public Dictionary<string, string> Items { get; set; } = default!;
}

@ -0,0 +1,5 @@
namespace Connected.Common.Workspace.Messaging;
public interface IMessage : IWorkspaceEntity
{
}

@ -0,0 +1,15 @@
using System.Collections.Immutable;
using Connected.Notifications;
using Connected.ServiceModel;
namespace Connected.Common.Workspace.Messaging;
public interface IMessagesService : IServiceNotifications<long>
{
Task<ImmutableList<IMessage>> Query(QueryMessageArgs args);
Task<IMessage?> Select(PrimaryKeyArgs<long> args);
Task<long> Insert(InsertMessageArgs args);
Task Update(UpdateMessageArgs args);
Task Patch(PatchArgs<long> args);
Task Delete(PrimaryKeyArgs<long> args);
}

@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
using Connected.ServiceModel;
namespace Connected.Common.Workspace.Messaging;
public sealed class QueryMessageArgs : QueryArgs
{
[Required, MaxLength(128)]
public string IdentityEntity { get; set; } = default!;
[Required, MaxLength(128)]
public string IdentityId { get; set; } = default!;
}
public sealed class InsertMessageArgs : InsertWorkspaceArgs
{
}
public sealed class UpdateMessageArgs : UpdateWorkspaceArgs
{
}

@ -0,0 +1,67 @@
using System.ComponentModel.DataAnnotations;
using Connected.ServiceModel;
namespace Connected.Common.Workspace;
/// <summary>
/// The base class for the arguments used when inserting one of the
/// implementations of the <see cref="IWorkspaceEntity"/> entity.
/// </summary>
public abstract class InsertWorkspaceArgs : Dto
{
/// <inheritdoc cref="IWorkspaceEntity.IdentityEntity"/>
[Required, MaxLength(128)]
public string IdentityEntity { get; set; } = default!;
/// <inheritdoc cref="IWorkspaceEntity.IdentityId"/>
[Required, MaxLength(128)]
public string IdentityId { get; set; } = default!;
/// <inheritdoc cref="IWorkspaceEntity.Created"/>
public DateTimeOffset? Created { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Expires"/>
public DateTimeOffset? Expires { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Title"/>
[Required, MaxLength(128)]
public string Title { get; set; } = default!;
/// <inheritdoc cref="IWorkspaceEntity.Description"/>
[MaxLength(256)]
public string? Description { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Status"/>
public ReadStatus? Status { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Domain"/>
[Required, MaxLength(128)]
public string Domain { get; init; } = default!;
/// <inheritdoc cref="IWorkspaceEntity.Tags"/>
[MaxLength(256)]
public string? Tags { get; init; }
/// <inheritdoc cref="IWorkspaceEntity.AuthorEntity"/>
[MaxLength(128)]
public string? AuthorEntity { get; init; }
/// <inheritdoc cref="IWorkspaceEntity.AuthorId"/>
[MaxLength(128)]
public string? AuthorId { get; init; }
/// <inheritdoc cref="IWorkspaceEntity.Verbs"/>
public IdentityVerbs? Verbs { get; init; }
}
/// <summary>
/// The base class used when updating one of the
/// implementations of the <see cref="IWorkspaceEntity"/> entity.
/// </summary>
public abstract class UpdateWorkspaceArgs : PrimaryKeyArgs<long>
{
/// <inheritdoc cref="IWorkspaceEntity.Created"/>
public DateTimeOffset? Created { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Expires"/>
public DateTimeOffset? Expires { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Title"/>
[Required, MaxLength(128)]
public string Title { get; set; } = default!;
/// <inheritdoc cref="IWorkspaceEntity.Description"/>
[MaxLength(256)]
public string? Description { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Status"/>
public ReadStatus? Status { get; set; }
/// <inheritdoc cref="IWorkspaceEntity.Tags"/>
[MaxLength(256)]
public string? Tags { get; init; }
/// <inheritdoc cref="IWorkspaceEntity.Verbs"/>
public IdentityVerbs? Verbs { get; init; }
}
Loading…
Cancel
Save