Table of Contents

Class ProjectInvitationService

Namespace
Builvero.Application.Services
Assembly
Builvero.Application.dll

Provides business logic for project invitation operations including sending, accepting, declining, and managing invitations.

public class ProjectInvitationService : IProjectInvitationService
Inheritance
ProjectInvitationService
Implements
Inherited Members

Remarks

This service handles all project invitation-related operations:

  • Inviting users to join projects (with access control)
  • Accepting invitations (creates active membership)
  • Declining invitations
  • Retrieving invitations for users and projects
  • Sending email notifications for invitation events
Access control: Only project owners and active members can invite users. Invitations expire after 30 days.

Constructors

ProjectInvitationService(IProjectInvitationRepository, IProjectRepository, IUserRepository, IProjectMembershipRepository, IUserNotificationRepository, ITokenGenerator, IProjectNotificationEmailSender, ILogger<ProjectInvitationService>)

Initializes a new instance of the ProjectInvitationService class.

public ProjectInvitationService(IProjectInvitationRepository invitationRepository, IProjectRepository projectRepository, IUserRepository userRepository, IProjectMembershipRepository membershipRepository, IUserNotificationRepository notificationRepository, ITokenGenerator tokenGenerator, IProjectNotificationEmailSender emailSender, ILogger<ProjectInvitationService> logger)

Parameters

invitationRepository IProjectInvitationRepository

Repository for project invitation data access operations.

projectRepository IProjectRepository

Repository for project data access operations.

userRepository IUserRepository

Repository for user data access operations.

membershipRepository IProjectMembershipRepository

Repository for project membership data access operations.

notificationRepository IUserNotificationRepository

Repository for user notification data access operations.

tokenGenerator ITokenGenerator

Service for generating secure tokens for invitation links.

emailSender IProjectNotificationEmailSender

Service for sending project invitation emails.

logger ILogger<ProjectInvitationService>

Logger for recording service operations and errors.

Methods

CancelInvitationAsync(Guid, Guid, CancellationToken)

Cancels a pending invitation (inviter only).

public Task<ProjectInvitationDto> CancelInvitationAsync(Guid invitationId, Guid cancellerUserId, CancellationToken cancellationToken = default)

Parameters

invitationId Guid

The unique identifier of the invitation to cancel.

cancellerUserId Guid

The unique identifier of the user canceling the invitation (must be the inviter).

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<ProjectInvitationDto>

The canceled invitation DTO.

GetIncomingInvitationsAsync(Guid, CancellationToken)

Retrieves all incoming invitations for the specified user (invitations sent to them).

public Task<List<ProjectInvitationDto>> GetIncomingInvitationsAsync(Guid userId, CancellationToken cancellationToken = default)

Parameters

userId Guid

The unique identifier of the user (invitee).

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<List<ProjectInvitationDto>>

A list of incoming invitation DTOs.

GetOutgoingInvitationsAsync(Guid, CancellationToken)

Retrieves all outgoing invitations created by the specified user (invitations they sent).

public Task<List<ProjectInvitationDto>> GetOutgoingInvitationsAsync(Guid userId, CancellationToken cancellationToken = default)

Parameters

userId Guid

The unique identifier of the user (inviter).

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<List<ProjectInvitationDto>>

A list of outgoing invitation DTOs.

InviteUserAsync(Guid, Guid, Guid, string?, CancellationToken)

Sends a project invitation to a user.

public Task<ProjectInvitationDto> InviteUserAsync(Guid projectId, Guid fromUserId, Guid toUserId, string? message, CancellationToken cancellationToken = default)

Parameters

projectId Guid

The unique identifier of the project to invite the user to.

fromUserId Guid

The unique identifier of the user sending the invitation (must be project owner or active member).

toUserId Guid

The unique identifier of the user being invited.

message string

Optional message to include with the invitation.

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<ProjectInvitationDto>

A ProjectInvitationDto representing the created invitation.

Remarks

This method performs the following operations:

  1. Validates project existence and inviter permissions
  2. Checks if user is already a member or has a pending invitation
  3. Creates the invitation with a secure token and 30-day expiration
  4. Sends email notification to the invitee
  5. Creates in-app notification for the invitee

The invitation includes a secure token that allows acceptance/decline via email links without requiring login.

Exceptions

Exception

Thrown when the project is not found, user is not found, user is already a member, or a pending invitation already exists.

UnauthorizedAccessException

Thrown when the inviter is not a project owner or active member.

RespondToInvitationAsync(Guid, Guid, bool, string?, CancellationToken)

Responds to an invitation (accept or decline) by the invitee.

public Task<ProjectInvitationDto> RespondToInvitationAsync(Guid invitationId, Guid responderUserId, bool accept, string? reason, CancellationToken cancellationToken = default)

Parameters

invitationId Guid

The unique identifier of the invitation to respond to.

responderUserId Guid

The unique identifier of the user responding (must be the invitee).

accept bool

True to accept the invitation; false to decline.

reason string

Optional reason for accepting or declining.

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<ProjectInvitationDto>

The updated invitation DTO.

RespondToInvitationByTokenAsync(string, bool, string?, CancellationToken)

Responds to an invitation via secure token (public endpoint, no authentication required).

public Task<ProjectInvitationDto> RespondToInvitationByTokenAsync(string token, bool accept, string? reason, CancellationToken cancellationToken = default)

Parameters

token string

The secure token from the invitation email.

accept bool

True to accept the invitation; false to decline.

reason string

Optional reason for accepting or declining.

cancellationToken CancellationToken

Cancellation token to cancel the operation.

Returns

Task<ProjectInvitationDto>

The updated invitation DTO.