feat: Add previous winners field to hackathon schema and update related tests

This commit is contained in:
MythEclipse
2025-09-27 22:30:42 +07:00
parent af41a98111
commit a32f54873b
10 changed files with 128 additions and 20 deletions
+23 -7
View File
@@ -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();
+16 -5
View File
@@ -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 {