diff --git a/database-service/src/grpc/character_service.rs b/database-service/src/grpc/character_service.rs index 1c3156c..8b4e154 100644 --- a/database-service/src/grpc/character_service.rs +++ b/database-service/src/grpc/character_service.rs @@ -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::database_service::MyDatabaseService; use tonic::{Request, Response, Status}; @@ -8,7 +8,7 @@ impl CharacterService for MyDatabaseService { async fn get_character( &self, request: Request, - ) -> Result, Status> { + ) -> Result, Status> { let req = request.into_inner(); let repo = &self.db.character_repo; @@ -17,7 +17,7 @@ impl CharacterService for MyDatabaseService { .await .map_err(|_| Status::not_found("Character not found"))?; - let response = CharacterResponse { + let response = Character { id: character.id, user_id: character.user_id, name: character.name, @@ -35,12 +35,53 @@ impl CharacterService for MyDatabaseService { Ok(Response::new(response)) } + async fn get_character_list( + &self, + request: Request, + ) -> Result, 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 = 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( &self, request: Request, - ) -> Result, Status> { + ) -> Result, Status> { let req = request.into_inner(); let repo = &self.db.character_repo; + + //todo: we need to check if the character name exists already let character_id = repo .create_character( @@ -59,19 +100,8 @@ impl CharacterService for MyDatabaseService { .await .map_err(|_| Status::not_found("Character not found"))?; - let response = CharacterResponse { - 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, + let response = CreateCharacterResponse { + character_id: character.id, }; Ok(Response::new(response)) diff --git a/proto/character_db_api.proto b/proto/character_db_api.proto index ab3ec3e..c35bd1e 100644 --- a/proto/character_db_api.proto +++ b/proto/character_db_api.proto @@ -3,8 +3,9 @@ syntax = "proto3"; package character_db_api; service CharacterService { - rpc GetCharacter (CharacterRequest) returns (CharacterResponse); - rpc CreateCharacter (CreateCharacterRequest) returns (CharacterResponse); + rpc GetCharacter (CharacterRequest) returns (Character); + rpc GetCharacterList (CharacterListRequest) returns (CharacterListResponse); + rpc CreateCharacter (CreateCharacterRequest) returns (CreateCharacterResponse); rpc DeleteCharacter (DeleteCharacterRequest) returns (Empty); } @@ -12,6 +13,14 @@ message CharacterRequest { int32 character_id = 1; } +message CharacterListRequest { + int32 user_id = 1; +} + +message CharacterListResponse { + repeated Character characters = 1; +} + message CreateCharacterRequest { int32 user_id = 1; string name = 2; @@ -21,11 +30,15 @@ message CreateCharacterRequest { string position = 6; // JSON serialized } +message CreateCharacterResponse { + int32 character_id = 1; +} + message DeleteCharacterRequest { int32 character_id = 1; } -message CharacterResponse { +message Character { int32 id = 1; int32 user_id = 2; string name = 3;