Skip to content

Releases: 42Statistics/42Stat-Backend

v0.5.0

21 Jul 10:36
Compare
Choose a tag to compare
v0.5.0 Pre-release
Pre-release

์‹ ๊ทœ ๊ธฐ๋Šฅ โœจ

  • ๋กœ๊ทธ์ธ ๊ด€๋ จ mutation ์ถ”๊ฐ€
type LinkedAccount {
  platform: String!
  id: String!
  email: String
  linkedAt: DateTime!
}

type Account {
  userId: Int!
  linkedAccounts: [LinkedAccount!]!
}

type LoginSuccess {
  accessToken: String!
  refreshToken: String!
  userId: Int!
  message: String!
}

type LoginNotLinked {
  message: String!
}

union LoginResult = LoginSuccess | LoginNotLinked

type GoogleLoginInput {
  clientId: String!
  credential: String!
}
  • ftLogin ์ถ”๊ฐ€
  mutation ftLogin (ftCode: "example"): LoginSuccess!
  • googleLogin ์ถ”๊ฐ€
mutation googleLogin (google: GoogleLoginInput, ftCode: "example"): LoginResult!
  • linkGoogle ์ถ”๊ฐ€
mutation linkGoogle (google: GoogleLoginInput): Account!
  • unlinkAccount ์ถ”๊ฐ€
mutation unlinkAccount (targetPlatform: String!): Account!
  • refreshToken ์ถ”๊ฐ€
mutation refreshToken (refreshToken: String!): LoginSuccess!
  • logout ์ถ”๊ฐ€
mutation logout: Int!
  • deleteAccount ์ถ”๊ฐ€
mutation deleteAccount: Int!
  • getSetting ์ถ”๊ฐ€
getSetting: Account
  • getPersonalVersus ์ถ”๊ฐ€
# login, userId ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
getPersonalVersus (login: "example", userId: 12345) {
  levelRank {
    rank
    value
  }
  totalScoreRank {
    rank
    value
  }
  totalEvalCountRank {
    rank
    value
  }
  currWeekExpIncreamentRank {
    rank
    value
  }
  currWeekScoreRank {
    rank
    value
  }
  currWeekEvalCountRank {
    rank
    value
  }
}

๊ธฐ์กด api ๋ณ€๊ฒฝ ์‚ฌํ•ญ โ™ป๏ธ

  • getPersonalGeneral ์˜ character ๋ฅผ ๋ฐฑ์—”๋“œ์—์„œ ์บ๋ฆญํ„ฐ๊นŒ์ง€ ํŠน์ •ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
getPersonalGeneral (login: "example") {
  character {
    name
    types {
      name
      description
      color
    }
    imgUrl
  }
}
  • getPersonalEval ์˜ totalCount ๋ฅผ countByDateTemplate ๊ณผ ํ†ตํ•ฉ, ๊ธฐ์กด totalCount ๋Š” ๋‹ค์Œ release ์— ์‚ญ์ œ ์˜ˆ์ •
  • graphql complexity ๋ฅผ ํ†ตํ•ด, ํ•œ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ field ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •

๋ฒ„๊ทธ ์ˆ˜์ • ๐Ÿ›

์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๐Ÿ“

  • feat โœจ complexity by @jpham005 in #228
  • refactor โ™ป๏ธ character by @jpham005 in #231
  • feat โœจ versus by @jpham005 in #233
  • feat โœจ login & setting page by @niamu01 in #218
  • refactor: โ™ป๏ธ ์žฌ๋Šฅ ์ตœ๋Œ€ ๊ตฌ์—ญ์˜ ์œ ์ € ๋ถ„ํฌ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์€ ๋ฌธ์ œ ์ˆ˜์ • by @jpham005 in #234
  • refactor: โ™ป๏ธ ์บ์‹œ ํ•  ํ•„์š” ์—†๋˜ ๋ถ€๋ถ„ private ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ, cache max, ttl ์„ค์ • ๋ณ€๊ฒฝ by @jpham005 in #236
  • chore: ๐Ÿš€ v0.5.0 by @jpham005 in #237

Full Changelog: v0.4.0...v0.5.0

v0.4.0

11 Jul 12:00
Compare
Choose a tag to compare
v0.4.0 Pre-release
Pre-release

์‹ ๊ทœ ๊ธฐ๋Šฅ โœจ

  • ์šด๋ช…์˜ ์žฅ๋‚œ api ๊ตฌํ˜„
getPersonalEval (login:"example") {
  destinyRanking {
    userPreview {
      id
      login
      imgUrl
    }
    value
    rank
  }
}
  • getProjectInfo ์— url ์ถ”๊ฐ€
getProjectInfo (projectName: "Libft") {
  url
}

๊ธฐ์กด api ๋ณ€๊ฒฝ ์‚ฌํ•ญ โ™ป๏ธ

  • user ์˜ coalition ์ •๋ณด๋ฅผ nullable ํ•˜๊ฒŒ ๋ณ€๊ฒฝ #215
    • getPersonalGeneral ์˜ UserProfile ์˜ coalition ์„ nullable ํ•˜๊ฒŒ ๋ณ€๊ฒฝ
    • getPersonalGeneral ์˜ scoreInfo ์ค‘ rankInCoalition ์„ nullable ํ•˜๊ฒŒ ๋ณ€๊ฒฝ
@ObjectType()
export class UserProfile {
  // ...
  @Field({ nullable: true })
  coalition?: Coalition;
}

@ObjectType()
export class UserScoreInfo {
  // ...
  @Field({ nullable: true })
  rankInCoalition?: number;
}
  • getPersonalGeneral ์˜ levelRecords ๊ด€๋ จ๋œ ๋ถ€๋ถ„์„ #188 ๋…ผ์˜ ๊ฒฐ๊ณผ๋Œ€๋กœ ๋ณ€๊ฒฝ (๊ธฐ์กด ์ „์ฒด ๋ฉค๋ฒ„ ํ‰๊ท  ์‚ญ์ œ, ๊ธฐ์ˆ˜ ๋ณ„ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€)
getPersonalGeneral (login:"example") {
  promoLevelRecords {
     monthsPassed
     level
  }
  promoMemberLevelRecords {
     monthsPassed
     level
  }
}
  • getPersonalGeneral ์˜ character ์—์„œ UserRank ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋˜ ๋ถ€๋ถ„์„ UserRankWithCount ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ #206
getPersonalGeneral (login: "example") {
  character {
    effort {
      logtimeRank {
        # ...UserRank
        totalUserCount
      }
    }
  }
}
  • user, project search ์—์„œ ์ตœ์†Œ ์ž…๋ ฅ ๊ธ€์ž ์ˆ˜์™€ ์ตœ๋Œ€ ์ž…๋ ฅ ๊ธ€์ž ์ˆ˜ ์ถ”๊ฐ€
  • getHomeTeam ์˜ currRegisterCount ๋ฅผ ์ง‘๊ณ„ํ•  ๋•Œ, ๊ฐฑ์‹ ์ด ์˜ค๋ž˜๋™์•ˆ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ํŒ€๋“ค์„ ์ œ์™ธ
  • ๊ฐ์ข… ๋ฐฐ์—ด ๋ฐ˜ํ™˜ํ•˜๋Š” query ์—์„œ ๋ถˆํ•„์š”ํ–ˆ๋˜ nullable: 'items' ์ œ๊ฑฐ #205

๋ฒ„๊ทธ ์ˆ˜์ • ๐Ÿ›

  • userLevelRecords ์—์„œ, ๋ ˆ๋ฒจ ๋ณ€๋™์ด ์—†๋Š” ์ƒํƒœ์—์„œ ์‹œ๊ฐ„์„ ๋ณด๋‚ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜๋Š” ๋ฌธ์ œ ์ˆ˜์ •
  • logtime ๊ด€๋ จ๋œ ๋กœ์ง์—์„œ, ์•„์ง ์ ‘์† ์ข…๋ฃŒํ•˜์ง€ ์•Š์€ ์œ ์ €์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ #198 #199
  • ์ง์ „ exam ์„ ์ œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • #190
  • ์ผ๋ถ€ cache ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฒŒ ์ž‘๋™ํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • #191
  • ์ž˜๋ชป๋œ nullable: 'items' ์„ค์ • ์ œ๊ฑฐ #205
  • ํ‰๊ฐ€ ๊ธฐ๋ก์ด ์—†๋Š” user ์˜ ๊ธฐ๋ก์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • #216

์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๐Ÿ“

  • feat: โœจ destiny user rank by @niamu01 in #192
  • fix: ๐Ÿ› examresult by @niamu01 in #194
  • refactor โ™ป๏ธ curr register count class validator by @niamu01 in #197
  • fix: ๐Ÿ› logtime service ๋ฒ„๊ทธ ์ˆ˜์ • by @jpham005 in #201
  • feat โœจ graphql error by @niamu01 in #202
  • refactor โ™ป๏ธ search by @jpham005 in #211
  • feat: โœจ projectInfo ์— url ์ถ”๊ฐ€ by @jpham005 in #212
  • feat: โœจ ๊ธฐ์ˆ˜ ์ „์ฒด ํ‰๊ท , ๊ธฐ์ˆ˜ ๋ฉค๋ฒ„ ํ‰๊ท , ์œ ์ € ํ‰๊ท  ๋ ˆ๋ฒจ ๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„ by @jpham005 in #213
  • refactor โ™ป๏ธ cache by @jpham005 in #217
  • fix: ๐Ÿ› ์บ์‹œ ์ˆ˜์ • ์ค‘ ๊ธฐ์กด ๋กœ์ง์—์„œ ์ ์ ˆํžˆ ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„ ์ˆ˜์ • by @jpham005 in #219
  • feat: โœจ cache by @jpham005 in #220
  • feat: โœจ character usercount by @jpham005 in #221
  • fix โ™ป๏ธ ๐Ÿ› ๐Ÿš€ prepare v0.4.0 by @jpham005 in #224

Full Changelog: v0.3.0...v0.4.0

v0.3.0

26 Jun 06:45
Compare
Choose a tag to compare
v0.3.0 Pre-release
Pre-release

์‹ ๊ทœ ๊ธฐ๋Šฅ โœจ

  • ๋‹ฎ์€ ์บ๋ฆญํ„ฐ ์นด๋“œ ์ถ”๊ฐ€
getPersonalGeneral {
  character {
    effort {
      logtimeRank {
        rank
        value
        userPreview {
          id
        }
      }
      evalCountRank {
        rank
        value
      }
      examTryCount
      projectTryCount
    }
    talent {
      levelRank {
        rank
        value
      }
      examOneshotRate {
        total
        fields {
          key
          value
        }
      }
      projectOneshotRate {
        total
        fields {
          key
          value
        }
      }
      outstandingRate {
        total
        fields {
          key
          value
        }
      }
    }
  }
}

๊ธฐ์กด api ๋ณ€๊ฒฝ ์‚ฌํ•ญ โ™ป๏ธ

  • lastExamResult์—์„œ recentExamResult์œผ๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ
  • ๋‹ค๋ฅธ Rate๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋“ค๊ณผ ํƒ€์ž…์„ ๋งž์ถค
  • after์ธ์ž๋กœ ์ตœ๊ทผ n๋ฒˆ์งธ ์‹œํ—˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„
getHomeTeam {
  recentExamResult(after:1){
    start
    end
    data{
    resultPerRank {
      rank
      rate {
        total
        fields {
          key
          value
        }
      }
    }
    beginAt
    endAt
    location
    maxPeople
    name
    nbrSubscribers
    }
  }
}
  • getProjectInfo ์—์„œ difficulty ๋ฅผ nullable ํ•˜๊ฒŒ ๋ณ€๊ฒฝ #187
  getProjectInfo(projectName: "Hive Internship") {
    difficulty # nullable
  }
  • cache provider ๋ฅผ redis ์—์„œ in-memory ๋กœ ๋ณ€๊ฒฝ

๋ฒ„๊ทธ ์ˆ˜์ • ๐Ÿ›

  • ์ ‘์†์ด ๋๋‚˜์ง€ ์•Š์€ logtime ์ด ์ œ๋Œ€๋กœ ์ง‘๊ณ„๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ ์ˆ˜์ • #175
  • project session ์˜ difficulty ๊ฐ€ null ์ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ ์ˆ˜์ • #187
  • eval log ์˜ค๋ฅ˜ ์ˆ˜์ • #174 #176
  • leaderboard eval count ์˜ cache ๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋˜ ๋ฌธ์ œ ์ˆ˜์ • #177

์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๐Ÿ“

  • feat: โœจ examResult ์ถ”๊ฐ€ by @niamu01 in #180
  • feat โœจ character by @jpham005 in #181
  • fix: ๐Ÿ› rank๊ฐ’ id์—์„œ ์‹ค์ œ exam rank๋กœ ๋ฐ”๊พธ๊ธฐ by @niamu01 in #185
  • refactor โ™ป๏ธ cache by @jpham005 in #186
  • fix ๐Ÿ› bugs by @jpham005 in #189

Full Changelog: v0.2.0...v0.3.0

v0.2.0

18 Jun 09:12
Compare
Choose a tag to compare
v0.2.0 Pre-release
Pre-release

์‹ ๊ทœ ๊ธฐ๋Šฅ โœจ

  • ๊ฐœ์ธํ™” ์นด๋“œ ์ถ”๊ฐ€
getMyInfo {
  userPreview {
    id
    login
    imgUrl
  }
  recentValidatedTeam {
    status
    lastEventTime
    projectPreview {
      id
      name
      url
    }
  }
  isNewMember
  blackholedAt
  experienceRank
  scoreRank
  evalCountRank
}
  • project ํŽ˜์ด์ง€ ์ถ”๊ฐ€
getProjectInfo(projectName: "webserv") {
  id
  name
  objectives
  skills
  description
  minUserCount
  maxUserCount
  estimateTime
  difficulty
  currRegisteredTeamCount
  closedTeamCount
  averagePassFinalMark
  validatedRate {
    total
    fields {
      key
      value
    }
  }
}
  • landing ํŽ˜์ด์ง€ ์ถ”๊ฐ€
getLanding {
  daysAfterBeginAt
  aliveCount
  blackholedCount
  memberCount
  evalCount
  trendingProject {
     projectPreview {
        id
        name
        url
     }
     rank
     value
  }
}
  • level ์ฆ๊ฐ€ ๊ทธ๋ž˜ํ”„ ์ถ”๊ฐ€
getPersonalGeneral {
   userLevelRecords {
       monthsPassed
       level 
   }
   memberLevelRecords {
       monthsPassed
       level 
   }
}
  • home page (team) ์ฟผ๋ฆฌ ์ถ”๊ฐ€
getHomeTeam {
  currRegisteredCountRanking {
    projectPreview {
      id
      name
      url
    }
    rank
    value
  }
}

๊ธฐ์กด api ๋ณ€๊ฒฝ ์‚ฌํ•ญ โ™ป๏ธ

  • DateTemplate ์— TOTAL ์ถ”๊ฐ€, ์ด์— ๋”ฐ๋ผ total ๊ณผ byDateTemplate ์ด ๋”ฐ๋กœ ์žˆ๋˜ field ๋“ค์„ ๋ชจ๋‘ byDateTemplate ์œผ๋กœ ๋ณ‘ํ•ฉ
  • personal ํŽ˜์ด์ง€ ์ฟผ๋ฆฌ ์ด๋ฆ„ ์ˆ˜์ • (getPersonalGeneralPage => getPersonalGeneral)
  • getPersonalEval ์˜ eval link ์‚ญ์ œ
  • getPersonalEval ์˜ lastComment => recentComment ๋กœ ์ˆ˜์ •
getPersonalEval {
  recentComment
}
  • getPersonalGeneral ์˜ teamInfo ์—์„œ, ์œ ์ €์˜ ํŒ€ ๋ชฉ๋ก์ด ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๊ฐ„์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ๋˜๊ฒŒ ๋ณ€๊ฒฝ
  • getHomeUser ์˜ userCountPerLevel ํ•„๋“œ๋ช… ์ˆ˜์ •
  • getHomeUser ์˜ activeUserCountRecords => aliveUserCountRecords ๋กœ ์ˆ˜์ •
getHomeUser {
  aliveUserCountRecords {
      at
      value
  }
  userCountPerLevel {
      value
      level
  }
}
  • getHomeCoalition ์˜ tigPerCoalition ์„ DateTemplete ์„ ๋ฐ›๋„๋ก ๋ณ€๊ฒฝ
getHomeCoalition {
  tigCountPerCoalitionByDateTemplate(dateTemplate: CURR_MONTH) {
    data {
       value
       coalition {
          name
       }
    }
    start
    end
  }
}
  • getEvalLog ์˜ correctedsReview ๋ฅผ nullable ํ•˜๊ฒŒ ๋ณ€๊ฒฝ
    • ํ”ผํ‰๊ฐ€์ž๊ฐ€ feedback ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ธ”๋ž™ํ™€์„ ๊ฐ€๋Š” ๋“ฑ๋“ฑ์˜ ๊ฒฝ์šฐ์—๋„, ํ‰๊ฐ€ ๊ฒ€์ƒ‰์ด ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ
  • ์บ์‹ฑ ์ถ”๊ฐ€

๋ฒ„๊ทธ ์ˆ˜์ • ๐Ÿ›

  • leaderboard score ์—์„œ ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ • #161
  • bucket ์‚ฌ์šฉํ•˜๋Š” ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ • (byDateTemplate ๊ด€๋ จ ์ฟผ๋ฆฌ๋“ค์ด ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. #164)
  • blackholed user count ๊ฐ€ ์ž˜๋ชป ์ž‘๋™ํ•˜๊ณ  ์žˆ๋˜ ๋ถ€๋ถ„ ์ˆ˜์ •
  • search ์— regex ๋ฌธ๋ฒ• ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ •

์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๐Ÿ“

Full Changelog: v0.1.0...v0.2.0

v0.1.0

10 Jun 07:03
Compare
Choose a tag to compare
v0.1.0 Pre-release
Pre-release

์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๐Ÿ“

  • feat: โœจ User api ์ดˆ์•ˆ ์ž‘์„ฑ by @jpham005 in #3
  • Feat/team api by @jpham005 in #6
  • Feat/scale team api by @jpham005 in #11
  • Feat/bff api by @jpham005 in #14
  • refactor: โ™ป๏ธ common module ์ƒ์„ฑ, ํŒŒ์ผ ๊ตฌ์กฐ ๋ณ€๊ฒฝ by @jpham005 in #16
  • fix: ๐Ÿ› id๊ฐ’ ๋‹ค๋ฅด๊ฒŒ ์„ค์ • by @niamu01 in #18
  • feat: โœจ add more mock data by @niamu01 in #19
  • fix: ๐Ÿ› UserProfile์—์„œ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€, grade ํƒ€์ž…์„ non-null๋กœ ์ˆ˜์ • by @jpham005 in #22
  • feat: โœจscale teams service ๋กœ์ง ์ถ”๊ฐ€ by @niamu01 in #27
  • refactor: โ™ป๏ธ common module by @jpham005 in #29
  • refactor: โ™ป๏ธ mongoose aggregation ๋„์ž…, ์„ฑ๋Šฅ ์ตœ์ ํ™” by @jpham005 in #32
  • feat: โœจ scale team, eval log by @jpham005 in #33
  • fix: ๐Ÿ› temp data ์ง€์›Œ์„œ ์•ˆ๋˜๋˜ ๋ถ€๋ถ„ ์ˆ˜์ • by @jpham005 in #37
  • feat: โœจ project module ์ถ”๊ฐ€ by @jpham005 in #35
  • feat: โœจ ๋ฐฐํฌ ์„ค์ • ๋ฐ ์ž๋™ํ™” by @niamu01 in #39
  • Revert "feat: โœจ ๋ฐฐํฌ ์„ค์ • ๋ฐ ์ž๋™ํ™”" by @niamu01 in #43
  • feat: โœจ githubaction by @niamu01 in #42
  • fix: ๐Ÿ› db connection string local ์šฉ ์œผ๋กœ ์ˆ˜์ • by @jpham005 in #45
  • feat: โœจ score by @jpham005 in #40
  • refactor: โ™ป๏ธ Util.Time ํ™•์žฅ์„ฑ ์žˆ๋„๋ก ๊ฐœํŽธ, ๊ด€๋ จ ๋กœ์ง๋“ค ์ˆ˜์ • by @jpham005 in #48
  • refactor: โ™ป๏ธ docdb ํ˜ธํ™˜์„ฑ ๋ฐ env์—…๋ฐ์ดํŠธ by @niamu01 in #47
  • hotfix: ๐Ÿ› review ๊ธธ์ด ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„ aggregation ์ˆ˜์ • by @jpham005 in #51
  • fix: ๐Ÿ› $first ์—ฐ์‚ฐ์ž ๊ต์ฒด by @jpham005 in #54
  • dev main ์œผ๋กœ ๋ณ‘ํ•ฉ by @jpham005 in #70
  • Style/rename type by @niamu01 in #73
  • feat: โœจ redis, cron ์ถ”๊ฐ€ by @jpham005 in #76
  • chore: ๐Ÿงฑ ์‹ค ์‚ฌ์šฉ db ๋กœ ์ˆ˜์ •, port 80 ์œผ๋กœ ์ˆ˜์ • by @jpham005 in #77
  • feat: โœจ exam api by @jpham005 in #83
  • feat: โœจ teams by @jpham005 in #82
  • feat: โœจ cursus user by @niamu01 in #87
  • refactor: โ™ป๏ธ cursus_user ์—์„œ์˜ ํ”„๋ก ํŠธ ์š”์ฒญ ์‚ฌํ•ญ by @niamu01 in #100
  • fix: ๐Ÿš‘ personalEval์— login, uid๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ by @niamu01 in #101
  • feat: โœจ locations by @niamu01 in #102
  • style: ๐ŸŽจ folder ๊ตฌ์กฐ ๋ณ€๊ฒฝ by @niamu01 in #108
  • refactor โ™ป๏ธ packages by @jpham005 in #116
  • style ๐ŸŽจ naming by @jpham005 in #117
  • refactor โ™ป๏ธ use date range by @niamu01 in #118
  • refactor โ™ป๏ธ modulize by @jpham005 in #123
  • fix: ๐Ÿ› leaderboard ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์„ UserRanking => LeaderboardRanking โ€ฆ by @jpham005 in #124
  • feat โœจ pagination rebased by @niamu01 in #127
  • refactor: โ™ป๏ธ Object Time => Class StatDate by @jpham005 in #128
  • feat โœจ score rank by @jpham005 in #130
  • style ๐ŸŽจ naming convention by @jpham005 in #132
  • refactor โ™ป๏ธ cursus user service by @jpham005 in #134
  • feat โœจ scale team by @jpham005 in #136
  • feat โœจ user state by @jpham005 in #139
  • feat: โœจ ExecutionContext by @niamu01 in #140
  • feat โœจ scale team by @jpham005 in #141
  • refactor โ™ป๏ธ types by @jpham005 in #142
  • feat: โœจ user team info ์ถ”๊ฐ€ by @jpham005 in #143

Full Changelog: https://github.com/42Statistics/42Stat-Backend/commits/v0.1.0