feat: Add previous winners field to hackathon schema and update related tests
This commit is contained in:
@@ -2,6 +2,7 @@ use serde::{Deserialize, Serialize};
|
||||
use surrealdb::sql::Thing;
|
||||
use utoipa::ToSchema;
|
||||
use validator::Validate;
|
||||
use imphnen_entities::users::UsersDetailQueryDto;
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, Validate)]
|
||||
pub struct TeamsCreateRequestDto {
|
||||
@@ -219,13 +220,13 @@ pub struct TeamsDetailQueryDto {
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct TeamsListQueryDto {
|
||||
pub id: Thing,
|
||||
pub name: String,
|
||||
pub description: Option<String>,
|
||||
pub leader_id: Thing,
|
||||
pub leader: Option<UsersDetailQueryDto>,
|
||||
pub is_open: bool,
|
||||
pub max_members: Option<i32>,
|
||||
pub skills_required: Option<Vec<String>>,
|
||||
@@ -353,11 +354,19 @@ impl TeamsListItemDto {
|
||||
|
||||
impl TeamsListQueryDto {
|
||||
pub fn into_list_item_dto(self) -> TeamsListItemDto {
|
||||
TeamsListItemDto {
|
||||
id: self.id.id.to_raw(),
|
||||
name: self.name,
|
||||
description: self.description,
|
||||
leader: TeamMemberDto {
|
||||
let leader_dto = if let Some(leader_user) = self.leader {
|
||||
TeamMemberDto {
|
||||
id: String::new(),
|
||||
user_id: leader_user.id.id.to_raw(),
|
||||
fullname: leader_user.fullname,
|
||||
email: Some(leader_user.email),
|
||||
avatar: leader_user.avatar,
|
||||
role: "leader".to_string(),
|
||||
skills: leader_user.skills,
|
||||
joined_at: self.created_at.clone(),
|
||||
}
|
||||
} else {
|
||||
TeamMemberDto {
|
||||
id: String::new(),
|
||||
user_id: self.leader_id.id.to_raw(),
|
||||
fullname: String::new(),
|
||||
@@ -366,7 +375,14 @@ impl TeamsListQueryDto {
|
||||
role: "leader".to_string(),
|
||||
skills: None,
|
||||
joined_at: self.created_at.clone(),
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
TeamsListItemDto {
|
||||
id: self.id.id.to_raw(),
|
||||
name: self.name,
|
||||
description: self.description,
|
||||
leader: leader_dto,
|
||||
is_open: self.is_open,
|
||||
current_member_count: 1,
|
||||
max_members: self.max_members,
|
||||
|
||||
@@ -38,6 +38,7 @@ impl<'a> TeamsRepository<'a> {
|
||||
.with_condition("is_deleted = false AND is_active = true")
|
||||
.search_field("name")
|
||||
.select_fields(vec!["*"])
|
||||
.fetch_fields(vec![])
|
||||
.build()
|
||||
.await?;
|
||||
let elapsed = now.elapsed();
|
||||
|
||||
@@ -135,7 +135,8 @@ impl TeamsServiceTrait for TeamsService {
|
||||
let thing_id = make_thing_from_enum(ResourceEnum::Teams, &id);
|
||||
match repo.query_team_by_id(&thing_id).await {
|
||||
Ok(team) if !team.is_deleted => {
|
||||
let members = repo.query_team_members(&team.id).await.unwrap_or_default();
|
||||
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &team.id.id.to_raw());
|
||||
let members = repo.query_team_members(&team_thing).await.unwrap_or_default();
|
||||
let members_len = members.len();
|
||||
|
||||
// For public team details, only show sensitive info if user is authenticated and part of the team
|
||||
@@ -201,7 +202,8 @@ impl TeamsServiceTrait for TeamsService {
|
||||
let thing_id = make_thing_from_enum(ResourceEnum::Teams, &id);
|
||||
match repo.query_team_by_id(&thing_id).await {
|
||||
Ok(team) if !team.is_deleted => {
|
||||
let members = repo.query_team_members(&team.id).await.unwrap_or_default();
|
||||
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &team.id.id.to_raw());
|
||||
let members = repo.query_team_members(&team_thing).await.unwrap_or_default();
|
||||
let members_len = members.len();
|
||||
|
||||
// For member team details, include all information including members list
|
||||
@@ -279,7 +281,14 @@ impl TeamsServiceTrait for TeamsService {
|
||||
Box::pin(async move {
|
||||
let repo = TeamsRepository::new(&state);
|
||||
match repo.query_team_list(meta).await {
|
||||
Ok(data) => {
|
||||
Ok(mut data) => {
|
||||
// Calculate actual member count for each team
|
||||
for team in &mut data.data {
|
||||
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &team.id);
|
||||
let members = repo.query_team_members(&team_thing).await.unwrap_or_default();
|
||||
team.current_member_count = members.len() as i32 + 1; // +1 for leader
|
||||
}
|
||||
|
||||
let response = ResponseListSuccessDto {
|
||||
data: data.data,
|
||||
meta: data.meta,
|
||||
@@ -301,7 +310,8 @@ impl TeamsServiceTrait for TeamsService {
|
||||
let thing_id = make_thing_from_enum(ResourceEnum::Teams, &id);
|
||||
match repo.query_team_by_id(&thing_id).await {
|
||||
Ok(team) if !team.is_deleted => {
|
||||
let members = repo.query_team_members(&team.id).await.unwrap_or_default();
|
||||
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &team.id.id.to_raw());
|
||||
let members = repo.query_team_members(&team_thing).await.unwrap_or_default();
|
||||
let members_len = members.len();
|
||||
|
||||
// For public team details, only show sensitive info if user is authenticated and part of the team
|
||||
@@ -794,7 +804,8 @@ impl TeamsServiceTrait for TeamsService {
|
||||
let thing_id = make_thing_from_enum(ResourceEnum::Teams, &id);
|
||||
match repo.query_team_by_id(&thing_id).await {
|
||||
Ok(team) if !team.is_deleted => {
|
||||
let members = repo.query_team_members(&team.id).await.unwrap_or_default();
|
||||
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &team.id.id.to_raw());
|
||||
let members = repo.query_team_members(&team_thing).await.unwrap_or_default();
|
||||
let mut member_dtos = Vec::new();
|
||||
|
||||
for member in members {
|
||||
|
||||
Reference in New Issue
Block a user