Implement Phase 4: gRPC sync service
- Proto definitions (engpad.v1.EngPadSync) with 6 RPCs - Generated Go gRPC code - Auth interceptor: username/password from metadata - SyncNotebook: upsert with full page/stroke replacement in a tx - DeleteNotebook, ListNotebooks handlers - Share link RPCs: CreateShareLink, RevokeShareLink, ListShareLinks - Share link token management (32-byte random, optional expiry) - gRPC server with TLS 1.3 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
94
proto/engpad/v1/sync.proto
Normal file
94
proto/engpad/v1/sync.proto
Normal file
@@ -0,0 +1,94 @@
|
||||
syntax = "proto3";
|
||||
package engpad.v1;
|
||||
|
||||
option go_package = "git.wntrmute.dev/kyle/eng-pad-server/gen/engpad/v1;engpadv1";
|
||||
|
||||
import "google/protobuf/timestamp.proto";
|
||||
|
||||
service EngPadSync {
|
||||
rpc SyncNotebook(SyncNotebookRequest) returns (SyncNotebookResponse);
|
||||
rpc DeleteNotebook(DeleteNotebookRequest) returns (DeleteNotebookResponse);
|
||||
rpc ListNotebooks(ListNotebooksRequest) returns (ListNotebooksResponse);
|
||||
rpc CreateShareLink(CreateShareLinkRequest) returns (CreateShareLinkResponse);
|
||||
rpc RevokeShareLink(RevokeShareLinkRequest) returns (RevokeShareLinkResponse);
|
||||
rpc ListShareLinks(ListShareLinksRequest) returns (ListShareLinksResponse);
|
||||
}
|
||||
|
||||
message SyncNotebookRequest {
|
||||
int64 notebook_id = 1;
|
||||
string title = 2;
|
||||
string page_size = 3;
|
||||
repeated PageData pages = 4;
|
||||
}
|
||||
|
||||
message PageData {
|
||||
int64 page_id = 1;
|
||||
int32 page_number = 2;
|
||||
repeated StrokeData strokes = 3;
|
||||
}
|
||||
|
||||
message StrokeData {
|
||||
float pen_size = 1;
|
||||
int32 color = 2;
|
||||
string style = 3;
|
||||
bytes point_data = 4;
|
||||
int32 stroke_order = 5;
|
||||
}
|
||||
|
||||
message SyncNotebookResponse {
|
||||
int64 server_notebook_id = 1;
|
||||
google.protobuf.Timestamp synced_at = 2;
|
||||
}
|
||||
|
||||
message DeleteNotebookRequest {
|
||||
int64 notebook_id = 1;
|
||||
}
|
||||
|
||||
message DeleteNotebookResponse {}
|
||||
|
||||
message ListNotebooksRequest {}
|
||||
|
||||
message ListNotebooksResponse {
|
||||
repeated NotebookSummary notebooks = 1;
|
||||
}
|
||||
|
||||
message NotebookSummary {
|
||||
int64 server_id = 1;
|
||||
int64 remote_id = 2;
|
||||
string title = 3;
|
||||
string page_size = 4;
|
||||
int32 page_count = 5;
|
||||
google.protobuf.Timestamp synced_at = 6;
|
||||
}
|
||||
|
||||
message CreateShareLinkRequest {
|
||||
int64 notebook_id = 1;
|
||||
int64 expires_in_seconds = 2;
|
||||
}
|
||||
|
||||
message CreateShareLinkResponse {
|
||||
string token = 1;
|
||||
string url = 2;
|
||||
google.protobuf.Timestamp expires_at = 3;
|
||||
}
|
||||
|
||||
message RevokeShareLinkRequest {
|
||||
string token = 1;
|
||||
}
|
||||
|
||||
message RevokeShareLinkResponse {}
|
||||
|
||||
message ListShareLinksRequest {
|
||||
int64 notebook_id = 1;
|
||||
}
|
||||
|
||||
message ListShareLinksResponse {
|
||||
repeated ShareLinkInfo links = 1;
|
||||
}
|
||||
|
||||
message ShareLinkInfo {
|
||||
string token = 1;
|
||||
string url = 2;
|
||||
google.protobuf.Timestamp created_at = 3;
|
||||
google.protobuf.Timestamp expires_at = 4;
|
||||
}
|
||||
Reference in New Issue
Block a user