feat: Add gRPC API Layer - Phase 6 Integration

Added Protobuf definitions and gRPC services for all CQ layers:

Protobuf Files (4):
- configuration.proto: 2 Commands + 3 Queries (5 RPCs)
- clubmembership.proto: 3 Commands + 3 Queries (6 RPCs)
- networkmembership.proto: 3 Commands + 3 Queries (6 RPCs)
- commission.proto: 5 Commands + 4 Queries (9 RPCs)

gRPC Services (4):
- ConfigurationService: SetConfigurationValue, Deactivate, GetByKey, GetAll, GetHistory
- ClubMembershipService: Activate, Deactivate, AssignFeature, Get, GetAll, GetHistory
- NetworkMembershipService: Join, Move, Remove, GetPosition, GetTree, GetHistory
- CommissionService: Calculate+Process+Withdraw (5 commands), Get queries (4)

Features:
- HTTP transcoding enabled via google.api.http annotations
- Auto-registration via ConfigureGrpcEndpoints
- MetaData pagination support
- Request/Response DTOs for all endpoints
- Integration with MediatR CQRS handlers

Total: 4 proto files, 4 service classes, 26 RPC endpoints
Build:  Successful (0 errors)
This commit is contained in:
masoodafar-web
2025-11-29 04:45:27 +03:30
parent 3010881b4e
commit 2bb8c2a13c
9 changed files with 890 additions and 0 deletions

View File

@@ -0,0 +1,220 @@
syntax = "proto3";
package commission;
import "public_messages.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Commission";
service CommissionContract
{
// Commands
rpc CalculateWeeklyBalances(CalculateWeeklyBalancesRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
post: "/Commission/CalculateWeeklyBalances"
body: "*"
};
};
rpc CalculateWeeklyCommissionPool(CalculateWeeklyCommissionPoolRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
post: "/Commission/CalculateWeeklyPool"
body: "*"
};
};
rpc ProcessUserPayouts(ProcessUserPayoutsRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
post: "/Commission/ProcessPayouts"
body: "*"
};
};
rpc RequestWithdrawal(RequestWithdrawalRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
post: "/Commission/RequestWithdrawal"
body: "*"
};
};
rpc ProcessWithdrawal(ProcessWithdrawalRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
post: "/Commission/ProcessWithdrawal"
body: "*"
};
};
// Queries
rpc GetWeeklyCommissionPool(GetWeeklyCommissionPoolRequest) returns (GetWeeklyCommissionPoolResponse){
option (google.api.http) = {
get: "/Commission/GetWeeklyPool"
};
};
rpc GetUserCommissionPayouts(GetUserCommissionPayoutsRequest) returns (GetUserCommissionPayoutsResponse){
option (google.api.http) = {
get: "/Commission/GetUserPayouts"
};
};
rpc GetCommissionPayoutHistory(GetCommissionPayoutHistoryRequest) returns (GetCommissionPayoutHistoryResponse){
option (google.api.http) = {
get: "/Commission/GetPayoutHistory"
};
};
rpc GetUserWeeklyBalances(GetUserWeeklyBalancesRequest) returns (GetUserWeeklyBalancesResponse){
option (google.api.http) = {
get: "/Commission/GetUserWeeklyBalances"
};
};
}
// ============ Commands ============
// CalculateWeeklyBalances Command
message CalculateWeeklyBalancesRequest
{
string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W01")
bool force_recalculate = 2;
}
// CalculateWeeklyCommissionPool Command
message CalculateWeeklyCommissionPoolRequest
{
string week_number = 1;
}
// ProcessUserPayouts Command
message ProcessUserPayoutsRequest
{
string week_number = 1;
bool force_reprocess = 2;
}
// RequestWithdrawal Command
message RequestWithdrawalRequest
{
int64 payout_id = 1;
int32 withdrawal_method = 2; // WithdrawalMethod enum: Cash=0, Diamond=1
google.protobuf.StringValue iban_number = 3; // Required for Cash method
}
// ProcessWithdrawal Command
message ProcessWithdrawalRequest
{
int64 payout_id = 1;
bool is_approved = 2;
google.protobuf.StringValue reason = 3; // Required for rejection
}
// ============ Queries ============
// GetWeeklyCommissionPool Query
message GetWeeklyCommissionPoolRequest
{
string week_number = 1;
}
message GetWeeklyCommissionPoolResponse
{
int64 id = 1;
string week_number = 2;
int64 total_pool_amount = 3; // Rials
int32 total_balances = 4;
int64 value_per_balance = 5; // Rials per balance
bool is_calculated = 6;
google.protobuf.Timestamp calculated_at = 7;
google.protobuf.Timestamp created = 8;
}
// GetUserCommissionPayouts Query
message GetUserCommissionPayoutsRequest
{
google.protobuf.Int64Value user_id = 1;
google.protobuf.Int32Value status = 2; // CommissionPayoutStatus enum
google.protobuf.StringValue week_number = 3;
int32 page_index = 4;
int32 page_size = 5;
}
message GetUserCommissionPayoutsResponse
{
messages.MetaData meta_data = 1;
repeated UserCommissionPayoutModel models = 2;
}
message UserCommissionPayoutModel
{
int64 id = 1;
int64 user_id = 2;
string user_name = 3;
string week_number = 4;
int32 balances_earned = 5;
int64 value_per_balance = 6;
int64 total_amount = 7;
int32 status = 8; // CommissionPayoutStatus enum
google.protobuf.Int32Value withdrawal_method = 9;
string iban_number = 10;
google.protobuf.Timestamp created = 11;
google.protobuf.Timestamp last_modified = 12;
}
// GetCommissionPayoutHistory Query
message GetCommissionPayoutHistoryRequest
{
google.protobuf.Int64Value payout_id = 1;
google.protobuf.Int64Value user_id = 2;
google.protobuf.StringValue week_number = 3;
int32 page_index = 4;
int32 page_size = 5;
}
message GetCommissionPayoutHistoryResponse
{
messages.MetaData meta_data = 1;
repeated CommissionPayoutHistoryModel models = 2;
}
message CommissionPayoutHistoryModel
{
int64 id = 1;
int64 payout_id = 2;
int64 user_id = 3;
string week_number = 4;
int64 amount_before = 5;
int64 amount_after = 6;
int32 old_status = 7; // CommissionPayoutStatus enum
int32 new_status = 8;
int32 action = 9; // CommissionPayoutAction enum
string performed_by = 10;
string reason = 11;
google.protobuf.Timestamp created = 12;
}
// GetUserWeeklyBalances Query
message GetUserWeeklyBalancesRequest
{
google.protobuf.Int64Value user_id = 1;
google.protobuf.StringValue week_number = 2;
bool only_active = 3; // Only non-expired balances
int32 page_index = 4;
int32 page_size = 5;
}
message GetUserWeeklyBalancesResponse
{
messages.MetaData meta_data = 1;
repeated UserWeeklyBalanceModel models = 2;
}
message UserWeeklyBalanceModel
{
int64 id = 1;
int64 user_id = 2;
string week_number = 3;
int32 left_leg_balances = 4;
int32 right_leg_balances = 5;
int32 total_balances = 6;
int64 weekly_pool_contribution = 7;
google.protobuf.Timestamp calculated_at = 8;
bool is_expired = 9;
google.protobuf.Timestamp created = 10;
}