- update: grpc character db api now includes getting the character list
This commit is contained in:
@@ -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,13 +35,54 @@ 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(
|
||||||
req.user_id,
|
req.user_id,
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user