From 9b9d94205d3e55a5e8a765674ef464e80f3e40fb Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Sat, 26 Jul 2025 10:20:06 +0200 Subject: feat(profile): create service --- lib/sellershut-core/Cargo.toml | 1 + lib/sellershut-core/build.rs | 17 +++++-- lib/sellershut-core/proto/profile/profile.proto | 59 +++++++++++++++++++++++++ lib/sellershut-core/src/lib.rs | 4 ++ lib/sellershut-core/src/profile.rs | 3 ++ 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 lib/sellershut-core/proto/profile/profile.proto create mode 100644 lib/sellershut-core/src/profile.rs (limited to 'lib/sellershut-core') diff --git a/lib/sellershut-core/Cargo.toml b/lib/sellershut-core/Cargo.toml index b5e1bb9..1b7d5f7 100644 --- a/lib/sellershut-core/Cargo.toml +++ b/lib/sellershut-core/Cargo.toml @@ -18,6 +18,7 @@ tonic-types = "0.13.0" [features] default = [] auth = [] +profile = [] serde = ["dep:serde", "serde/derive", "serde_json"] time = [ "dep:time", diff --git a/lib/sellershut-core/build.rs b/lib/sellershut-core/build.rs index 8ff48f1..110bc22 100644 --- a/lib/sellershut-core/build.rs +++ b/lib/sellershut-core/build.rs @@ -1,10 +1,12 @@ -#[cfg(feature = "auth")] +#[cfg(any(feature = "auth", feature = "profile"))] enum Entity { #[cfg(feature = "auth")] Auth, + #[cfg(feature = "profile")] + Profile, } -#[cfg(feature = "auth")] +#[cfg(any(feature = "auth", feature = "profile"))] impl Entity { fn protos(&self) -> Vec<&'static str> { let mut res: Vec<&'static str> = vec![]; @@ -13,6 +15,10 @@ impl Entity { #[cfg(feature = "auth")] Entity::Auth => { res.extend(vec!["proto/auth/auth.proto"]); + }, + #[cfg(feature = "profile")] + Entity::Profile => { + res.extend(vec!["proto/profile/profile.proto"]); } } res @@ -25,10 +31,13 @@ fn main() -> Result<(), Box> { #[cfg(feature = "auth")] build_proto("auth", Entity::Auth); + #[cfg(feature = "profile")] + build_proto("profile", Entity::Profile); + Ok(()) } -#[cfg(feature = "auth")] +#[cfg(any(feature = "auth", feature = "profile"))] fn build_proto(package: &str, entity: Entity) { let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()); @@ -72,7 +81,7 @@ fn build_proto(package: &str, entity: Entity) { .compile_protos(&entity.protos(), include_paths).unwrap(); } -#[cfg(all(feature = "serde", feature = "auth",))] +#[cfg(all(feature = "serde", any(feature = "auth",feature = "profile")))] fn add_serde(config: tonic_build::Builder) -> tonic_build::Builder { config.type_attribute( ".", diff --git a/lib/sellershut-core/proto/profile/profile.proto b/lib/sellershut-core/proto/profile/profile.proto new file mode 100644 index 0000000..742dc7b --- /dev/null +++ b/lib/sellershut-core/proto/profile/profile.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +package profile; + +import "google/protobuf/timestamp.proto"; + +// A message representing a user profile +message User { + // Unique identifier for the user + string id = 1; + // Email address of the user + string email = 2; + // Unique username chosen by the user + string username = 3; + // URL to the user's avatar image + optional string avatar = 4; + // Timestamp when the user was created + google.protobuf.Timestamp created_at = 5; + // Timestamp when the user was last updated + google.protobuf.Timestamp updated_at = 6; + // User-provided description or bio + optional string description = 7; +} + +// Request message for creating a new user profile +message CreateUserRequest { + // Email address of the new user + string email = 1; + // Avatar for the new user + optional string avatar = 2; +} + +// Response message for CreateUser RPC +message CreateUserResponse { + // Temporary assigned id + string temp_id = 1; + // Timestamp when the user was created + google.protobuf.Timestamp created_at = 2; +} + +// Message to finalise profile creation +message CompleteUserRequest { + // ID of the user to finalise + string id = 1; + // Required: username to finalise the profile + string username = 2; + // Optional: user-provided description + optional string description = 3; + // Optional: update avatar + optional string avatar = 4; +} + +// Profile gRPC service +service Profile { + // Create a new user profile + rpc CreateUser (CreateUserRequest) returns (CreateUserResponse); + // Complete Profile + rpc CompleteProfile (CompleteUserRequest) returns (User); +} diff --git a/lib/sellershut-core/src/lib.rs b/lib/sellershut-core/src/lib.rs index ee2ed9b..c300495 100644 --- a/lib/sellershut-core/src/lib.rs +++ b/lib/sellershut-core/src/lib.rs @@ -10,4 +10,8 @@ #[cfg(feature = "auth")] pub mod google; +/// Interactions with Auth server pub mod auth; + +/// Interactions with Profile server +pub mod profile; diff --git a/lib/sellershut-core/src/profile.rs b/lib/sellershut-core/src/profile.rs new file mode 100644 index 0000000..bf366b1 --- /dev/null +++ b/lib/sellershut-core/src/profile.rs @@ -0,0 +1,3 @@ +tonic::include_proto!("profile"); +/// Profile file descriptor +pub const PROFILE_FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("profile_descriptor"); -- cgit v1.2.3