Added SaveCharacter and UpdateSession function stubs

Updated proto message type names to better match usage
Fixed compile errors due to type name changes
This commit is contained in:
2025-07-22 00:17:32 -04:00
parent 2d423b0ad3
commit a20a44fd29
13 changed files with 110 additions and 73 deletions

View File

@@ -14,6 +14,7 @@ fn main() {
tonic_build::configure() tonic_build::configure()
.build_server(false) // Generate gRPC client code .build_server(false) // Generate gRPC client code
.compile_well_known_types(true) .compile_well_known_types(true)
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.compile_protos( .compile_protos(
&["../proto/character_db_api.proto", "../proto/auth.proto"], &["../proto/character_db_api.proto", "../proto/auth.proto"],
&["../proto"], &["../proto"],

View File

@@ -1,11 +1,11 @@
use crate::database::{ use crate::database::{
character_db_service_client::CharacterDbServiceClient, Character, CharacterListRequest, CharacterListResponse, character_db_service_client::CharacterDbServiceClient, CharacterItem, CharacterListRequest, CharacterListResponse,
CharacterRequest, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse, CharacterRequest, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tonic::transport::Channel; use tonic::transport::Channel;
use crate::character_service::character_common::{Item, ItemHeader}; use crate::character_common::{Item, ItemHeader};
#[derive(Clone)] #[derive(Clone)]
pub struct CharacterDbClient { pub struct CharacterDbClient {
@@ -17,21 +17,6 @@ struct Skill {
id: i32, id: i32,
} }
// #[derive(Debug, Deserialize, Serialize)]
// struct Item {
// item_id: i32,
// item_type: i32,
// is_created: i32,
// gem_option: i32,
// durability: f32,
// life: f32,
// socket: i8,
// is_appraised: i8,
// grade: u32,
// count: i32,
// slot: i32,
// }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
struct Looks { struct Looks {
race: i32, race: i32,
@@ -84,7 +69,7 @@ impl CharacterDbClient {
&mut self, &mut self,
user_id: &str, user_id: &str,
char_id: &str, char_id: &str,
) -> Result<Character, Box<dyn std::error::Error>> { ) -> Result<CharacterItem, Box<dyn std::error::Error>> {
let request = tonic::Request::new(CharacterRequest { let request = tonic::Request::new(CharacterRequest {
user_id: user_id.parse().unwrap(), user_id: user_id.parse().unwrap(),
character_id: char_id.parse().unwrap(), character_id: char_id.parse().unwrap(),

View File

@@ -1,21 +1,11 @@
use crate::character_db_client::CharacterDbClient; use crate::character_db_client::CharacterDbClient;
use crate::character_service::character::character_service_server::CharacterService; use crate::character::character_service_server::CharacterService;
use crate::character_service::character::{ use crate::character::{CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse, GetCharacterListRequest, GetCharacterListResponse, GetCharacterRequest, GetCharacterResponse, SaveCharacterRequest, SaveCharacterResponse};
CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse, use crate::character_common::{Character, CharacterFull, EquippedItem, Item, ItemHeader};
GetCharacterListRequest, GetCharacterListResponse, GetCharacterRequest, GetCharacterResponse,
};
use crate::character_service::character_common::{Character, CharacterFull};
use std::sync::Arc; use std::sync::Arc;
use tonic::{Request, Response, Status}; use tonic::{Request, Response, Status};
use tracing::debug; use tracing::debug;
pub mod character_common {
tonic::include_proto!("character_common");
}
pub mod character {
tonic::include_proto!("character");
}
pub struct MyCharacterService { pub struct MyCharacterService {
pub character_db_client: Arc<CharacterDbClient>, pub character_db_client: Arc<CharacterDbClient>,
} }
@@ -42,11 +32,11 @@ impl CharacterService for MyCharacterService {
let mut characters: Vec<Character> = vec![]; let mut characters: Vec<Character> = vec![];
for character in character_list.characters { for character in character_list.characters {
let mut equipped_items: Vec<character_common::EquippedItem> = vec![]; let mut equipped_items: Vec<EquippedItem> = vec![];
let inventory: Vec<character_common::Item> = serde_json::from_str(&character.inventory).unwrap(); let inventory: Vec<Item> = serde_json::from_str(&character.inventory).unwrap();
for item in inventory { for item in inventory {
if item.slot < 12 { if item.slot < 12 {
equipped_items.push(character_common::EquippedItem { equipped_items.push(EquippedItem {
item_id: item.header.unwrap().id, item_id: item.header.unwrap().id,
socket: item.socket, socket: item.socket,
grade: item.grade, grade: item.grade,
@@ -142,4 +132,8 @@ impl CharacterService for MyCharacterService {
}; };
Ok(Response::new(response)) Ok(Response::new(response))
} }
async fn save_character(&self, request: Request<SaveCharacterRequest>) -> Result<Response<SaveCharacterResponse>, Status> {
todo!()
}
} }

View File

@@ -1,3 +0,0 @@
pub mod character_db_client;
pub mod character_service;
pub mod database;

View File

@@ -4,8 +4,20 @@ pub mod database {
tonic::include_proto!("character_db_api"); tonic::include_proto!("character_db_api");
} }
pub mod common {
tonic::include_proto!("common");
}
pub mod character {
tonic::include_proto!("character");
}
pub mod character_common {
tonic::include_proto!("character_common");
}
use crate::character_db_client::CharacterDbClient; use crate::character_db_client::CharacterDbClient;
use crate::character_service::character::character_service_server::CharacterServiceServer; use crate::character::character_service_server::CharacterServiceServer;
use crate::character_service::MyCharacterService; use crate::character_service::MyCharacterService;
use dotenv::dotenv; use dotenv::dotenv;
use std::env; use std::env;

View File

@@ -5,6 +5,7 @@ fn main() {
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.compile_protos( .compile_protos(
&[ &[
"../proto/character_common.proto",
"../proto/user_db_api.proto", "../proto/user_db_api.proto",
"../proto/character_db_api.proto", "../proto/character_db_api.proto",
"../proto/session_db_api.proto", "../proto/session_db_api.proto",

View File

@@ -1,14 +1,12 @@
use crate::grpc::character_db_service_server::CharacterDbService; use crate::grpc::character_db_service_server::CharacterDbService;
use crate::grpc::database_service::MyDatabaseService; use crate::grpc::database_service::MyDatabaseService;
use crate::grpc::{ // use crate::character_common::{Character};
Character, CharacterListRequest, CharacterListResponse, CharacterRequest, CreateCharacterRequest, use crate::grpc::{CharacterItem, CharacterListRequest, CharacterListResponse, CharacterRequest, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse, SaveCharacterRequest, SaveCharacterResponse};
CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse,
};
use tonic::{Request, Response, Status}; use tonic::{Request, Response, Status};
#[tonic::async_trait] #[tonic::async_trait]
impl CharacterDbService for MyDatabaseService { impl CharacterDbService for MyDatabaseService {
async fn get_character(&self, request: Request<CharacterRequest>) -> Result<Response<Character>, Status> { async fn get_character(&self, request: Request<CharacterRequest>) -> Result<Response<CharacterItem>, Status> {
let req = request.into_inner(); let req = request.into_inner();
let repo = &self.db.character_repo; let repo = &self.db.character_repo;
@@ -22,7 +20,7 @@ impl CharacterDbService for MyDatabaseService {
deleted_at = character.deleted_at.unwrap().to_string(); deleted_at = character.deleted_at.unwrap().to_string();
} }
let response = Character { let response = CharacterItem {
id: character.id, id: character.id,
user_id: character.user_id, user_id: character.user_id,
name: character.name, name: character.name,
@@ -53,14 +51,14 @@ impl CharacterDbService for MyDatabaseService {
.await .await
.map_err(|_| Status::not_found("Character not found"))?; .map_err(|_| Status::not_found("Character not found"))?;
let mut character_list: Vec<Character> = Vec::new(); let mut character_list: Vec<CharacterItem> = Vec::new();
for character in characters { for character in characters {
let mut deleted_at = "".to_string(); let mut deleted_at = "".to_string();
if character.deleted_at.is_some() { if character.deleted_at.is_some() {
deleted_at = character.deleted_at.unwrap_or_default().to_string(); deleted_at = character.deleted_at.unwrap_or_default().to_string();
} }
let character = Character { let character = CharacterItem {
id: character.id, id: character.id,
user_id: character.user_id, user_id: character.user_id,
name: character.name, name: character.name,
@@ -138,4 +136,8 @@ impl CharacterDbService for MyDatabaseService {
}; };
Ok(Response::new(response)) Ok(Response::new(response))
} }
async fn save_character(&self, request: Request<SaveCharacterRequest>) -> Result<Response<SaveCharacterResponse>, Status> {
todo!()
}
} }

View File

@@ -1,6 +1,6 @@
use crate::grpc::database_service::MyDatabaseService; use crate::grpc::database_service::MyDatabaseService;
use crate::grpc::session_service_server::SessionService; use crate::grpc::session_service_server::SessionService;
use crate::grpc::{GetSessionRequest, GetSessionResponse, RefreshSessionRequest, RefreshSessionResponse}; use crate::grpc::{GetSessionRequest, GetSessionResponse, RefreshSessionRequest, RefreshSessionResponse, UpdateSessionRequest, UpdateSessionResponse};
use tonic::{Request, Response, Status}; use tonic::{Request, Response, Status};
use tracing::debug; use tracing::debug;
@@ -43,4 +43,8 @@ impl SessionService for MyDatabaseService {
debug!("session: {:?}", session); debug!("session: {:?}", session);
Ok(Response::new(RefreshSessionResponse { valid })) Ok(Response::new(RefreshSessionResponse { valid }))
} }
async fn update_session(&self, request: Request<UpdateSessionRequest>) -> Result<Response<UpdateSessionResponse>, Status> {
todo!()
}
} }

View File

@@ -1,5 +0,0 @@
pub mod characters;
pub mod db;
pub mod grpc;
pub mod sessions;
pub mod users;

View File

@@ -1,8 +1,15 @@
use database_service::db::Database;
use database_service::grpc::character_db_service_server::CharacterDbServiceServer; pub mod characters;
use database_service::grpc::database_service::MyDatabaseService; pub mod db;
use database_service::grpc::session_service_server::SessionServiceServer; pub mod grpc;
use database_service::grpc::user_service_server::UserServiceServer; pub mod sessions;
pub mod users;
use crate::db::Database;
use crate::grpc::character_db_service_server::CharacterDbServiceServer;
use crate::grpc::database_service::MyDatabaseService;
use crate::grpc::session_service_server::SessionServiceServer;
use crate::grpc::user_service_server::UserServiceServer;
use dotenv::dotenv; use dotenv::dotenv;
use sqlx::postgres::PgPoolOptions; use sqlx::postgres::PgPoolOptions;
use std::env; use std::env;
@@ -17,6 +24,10 @@ use tracing_subscriber::EnvFilter;
use utils::logging; use utils::logging;
use utils::redis_cache::RedisCache; use utils::redis_cache::RedisCache;
pub mod character_common {
tonic::include_proto!("character_common");
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok(); dotenv().ok();

View File

@@ -9,6 +9,7 @@ service CharacterService {
rpc CreateCharacter(CreateCharacterRequest) returns (CreateCharacterResponse); rpc CreateCharacter(CreateCharacterRequest) returns (CreateCharacterResponse);
rpc DeleteCharacter(DeleteCharacterRequest) returns (DeleteCharacterResponse); rpc DeleteCharacter(DeleteCharacterRequest) returns (DeleteCharacterResponse);
rpc GetCharacter(GetCharacterRequest) returns (GetCharacterResponse); rpc GetCharacter(GetCharacterRequest) returns (GetCharacterResponse);
rpc SaveCharacter(SaveCharacterRequest) returns (SaveCharacterResponse);
} }
message GetCharacterListRequest { message GetCharacterListRequest {
@@ -51,3 +52,12 @@ message GetCharacterRequest {
message GetCharacterResponse { message GetCharacterResponse {
character_common.CharacterFull character = 1; character_common.CharacterFull character = 1;
} }
message SaveCharacterRequest {
string sessions_id = 1;
character_common.CharacterFull character = 2;
}
message SaveCharacterResponse {
bool success = 1;
}

View File

@@ -2,11 +2,14 @@ syntax = "proto3";
package character_db_api; package character_db_api;
import "character_common.proto";
service CharacterDbService { service CharacterDbService {
rpc GetCharacter (CharacterRequest) returns (Character); rpc GetCharacter (CharacterRequest) returns (CharacterItem);
rpc GetCharacterList (CharacterListRequest) returns (CharacterListResponse); rpc GetCharacterList (CharacterListRequest) returns (CharacterListResponse);
rpc CreateCharacter (CreateCharacterRequest) returns (CreateCharacterResponse); rpc CreateCharacter (CreateCharacterRequest) returns (CreateCharacterResponse);
rpc DeleteCharacter (DeleteCharacterRequest) returns (DeleteCharacterResponse); rpc DeleteCharacter (DeleteCharacterRequest) returns (DeleteCharacterResponse);
rpc SaveCharacter (SaveCharacterRequest) returns (SaveCharacterResponse);
} }
message CharacterRequest { message CharacterRequest {
@@ -18,8 +21,24 @@ message CharacterListRequest {
string user_id = 1; string user_id = 1;
} }
message CharacterItem {
int32 id = 1;
string user_id = 2;
string name = 3;
int64 money = 4;
string inventory = 6;
string stats = 7;
string skills = 8;
string looks = 9;
string position = 10;
string created_at = 11;
string updated_at = 12;
string deleted_at = 13;
bool is_active = 14;
}
message CharacterListResponse { message CharacterListResponse {
repeated Character characters = 1; repeated CharacterItem characters = 1;
} }
message CreateCharacterRequest { message CreateCharacterRequest {
@@ -48,18 +67,11 @@ message DeleteCharacterResponse {
string name = 2; string name = 2;
} }
message Character { message SaveCharacterRequest {
int32 id = 1; string session_id = 1;
string user_id = 2; character_common.CharacterFull character = 2;
string name = 3;
int64 money = 4;
string inventory = 6;
string stats = 7;
string skills = 8;
string looks = 9;
string position = 10;
string created_at = 11;
string updated_at = 12;
string deleted_at = 13;
bool is_active = 14;
} }
message SaveCharacterResponse {
bool success = 1;
}

View File

@@ -5,6 +5,7 @@ package session_db_api;
service SessionService { service SessionService {
rpc GetSession(GetSessionRequest) returns (GetSessionResponse); rpc GetSession(GetSessionRequest) returns (GetSessionResponse);
rpc RefreshSession(RefreshSessionRequest) returns (RefreshSessionResponse); rpc RefreshSession(RefreshSessionRequest) returns (RefreshSessionResponse);
rpc UpdateSession(UpdateSessionRequest) returns (UpdateSessionResponse);
} }
message GetSessionRequest { message GetSessionRequest {
@@ -22,4 +23,16 @@ message RefreshSessionRequest {
message RefreshSessionResponse { message RefreshSessionResponse {
bool valid = 1; bool valid = 1;
}
message UpdateSessionRequest {
string session_id = 1;
string user_id = 2;
string character_id = 3;
string map_id = 4;
string client_id = 5;
}
message UpdateSessionResponse {
bool success = 1;
} }