syntax = "proto3"; package clubmembership; 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.ClubMembership"; service ClubMembershipContract { rpc ActivateClubMembership(ActivateClubMembershipRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/ClubMembership/Activate" body: "*" }; }; rpc DeactivateClubMembership(DeactivateClubMembershipRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/ClubMembership/Deactivate" body: "*" }; }; rpc AssignFeatureToMembership(AssignFeatureToMembershipRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/ClubMembership/AssignFeature" body: "*" }; }; rpc GetClubMembership(GetClubMembershipRequest) returns (GetClubMembershipResponse){ option (google.api.http) = { get: "/ClubMembership/Get" }; }; rpc GetAllClubMemberships(GetAllClubMembershipsRequest) returns (GetAllClubMembershipsResponse){ option (google.api.http) = { get: "/ClubMembership/GetAll" }; }; rpc GetClubMembershipHistory(GetClubMembershipHistoryRequest) returns (GetClubMembershipHistoryResponse){ option (google.api.http) = { get: "/ClubMembership/GetHistory" }; }; rpc GetClubStatistics(GetClubStatisticsRequest) returns (GetClubStatisticsResponse){ option (google.api.http) = { get: "/ClubMembership/GetStatistics" }; }; // New: Admin Club Feature Management rpc GetUserClubFeatures(GetUserClubFeaturesRequest) returns (GetUserClubFeaturesResponse){ option (google.api.http) = { get: "/ClubFeature/GetUserFeatures" }; }; rpc ToggleUserClubFeature(ToggleUserClubFeatureRequest) returns (ToggleUserClubFeatureResponse){ option (google.api.http) = { post: "/ClubFeature/ToggleFeature" body: "*" }; }; } // Activate Command message ActivateClubMembershipRequest { int64 user_id = 1; int64 package_id = 2; google.protobuf.StringValue activation_code = 3; int32 duration_months = 4; } // Deactivate Command message DeactivateClubMembershipRequest { int64 user_id = 1; string reason = 2; } // AssignFeature Command message AssignFeatureToMembershipRequest { int64 user_id = 1; int64 product_id = 2; google.protobuf.Int32Value quantity = 3; google.protobuf.Int32Value duration_days = 4; } // Get Query message GetClubMembershipRequest { int64 user_id = 1; } message GetClubMembershipResponse { int64 id = 1; int64 user_id = 2; int64 package_id = 3; string package_name = 4; string activation_code = 5; google.protobuf.Timestamp activated_at = 6; google.protobuf.Timestamp expires_at = 7; bool is_active = 8; google.protobuf.Timestamp created = 9; repeated MembershipFeatureModel features = 10; } message MembershipFeatureModel { int64 product_id = 1; string product_name = 2; int32 quantity = 3; google.protobuf.Timestamp expires_at = 4; bool is_active = 5; } // GetAll Query message GetAllClubMembershipsRequest { google.protobuf.Int64Value user_id = 1; google.protobuf.Int64Value package_id = 2; google.protobuf.BoolValue is_active = 3; google.protobuf.BoolValue is_expired = 4; int32 page_index = 5; int32 page_size = 6; } message GetAllClubMembershipsResponse { messages.MetaData meta_data = 1; repeated ClubMembershipModel models = 2; } message ClubMembershipModel { int64 id = 1; int64 user_id = 2; string user_name = 3; int64 package_id = 4; string package_name = 5; string activation_code = 6; google.protobuf.Timestamp activated_at = 7; google.protobuf.Timestamp expires_at = 8; bool is_active = 9; bool is_expired = 10; google.protobuf.Timestamp created = 11; } // GetHistory Query message GetClubMembershipHistoryRequest { google.protobuf.Int64Value user_id = 1; google.protobuf.Int64Value package_id = 2; int32 page_index = 3; int32 page_size = 4; } message GetClubMembershipHistoryResponse { messages.MetaData meta_data = 1; repeated ClubMembershipHistoryModel models = 2; } message ClubMembershipHistoryModel { int64 id = 1; int64 club_membership_id = 2; int64 user_id = 3; google.protobuf.Int64Value old_package_id = 4; google.protobuf.Int64Value new_package_id = 5; google.protobuf.Timestamp old_activated_at = 6; google.protobuf.Timestamp new_activated_at = 7; google.protobuf.Timestamp old_expires_at = 8; google.protobuf.Timestamp new_expires_at = 9; int32 action = 10; // ClubMembershipAction enum string performed_by = 11; string reason = 12; google.protobuf.Timestamp created = 13; } // GetClubStatistics Query message GetClubStatisticsRequest { // Empty - returns overall club statistics } message GetClubStatisticsResponse { int32 total_members = 1; int32 active_members = 2; int32 inactive_members = 3; int32 expired_members = 4; double active_percentage = 5; repeated PackageLevelDistribution package_distribution = 6; repeated MonthlyMembershipTrend monthly_trend = 7; int64 total_revenue = 8; double average_membership_duration_days = 9; int32 expiring_soon_count = 10; // Expiring in next 30 days } message PackageLevelDistribution { int64 package_id = 1; string package_name = 2; int32 member_count = 3; double percentage = 4; } message MonthlyMembershipTrend { string month = 1; // Format: "2025-11" int32 activations = 2; int32 expirations = 3; int32 net_change = 4; } // GetUserClubFeatures Query message GetUserClubFeaturesRequest { int64 user_id = 1; } message GetUserClubFeaturesResponse { repeated UserClubFeatureModel features = 1; } message UserClubFeatureModel { int64 id = 1; int64 user_id = 2; int64 club_membership_id = 3; int64 club_feature_id = 4; string feature_title = 5; string feature_description = 6; bool is_active = 7; google.protobuf.Timestamp granted_at = 8; string notes = 9; } // ToggleUserClubFeature Command message ToggleUserClubFeatureRequest { int64 user_id = 1; int64 club_feature_id = 2; bool is_active = 3; } message ToggleUserClubFeatureResponse { bool success = 1; string message = 2; google.protobuf.Int64Value user_club_feature_id = 3; google.protobuf.BoolValue is_active = 4; }