Files
CMS/src/CMSMicroservice.Protobuf/Protos/package.proto
T
masoodafar-web ccb938e9ba Phase 3: Package layer overhaul — fix critical bugs + proto enhancement
Proto (package.proto):
- Add 11 new Package fields to Create/Update/Get/GetAll messages
- Add 8 new fields to CustomerPackageModel for frontend

Critical Bug Fixes:
- VerifyGoldenPackagePurchase: Replace hardcoded ×2 with package.DiscountMultiplier from DB

Query Fixes:
- GetAllPackageByFilter: Add IsDeleted filter (was returning soft-deleted packages)
- GetCustomerPackages: Apply IsDeleted+IncludeInactive filters, sort by SortOrder, return new fields
- GetCustomerPackageDetails: Load PackageFeatures from DB (was hardcoded), add IsDeleted filter, return new fields
- GetCustomerPurchaseHistory: Include Transaction (was null → ReferenceCode always empty)

UpdatePackage: Add 12 new fields (SortOrder, IsActive, IsBasePackage, etc.)

Build: 0 errors
2026-02-25 23:50:09 +03:30

482 lines
12 KiB
Protocol Buffer

syntax = "proto3";
package package;
import "public_messages.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Package";
service PackageContract
{
rpc CreateNewPackage(CreateNewPackageRequest) returns (CreateNewPackageResponse){
option (google.api.http) = {
post: "/CreateNewPackage"
body: "*"
};
};
rpc UpdatePackage(UpdatePackageRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
put: "/UpdatePackage"
body: "*"
};
};
rpc DeletePackage(DeletePackageRequest) returns (google.protobuf.Empty){
option (google.api.http) = {
delete: "/DeletePackage"
body: "*"
};
};
rpc GetPackage(GetPackageRequest) returns (GetPackageResponse){
option (google.api.http) = {
get: "/GetPackage"
};
};
rpc GetAllPackageByFilter(GetAllPackageByFilterRequest) returns (GetAllPackageByFilterResponse){
option (google.api.http) = {
get: "/GetAllPackageByFilter"
};
};
// Package Purchase System
rpc PurchaseGoldenPackage(PurchaseGoldenPackageRequest) returns (PurchaseGoldenPackageResponse){
option (google.api.http) = {
post: "/PurchaseGoldenPackage"
body: "*"
};
};
rpc VerifyGoldenPackagePurchase(VerifyGoldenPackagePurchaseRequest) returns (VerifyGoldenPackagePurchaseResponse){
option (google.api.http) = {
post: "/VerifyGoldenPackagePurchase"
body: "*"
};
};
rpc GetUserPackageStatus(GetUserPackageStatusRequest) returns (GetUserPackageStatusResponse){
option (google.api.http) = {
get: "/GetUserPackageStatus"
};
};
// Base Package Payment (56M)
rpc InitiateBasePackagePayment(InitiateBasePackagePaymentRequest) returns (InitiateBasePackagePaymentResponse){
option (google.api.http) = {
post: "/InitiateBasePackagePayment"
body: "*"
};
};
rpc VerifyBasePackagePayment(VerifyBasePackagePaymentRequest) returns (VerifyBasePackagePaymentResponse){
option (google.api.http) = {
post: "/VerifyBasePackagePayment"
body: "*"
};
};
// ============= Customer-specific Methods =============
rpc GetCustomerPackages(GetCustomerPackagesRequest) returns (GetCustomerPackagesResponse){
option (google.api.http) = {
get: "/Customer/GetPackages"
};
};
rpc GetCustomerPackageDetails(GetCustomerPackageDetailsRequest) returns (GetCustomerPackageDetailsResponse){
option (google.api.http) = {
get: "/Customer/GetPackageDetails"
};
};
rpc CustomerPurchasePackage(CustomerPurchasePackageRequest) returns (CustomerPurchasePackageResponse){
option (google.api.http) = {
post: "/Customer/PurchasePackage"
body: "*"
};
};
rpc CustomerVerifyPackagePurchase(CustomerVerifyPackagePurchaseRequest) returns (CustomerVerifyPackagePurchaseResponse){
option (google.api.http) = {
post: "/Customer/VerifyPackagePurchase"
body: "*"
};
};
rpc GetCustomerPurchaseHistory(GetCustomerPurchaseHistoryRequest) returns (GetCustomerPurchaseHistoryResponse){
option (google.api.http) = {
get: "/Customer/GetPurchaseHistory"
};
};
}
message CreateNewPackageRequest
{
string title = 1;
string description = 2;
string image_path = 3;
int64 price = 4;
BoostCardFileModel image_file = 5;
int32 sort_order = 6;
bool is_active = 7;
bool is_base_package = 8;
bool supports_daya_purchase = 9;
bool supports_direct_purchase = 10;
int64 activation_fee = 11;
double discount_multiplier = 12;
double magic_wallet_multiplier = 13;
int32 max_balances_per_leg = 14;
int32 max_network_level = 15;
int64 magic_wallet_max_deposit = 16;
int64 magic_wallet_max_credit = 17;
}
message CreateNewPackageResponse
{
int64 id = 1;
}
message UpdatePackageRequest
{
int64 id = 1;
string title = 2;
string description = 3;
string image_path = 4;
int64 price = 5;
BoostCardFileModel image_file = 6;
int32 sort_order = 7;
bool is_active = 8;
bool is_base_package = 9;
bool supports_daya_purchase = 10;
bool supports_direct_purchase = 11;
int64 activation_fee = 12;
double discount_multiplier = 13;
double magic_wallet_multiplier = 14;
int32 max_balances_per_leg = 15;
int32 max_network_level = 16;
int64 magic_wallet_max_deposit = 17;
int64 magic_wallet_max_credit = 18;
}
message DeletePackageRequest
{
int64 id = 1;
}
message GetPackageRequest
{
int64 id = 1;
}
message GetPackageResponse
{
int64 id = 1;
string title = 2;
string description = 3;
string image_path = 4;
int64 price = 5;
int32 sort_order = 6;
bool is_active = 7;
bool is_base_package = 8;
bool supports_daya_purchase = 9;
bool supports_direct_purchase = 10;
int64 activation_fee = 11;
double discount_multiplier = 12;
double magic_wallet_multiplier = 13;
int32 max_balances_per_leg = 14;
int32 max_network_level = 15;
int64 magic_wallet_max_deposit = 16;
int64 magic_wallet_max_credit = 17;
}
message GetAllPackageByFilterRequest
{
messages.PaginationState pagination_state = 1;
google.protobuf.StringValue sort_by = 2;
GetAllPackageByFilterFilter filter = 3;
}
message GetAllPackageByFilterFilter
{
google.protobuf.Int64Value id = 1;
google.protobuf.StringValue title = 2;
google.protobuf.StringValue description = 3;
google.protobuf.StringValue image_path = 4;
google.protobuf.Int64Value price = 5;
}
message GetAllPackageByFilterResponse
{
messages.MetaData meta_data = 1;
repeated GetAllPackageByFilterResponseModel models = 2;
}
message GetAllPackageByFilterResponseModel
{
int64 id = 1;
string title = 2;
string description = 3;
string image_path = 4;
int64 price = 5;
int32 sort_order = 6;
bool is_active = 7;
bool is_base_package = 8;
bool supports_daya_purchase = 9;
bool supports_direct_purchase = 10;
int64 activation_fee = 11;
double discount_multiplier = 12;
double magic_wallet_multiplier = 13;
int32 max_balances_per_leg = 14;
int32 max_network_level = 15;
int64 magic_wallet_max_deposit = 16;
int64 magic_wallet_max_credit = 17;
}
// Package Purchase Messages
message PurchaseGoldenPackageRequest
{
int64 user_id = 1;
int64 package_id = 2;
string return_url = 3;
}
message PurchaseGoldenPackageResponse
{
bool success = 1;
string message = 2;
int64 order_id = 3;
string payment_gateway_url = 4;
string tracking_code = 5;
}
message VerifyGoldenPackagePurchaseRequest
{
int64 order_id = 1;
string authority = 2;
string status = 3;
}
message VerifyGoldenPackagePurchaseResponse
{
bool success = 1;
string message = 2;
int64 order_id = 3;
int64 transaction_id = 4;
string reference_code = 5;
int64 wallet_balance = 6;
}
message GetUserPackageStatusRequest
{
int64 user_id = 1;
}
message GetUserPackageStatusResponse
{
int64 user_id = 1;
string package_purchase_method = 2;
bool has_purchased_package = 3;
bool is_club_member_active = 4;
int64 wallet_balance = 5;
int64 discount_balance = 6;
bool can_activate_club_membership = 7;
google.protobuf.StringValue last_order_number = 8;
google.protobuf.Timestamp last_purchase_date = 9;
}
// Base Package Payment Messages
message InitiateBasePackagePaymentRequest
{
int64 user_id = 1;
string callback_url = 2; // Payment gateway callback URL
}
message InitiateBasePackagePaymentResponse
{
bool success = 1;
string message = 2;
int64 order_id = 3;
int64 transaction_id = 4;
int64 amount = 5;
string payment_gateway_url = 6;
}
message VerifyBasePackagePaymentRequest
{
int64 order_id = 1;
int64 transaction_id = 2;
bool payment_success = 3;
google.protobuf.StringValue ref_id = 4;
google.protobuf.StringValue message = 5;
}
message VerifyBasePackagePaymentResponse
{
bool success = 1;
string message = 2;
int64 order_id = 3;
int64 transaction_id = 4;
google.protobuf.StringValue reference_code = 5;
int64 wallet_balance = 6;
int64 discount_balance = 7;
}
// ============= Customer Message Types =============
message GetCustomerPackagesRequest
{
bool include_inactive = 1;
PackageTypeEnum package_type_filter = 2;
}
message GetCustomerPackagesResponse
{
repeated CustomerPackageModel models = 1;
}
message GetCustomerPackageDetailsRequest
{
int64 package_id = 1;
}
message GetCustomerPackageDetailsResponse
{
int64 id = 1;
string title = 2;
string description = 3;
int64 price = 4;
google.protobuf.StringValue image_path = 5;
repeated PackageFeature features = 6;
PurchaseRequirements requirements = 7;
}
message CustomerPurchasePackageRequest
{
int64 package_id = 1;
PurchaseMethodEnum purchase_method = 2;
string callback_url = 3;
}
message CustomerPurchasePackageResponse
{
bool success = 1;
string message = 2;
int64 order_id = 3;
string payment_gateway_url = 4;
string authority = 5;
}
message CustomerVerifyPackagePurchaseRequest
{
int64 order_id = 1;
string authority = 2;
string status = 3;
}
message CustomerVerifyPackagePurchaseResponse
{
bool success = 1;
string message = 2;
int64 transaction_id = 3;
string reference_code = 4;
PackagePurchaseInfo purchase_info = 5;
}
message GetCustomerPurchaseHistoryRequest
{
int64 user_id = 1;
messages.PaginationState pagination_state = 2;
PackageTypeEnum package_type_filter = 3;
google.protobuf.Timestamp from_date = 4;
google.protobuf.Timestamp to_date = 5;
}
message GetCustomerPurchaseHistoryResponse
{
messages.MetaData meta_data = 1;
repeated PackagePurchaseHistory purchases = 2;
}
message CustomerPackageModel
{
int64 id = 1;
string name = 2;
string description = 3;
int64 price = 4;
string currency = 5;
PackageTypeEnum package_type = 6;
bool is_available = 7;
string image_url = 8;
int32 validity_days = 9;
bool is_popular = 10;
string short_description = 11;
string title = 12;
string image_path = 13;
// New package-based fields
int64 activation_fee = 14;
double discount_multiplier = 15;
double magic_wallet_multiplier = 16;
int64 magic_wallet_max_deposit = 17;
int64 magic_wallet_max_credit = 18;
bool is_base_package = 19;
bool supports_daya_purchase = 20;
bool supports_direct_purchase = 21;
}
message PackageFeature
{
string title = 1;
string description = 2;
string icon = 3;
bool is_highlighted = 4;
}
message PurchaseRequirements
{
bool requires_membership = 1;
int64 minimum_wallet_balance = 2;
repeated string restrictions = 3;
}
message PackagePurchaseInfo
{
int64 package_id = 1;
string package_name = 2;
int64 amount_paid = 3;
google.protobuf.Timestamp purchase_date = 4;
google.protobuf.Timestamp expiry_date = 5;
}
message PackagePurchaseHistory
{
int64 id = 1;
int64 package_id = 2;
string package_name = 3;
int64 amount = 4;
PackageTypeEnum package_type = 5;
google.protobuf.Timestamp purchase_date = 6;
google.protobuf.Timestamp expiry_date = 7;
PaymentStatusEnum status = 8;
string status_message = 9;
string reference_code = 10;
}
enum PackageTypeEnum
{
PACKAGE_TYPE_BASIC = 0;
PACKAGE_TYPE_GOLDEN = 1;
PACKAGE_TYPE_PREMIUM = 2;
PACKAGE_TYPE_SPECIAL = 3;
}
enum PurchaseMethodEnum
{
PURCHASE_METHOD_WALLET = 0;
PURCHASE_METHOD_GATEWAY = 1;
PURCHASE_METHOD_MIXED = 2;
}
enum PaymentStatusEnum
{
PAYMENT_STATUS_PENDING = 0;
PAYMENT_STATUS_SUCCESS = 1;
PAYMENT_STATUS_FAILED = 2;
PAYMENT_STATUS_REFUNDED = 3;
}
// File upload model for binary image uploads from BackOffice
message BoostCardFileModel
{
bytes file = 1;
string file_name = 2;
string mime = 3;
}