- update: grpc character db api now includes getting the character list

This commit is contained in:
2025-01-05 17:09:28 -05:00
parent 4a826d2a46
commit 7417d2d6dd
2 changed files with 63 additions and 20 deletions

View File

@@ -1,4 +1,4 @@
use crate::grpc::{CharacterRequest, CharacterResponse, CreateCharacterRequest, DeleteCharacterRequest, Empty}; use crate::grpc::{Character, CharacterRequest, CharacterListRequest, CharacterListResponse, CreateCharacterRequest, CreateCharacterResponse, DeleteCharacterRequest, Empty};
use crate::grpc::character_service_server::CharacterService; use crate::grpc::character_service_server::CharacterService;
use crate::grpc::database_service::MyDatabaseService; use crate::grpc::database_service::MyDatabaseService;
use tonic::{Request, Response, Status}; use tonic::{Request, Response, Status};
@@ -8,7 +8,7 @@ impl CharacterService for MyDatabaseService {
async fn get_character( async fn get_character(
&self, &self,
request: Request<CharacterRequest>, request: Request<CharacterRequest>,
) -> Result<Response<CharacterResponse>, Status> { ) -> Result<Response<Character>, Status> {
let req = request.into_inner(); let req = request.into_inner();
let repo = &self.db.character_repo; let repo = &self.db.character_repo;
@@ -17,7 +17,7 @@ impl CharacterService for MyDatabaseService {
.await .await
.map_err(|_| Status::not_found("Character not found"))?; .map_err(|_| Status::not_found("Character not found"))?;
let response = CharacterResponse { let response = Character {
id: character.id, id: character.id,
user_id: character.user_id, user_id: character.user_id,
name: character.name, name: character.name,
@@ -35,12 +35,53 @@ impl CharacterService for MyDatabaseService {
Ok(Response::new(response)) Ok(Response::new(response))
} }
async fn get_character_list(
&self,
request: Request<CharacterListRequest>,
) -> Result<Response<CharacterListResponse>, Status> {
let req = request.into_inner();
let repo = &self.db.character_repo;
let characters = repo
.get_characters_by_user(req.user_id)
.await
.map_err(|_| Status::not_found("Character not found"))?;
let mut character_list: Vec<Character> = Vec::new();
for character in characters {
let character = Character {
id: character.id,
user_id: character.user_id,
name: character.name,
level: character.level as i32,
experience: character.experience,
inventory: character.inventory.to_string(),
stats: character.stats.to_string(),
looks: character.looks.to_string(),
position: character.position.to_string(),
created_at: character.created_at.to_string(),
updated_at: character.updated_at.to_string(),
is_active: character.is_active,
};
character_list.push(character);
}
let response = CharacterListResponse {
characters: character_list,
};
Ok(Response::new(response))
}
async fn create_character( async fn create_character(
&self, &self,
request: Request<CreateCharacterRequest>, request: Request<CreateCharacterRequest>,
) -> Result<Response<CharacterResponse>, Status> { ) -> Result<Response<CreateCharacterResponse>, Status> {
let req = request.into_inner(); let req = request.into_inner();
let repo = &self.db.character_repo; let repo = &self.db.character_repo;
//todo: we need to check if the character name exists already
let character_id = repo let character_id = repo
.create_character( .create_character(
@@ -59,19 +100,8 @@ impl CharacterService for MyDatabaseService {
.await .await
.map_err(|_| Status::not_found("Character not found"))?; .map_err(|_| Status::not_found("Character not found"))?;
let response = CharacterResponse { let response = CreateCharacterResponse {
id: character.id, character_id: character.id,
user_id: character.user_id,
name: character.name,
level: character.level as i32,
experience: character.experience,
inventory: character.inventory.to_string(),
stats: character.stats.to_string(),
looks: character.looks.to_string(),
position: character.position.to_string(),
created_at: character.created_at.to_string(),
updated_at: character.updated_at.to_string(),
is_active: character.is_active,
}; };
Ok(Response::new(response)) Ok(Response::new(response))

View File

@@ -3,8 +3,9 @@ syntax = "proto3";
package character_db_api; package character_db_api;
service CharacterService { service CharacterService {
rpc GetCharacter (CharacterRequest) returns (CharacterResponse); rpc GetCharacter (CharacterRequest) returns (Character);
rpc CreateCharacter (CreateCharacterRequest) returns (CharacterResponse); rpc GetCharacterList (CharacterListRequest) returns (CharacterListResponse);
rpc CreateCharacter (CreateCharacterRequest) returns (CreateCharacterResponse);
rpc DeleteCharacter (DeleteCharacterRequest) returns (Empty); rpc DeleteCharacter (DeleteCharacterRequest) returns (Empty);
} }
@@ -12,6 +13,14 @@ message CharacterRequest {
int32 character_id = 1; int32 character_id = 1;
} }
message CharacterListRequest {
int32 user_id = 1;
}
message CharacterListResponse {
repeated Character characters = 1;
}
message CreateCharacterRequest { message CreateCharacterRequest {
int32 user_id = 1; int32 user_id = 1;
string name = 2; string name = 2;
@@ -21,11 +30,15 @@ message CreateCharacterRequest {
string position = 6; // JSON serialized string position = 6; // JSON serialized
} }
message CreateCharacterResponse {
int32 character_id = 1;
}
message DeleteCharacterRequest { message DeleteCharacterRequest {
int32 character_id = 1; int32 character_id = 1;
} }
message CharacterResponse { message Character {
int32 id = 1; int32 id = 1;
int32 user_id = 2; int32 user_id = 2;
string name = 3; string name = 3;