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()
.build_server(false) // Generate gRPC client code
.compile_well_known_types(true)
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.compile_protos(
&["../proto/character_db_api.proto", "../proto/auth.proto"],
&["../proto"],

View File

@@ -1,11 +1,11 @@
use crate::database::{
character_db_service_client::CharacterDbServiceClient, Character, CharacterListRequest, CharacterListResponse,
character_db_service_client::CharacterDbServiceClient, CharacterItem, CharacterListRequest, CharacterListResponse,
CharacterRequest, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse,
};
use serde::{Deserialize, Serialize};
use tonic::transport::Channel;
use crate::character_service::character_common::{Item, ItemHeader};
use crate::character_common::{Item, ItemHeader};
#[derive(Clone)]
pub struct CharacterDbClient {
@@ -17,21 +17,6 @@ struct Skill {
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)]
struct Looks {
race: i32,
@@ -84,7 +69,7 @@ impl CharacterDbClient {
&mut self,
user_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 {
user_id: user_id.parse().unwrap(),
character_id: char_id.parse().unwrap(),

View File

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

View File

@@ -5,6 +5,7 @@ fn main() {
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.compile_protos(
&[
"../proto/character_common.proto",
"../proto/user_db_api.proto",
"../proto/character_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::database_service::MyDatabaseService;
use crate::grpc::{
Character, CharacterListRequest, CharacterListResponse, CharacterRequest, CreateCharacterRequest,
CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse,
};
// use crate::character_common::{Character};
use crate::grpc::{CharacterItem, CharacterListRequest, CharacterListResponse, CharacterRequest, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, DeleteCharacterResponse, SaveCharacterRequest, SaveCharacterResponse};
use tonic::{Request, Response, Status};
#[tonic::async_trait]
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 repo = &self.db.character_repo;
@@ -22,7 +20,7 @@ impl CharacterDbService for MyDatabaseService {
deleted_at = character.deleted_at.unwrap().to_string();
}
let response = Character {
let response = CharacterItem {
id: character.id,
user_id: character.user_id,
name: character.name,
@@ -53,14 +51,14 @@ impl CharacterDbService for MyDatabaseService {
.await
.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 {
let mut deleted_at = "".to_string();
if character.deleted_at.is_some() {
deleted_at = character.deleted_at.unwrap_or_default().to_string();
}
let character = Character {
let character = CharacterItem {
id: character.id,
user_id: character.user_id,
name: character.name,
@@ -138,4 +136,8 @@ impl CharacterDbService for MyDatabaseService {
};
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::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 tracing::debug;
@@ -43,4 +43,8 @@ impl SessionService for MyDatabaseService {
debug!("session: {:?}", session);
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;
use database_service::grpc::database_service::MyDatabaseService;
use database_service::grpc::session_service_server::SessionServiceServer;
use database_service::grpc::user_service_server::UserServiceServer;
pub mod characters;
pub mod db;
pub mod grpc;
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 sqlx::postgres::PgPoolOptions;
use std::env;
@@ -17,6 +24,10 @@ use tracing_subscriber::EnvFilter;
use utils::logging;
use utils::redis_cache::RedisCache;
pub mod character_common {
tonic::include_proto!("character_common");
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok();

View File

@@ -9,6 +9,7 @@ service CharacterService {
rpc CreateCharacter(CreateCharacterRequest) returns (CreateCharacterResponse);
rpc DeleteCharacter(DeleteCharacterRequest) returns (DeleteCharacterResponse);
rpc GetCharacter(GetCharacterRequest) returns (GetCharacterResponse);
rpc SaveCharacter(SaveCharacterRequest) returns (SaveCharacterResponse);
}
message GetCharacterListRequest {
@@ -51,3 +52,12 @@ message GetCharacterRequest {
message GetCharacterResponse {
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;
import "character_common.proto";
service CharacterDbService {
rpc GetCharacter (CharacterRequest) returns (Character);
rpc GetCharacter (CharacterRequest) returns (CharacterItem);
rpc GetCharacterList (CharacterListRequest) returns (CharacterListResponse);
rpc CreateCharacter (CreateCharacterRequest) returns (CreateCharacterResponse);
rpc DeleteCharacter (DeleteCharacterRequest) returns (DeleteCharacterResponse);
rpc SaveCharacter (SaveCharacterRequest) returns (SaveCharacterResponse);
}
message CharacterRequest {
@@ -18,8 +21,24 @@ message CharacterListRequest {
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 {
repeated Character characters = 1;
repeated CharacterItem characters = 1;
}
message CreateCharacterRequest {
@@ -48,18 +67,11 @@ message DeleteCharacterResponse {
string name = 2;
}
message Character {
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 SaveCharacterRequest {
string session_id = 1;
character_common.CharacterFull character = 2;
}
message SaveCharacterResponse {
bool success = 1;
}

View File

@@ -5,6 +5,7 @@ package session_db_api;
service SessionService {
rpc GetSession(GetSessionRequest) returns (GetSessionResponse);
rpc RefreshSession(RefreshSessionRequest) returns (RefreshSessionResponse);
rpc UpdateSession(UpdateSessionRequest) returns (UpdateSessionResponse);
}
message GetSessionRequest {
@@ -23,3 +24,15 @@ message RefreshSessionRequest {
message RefreshSessionResponse {
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;
}