Skip to content

Commit

Permalink
Merge pull request #6 from RECYTHNG/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
haiser1 authored Jun 10, 2024
2 parents a45a2bc + 45b9fce commit 0f62873
Show file tree
Hide file tree
Showing 10 changed files with 175 additions and 0 deletions.
42 changes: 42 additions & 0 deletions docs/swagger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ tags:
description: Endpoint for admin approval task
- name: user achievements
description: Endpoint for user get achievement
- name: leaderboard

paths:
/register:
Expand Down Expand Up @@ -3995,6 +3996,47 @@ paths:
example: https://res.cloudinary.com/dlbbsdd3a/image/upload/v1717758300/recything/about-us/kan9fdnp7h6o4hfclghm.png
'404':
description: Category name not found
/leaderboard:
get:
tags:
- leaderboards
summary: Get leaderboard
description: Endpoint for user or admin get leaderboard
operationId: getLeaderboard
security:
- Bearer: []
responses:
'200':
description: ok
content:
application/json:
schema:
properties:
code:
type: integer
example: 200
message:
type: string
example: ok
data:
type: array
items:
properties:
id:
type: string
example: USR0001
name:
type: string
example: John Doe
picture_url:
type: string
example: https://res.cloudinary.com/dlbbsdd3a/image/upload/v1717758300/recything/about-us/kan9fdnp7h6o4hfclghm.png
point:
type: integer
example: 1000
badge:
type: string
example: https://res.cloudinary.com/dymhvau8n/image/upload/v1717758679/achievement_badge/cq2n246e6twuksnia62t.png

components:
schemas:
Expand Down
13 changes: 13 additions & 0 deletions internal/leaderboard/dto/leaderboard_response.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dto

type DataLeaderboard struct {
Id string `json:"id"`
Name string `json:"name"`
PictureURL string `json:"picture_url"`
Point int `json:"point"`
Badge string `json:"badge"`
}

type LeaderboardResponse struct {
DataLeaderboard []*DataLeaderboard `json:"data_leaderboard"`
}
7 changes: 7 additions & 0 deletions internal/leaderboard/handler/leaderboard_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package handler

import "github.com/labstack/echo/v4"

type LeaderboardHandler interface {
GetLeaderboardHandler(c echo.Context) error
}
27 changes: 27 additions & 0 deletions internal/leaderboard/handler/leaderboard_handler_impl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package handler

import (
"net/http"

"github.com/labstack/echo/v4"
"github.com/sawalreverr/recything/internal/helper"
"github.com/sawalreverr/recything/internal/leaderboard/usecase"
)

type LeaderboardHandlerImpl struct {
LeaderboardUsecase usecase.LeaderboardUsecase
}

func NewLeaderboardHandler(leaderboardUsecase usecase.LeaderboardUsecase) LeaderboardHandler {
return LeaderboardHandlerImpl{LeaderboardUsecase: leaderboardUsecase}
}

func (handler LeaderboardHandlerImpl) GetLeaderboardHandler(c echo.Context) error {
leaderboard, err := handler.LeaderboardUsecase.GetLeaderboardUsecase()
if err != nil {
return helper.ErrorHandler(c, http.StatusInternalServerError, "internal server error, detail : "+err.Error())
}

responseData := helper.ResponseData(http.StatusOK, "data successfully retrieved", leaderboard.DataLeaderboard)
return c.JSON(http.StatusOK, responseData)
}
7 changes: 7 additions & 0 deletions internal/leaderboard/repository/leaderboard_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package repository

import user "github.com/sawalreverr/recything/internal/user"

type LeaderboardRepository interface {
GetLeaderboard() (*[]user.User, error)
}
25 changes: 25 additions & 0 deletions internal/leaderboard/repository/leaderboard_repository_impl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package repository

import (
"github.com/sawalreverr/recything/internal/database"
user "github.com/sawalreverr/recything/internal/user"
)

type LeaderboardRepositoryImpl struct {
DB database.Database
}

func NewLeaderboardRepository(db database.Database) *LeaderboardRepositoryImpl {
return &LeaderboardRepositoryImpl{DB: db}
}

func (repository *LeaderboardRepositoryImpl) GetLeaderboard() (*[]user.User, error) {
var users []user.User
if err := repository.DB.GetDB().
Order("point desc").
Limit(10).
Find(&users).Error; err != nil {
return nil, err
}
return &users, nil
}
7 changes: 7 additions & 0 deletions internal/leaderboard/usecase/leaderboard_usecase.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package usecase

import "github.com/sawalreverr/recything/internal/leaderboard/dto"

type LeaderboardUsecase interface {
GetLeaderboardUsecase() (*dto.LeaderboardResponse, error)
}
32 changes: 32 additions & 0 deletions internal/leaderboard/usecase/leaderboard_usecase_impl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package usecase

import (
"github.com/sawalreverr/recything/internal/leaderboard/dto"
"github.com/sawalreverr/recything/internal/leaderboard/repository"
)

type LeaderboardUsecaseImpl struct {
LeaderboardRepository repository.LeaderboardRepository
}

func NewLeaderboardUsecase(leaderboardRepository repository.LeaderboardRepository) *LeaderboardUsecaseImpl {
return &LeaderboardUsecaseImpl{LeaderboardRepository: leaderboardRepository}
}

func (usecase *LeaderboardUsecaseImpl) GetLeaderboardUsecase() (*dto.LeaderboardResponse, error) {
users, err := usecase.LeaderboardRepository.GetLeaderboard()
if err != nil {
return nil, err
}
var dataLeaderboard []*dto.DataLeaderboard
for _, user := range *users {
dataLeaderboard = append(dataLeaderboard, &dto.DataLeaderboard{
Id: user.ID,
Name: user.Name,
PictureURL: user.PictureURL,
Point: int(user.Point),
Badge: user.Badge,
})
}
return &dto.LeaderboardResponse{DataLeaderboard: dataLeaderboard}, nil
}
3 changes: 3 additions & 0 deletions internal/server/echo_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ func (s *echoServer) Start() {
// About-us handler
s.aboutUsHandler()

// leaderboard handler
s.leaderboardHandler()

serverPORT := fmt.Sprintf(":%d", s.conf.Server.Port)
s.app.Logger.Fatal(s.app.Start(serverPORT))
}
12 changes: 12 additions & 0 deletions internal/server/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import (
faqHandler "github.com/sawalreverr/recything/internal/faq/handler"
faqRepo "github.com/sawalreverr/recything/internal/faq/repository"
faqUsecase "github.com/sawalreverr/recything/internal/faq/usecase"
leaderboardHandler "github.com/sawalreverr/recything/internal/leaderboard/handler"
leaderboardRepo "github.com/sawalreverr/recything/internal/leaderboard/repository"
leaderboardUsecase "github.com/sawalreverr/recything/internal/leaderboard/usecase"
"github.com/sawalreverr/recything/internal/middleware"
reminaiHandler "github.com/sawalreverr/recything/internal/remin-ai/handler"
reminaiUsecase "github.com/sawalreverr/recything/internal/remin-ai/usecase"
Expand Down Expand Up @@ -367,3 +370,12 @@ func (s *echoServer) aboutUsHandler() {
// Get about us by category
s.gr.GET("/about-us/category", handler.GetAboutUsByCategory, UserMiddleware)
}

func (s *echoServer) leaderboardHandler() {
repository := leaderboardRepo.NewLeaderboardRepository(s.db)
usecase := leaderboardUsecase.NewLeaderboardUsecase(repository)
handler := leaderboardHandler.NewLeaderboardHandler(usecase)

// Get leaderboard
s.gr.GET("/leaderboard", handler.GetLeaderboardHandler, AllRoleMiddleware)
}

0 comments on commit 0f62873

Please sign in to comment.