90 lines
3.4 KiB
Protocol Buffer
90 lines
3.4 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package messages;
|
|
|
|
option go_package = ".;messages";
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Cart Actor gRPC API (Envelope Variant)
|
|
// -----------------------------------------------------------------------------
|
|
// This service replaces the legacy custom TCP frame protocol used on port 1337.
|
|
// It keeps the existing per-mutation proto messages (defined in messages.proto)
|
|
// serialized into an opaque `bytes payload` field for minimal refactor cost.
|
|
// The numeric values in MutationType MUST match the legacy message type
|
|
// constants (see message-types.go) so persisted event logs replay correctly.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// MutationType corresponds 1:1 with the legacy uint16 message type constants.
|
|
enum MutationType {
|
|
MUTATION_TYPE_UNSPECIFIED = 0;
|
|
MUTATION_ADD_REQUEST = 1;
|
|
MUTATION_ADD_ITEM = 2;
|
|
// (3 was unused / reserved in legacy framing)
|
|
MUTATION_REMOVE_ITEM = 4;
|
|
MUTATION_REMOVE_DELIVERY = 5;
|
|
MUTATION_CHANGE_QUANTITY = 6;
|
|
MUTATION_SET_DELIVERY = 7;
|
|
MUTATION_SET_PICKUP_POINT = 8;
|
|
MUTATION_CREATE_CHECKOUT_ORDER = 9;
|
|
MUTATION_SET_CART_ITEMS = 10;
|
|
MUTATION_ORDER_COMPLETED = 11;
|
|
}
|
|
|
|
// MutationRequest is an envelope:
|
|
// - cart_id: string form of CartId (legacy 16-byte array truncated/padded).
|
|
// - type: mutation kind (see enum).
|
|
// - payload: serialized underlying proto message (AddRequest, AddItem, etc.).
|
|
// - client_timestamp: optional unix timestamp; server sets if zero.
|
|
message MutationRequest {
|
|
string cart_id = 1;
|
|
MutationType type = 2;
|
|
bytes payload = 3;
|
|
int64 client_timestamp = 4;
|
|
}
|
|
|
|
// MutationReply returns a status code (legacy semantics) plus a JSON payload
|
|
// representing the full cart state (or an error message if non-200).
|
|
message MutationReply {
|
|
int32 status_code = 1;
|
|
bytes payload = 2; // JSON cart state or error string
|
|
}
|
|
|
|
// StateRequest fetches current cart state without mutation.
|
|
message StateRequest {
|
|
string cart_id = 1;
|
|
}
|
|
|
|
// StateReply mirrors MutationReply for consistency.
|
|
message StateReply {
|
|
int32 status_code = 1;
|
|
bytes payload = 2; // JSON cart state or error string
|
|
}
|
|
|
|
// CartActor exposes mutation and state retrieval for remote grains.
|
|
service CartActor {
|
|
// Mutate applies a single mutation to a cart, creating the cart lazily if needed.
|
|
rpc Mutate(MutationRequest) returns (MutationReply);
|
|
|
|
// GetState retrieves the cart's current state (JSON).
|
|
rpc GetState(StateRequest) returns (StateReply);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Notes:
|
|
//
|
|
// 1. Generation:
|
|
// protoc --go_out=. --go_opt=paths=source_relative \
|
|
// --go-grpc_out=. --go-grpc_opt=paths=source_relative \
|
|
// cart_actor.proto
|
|
//
|
|
// 2. Underlying mutation payloads originate from messages.proto definitions.
|
|
// The server side will route based on MutationType and decode payload bytes
|
|
// using existing handler registry logic.
|
|
//
|
|
// 3. Future Enhancements:
|
|
// - Replace JSON state payload with a strongly typed CartState proto.
|
|
// - Add streaming RPC (e.g. WatchState) for live updates.
|
|
// - Migrate control plane (negotiate/ownership) into a separate proto
|
|
// (control_plane.proto) as per the migration plan.
|
|
// -----------------------------------------------------------------------------
|