Skip to content

Commit

Permalink
Merge pull request #5 from cirnum/feature/server-impl
Browse files Browse the repository at this point in the history
server support added to add multiple cluster
  • Loading branch information
manojown authored May 15, 2023
2 parents 814bf29 + e4be269 commit 37682a2
Show file tree
Hide file tree
Showing 8 changed files with 278 additions and 1 deletion.
90 changes: 90 additions & 0 deletions server/app/controllers/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package controllers

import (
"context"

_ "github.com/cirnum/strain-hub/server/app/models"
"github.com/cirnum/strain-hub/server/app/utils"
"github.com/google/uuid"

"github.com/cirnum/strain-hub/server/db"
"github.com/cirnum/strain-hub/server/db/models"
"github.com/cirnum/strain-hub/server/pkg/constants"
"github.com/gofiber/fiber/v2"
)

// To Get all the Server
func GetAllServer(c *fiber.Ctx) error {
ctx := context.Background()
pagination := utils.GetPagination(c)
listServer, err := db.Provider.ListServer(ctx, &pagination)

if err != nil {
return utils.ResponseError(c, err, "Failed to add the server.", 0)
}
return utils.ResponseSuccess(c, listServer, "Server added successfully.", 0)

}

// To Update server
func UpdateServer(c *fiber.Ctx) error {
ctx := context.Background()
serverPayload := &models.Server{}

if err := c.BodyParser(serverPayload); err != nil {
return utils.ResponseError(c, err, constants.InvalidBody, fiber.StatusInternalServerError)
}
updatedServer, err := db.Provider.UpdateServer(ctx, *serverPayload)

if err != nil {
return utils.ResponseError(c, err, "Failed to update the server.", 0)
}
return utils.ResponseSuccess(c, updatedServer, "Server Updated successfully.", 0)

}

func AddServer(c *fiber.Ctx) error {

ctx := context.Background()
serverPayload := &models.Server{}

if err := c.BodyParser(serverPayload); err != nil {
return utils.ResponseError(c, err, constants.InvalidBody, fiber.StatusInternalServerError)
}
serverPayload.ID = uuid.New().String()
jwtToken, err := utils.GenerateTokenKey(*serverPayload)

if err != nil {
return utils.ResponseError(c, err, err.Error(), fiber.StatusInternalServerError)
}

serverPayload.Token = jwtToken
server, err := db.Provider.AddServer(ctx, *serverPayload)

if err != nil {
return utils.ResponseError(c, err, err.Error(), fiber.StatusInternalServerError)
}
return utils.ResponseSuccess(c, server, "Server added successfully.", fiber.StatusOK)
}

func GetServerById(c *fiber.Ctx) error {
ctx := context.Background()
id := c.Params("id")

server, err := db.Provider.GetRequestById(ctx, id)
if err != nil {
return utils.ResponseError(c, err, err.Error(), fiber.StatusInternalServerError)
}
return utils.ResponseSuccess(c, server, "Server retrieved successfully.", fiber.StatusOK)
}

func DeleteServerById(c *fiber.Ctx) error {
ctx := context.Background()
id := c.Params("id")

err := db.Provider.DeleteServerById(ctx, id)
if err != nil {
return utils.ResponseError(c, err, err.Error(), fiber.StatusInternalServerError)
}
return utils.ResponseSuccess(c, nil, "Fetched Server lists.", fiber.StatusOK)
}
13 changes: 13 additions & 0 deletions server/app/utils/jwt.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,19 @@ func GenerateJWT(user models.User) (string, error) {
return token, nil
}

func GenerateTokenKey(server models.Server) (string, error) {
atClaims := jwt.MapClaims{}
atClaims["authorized"] = true
atClaims["id"] = server.ID
atClaims["user"] = server.UserID

at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
token, err := at.SignedString([]byte(os.Getenv("CLIENT_SECRET_KEY")))
if err != nil {
return "", err
}
return token, nil
}
func AutheticateRequest(r *http.Request) (bool, models.User) {
var user models.User
jwtToken := r.Header.Get("Authorization")
Expand Down
34 changes: 34 additions & 0 deletions server/db/models/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package models

// type Request struct {
// ID string `gorm:"primaryKey;type:char(36)" json:"id,omitempty"`
// UserID string `json:"userID,omitempty"`
// URL string `json:"url"`
// Requests int64 `json:"requests"`
// Time int `json:"time"`
// Clients int `json:"clients"`
// Headers string `json:"headers"`
// Params string `json:"params"`
// KeepAlive bool `json:"keepAlive"`
// Method string `json:"method"`
// Ips string `json:"ips" bson:"ips"`
// PostData string `json:"postData,omitempty"`
// UpdatedAt int64 `json:"updated_at" bson:"updated_at"`
// CreatedAt int64 `json:"created_at" bson:"created_at"`
// }
type Server struct {
ID string `gorm:"primaryKey;type:char(36)" json:"id,omitempty"`
UserID string `json:"userID,omitempty"`
IP string `json:"ip"`
Port int64 `json:"port"`
Token string `json:"token"`
Active bool `json:"active"`
Interval int `json:"interval"`
UpdatedAt int64 `json:"updated_at" bson:"updated_at"`
CreatedAt int64 `json:"created_at" bson:"created_at"`
}

type ServerList struct {
Pagination *Pagination `json:"pagination"`
Data []Server `json:"data"`
}
11 changes: 11 additions & 0 deletions server/db/providers/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,15 @@ type Provider interface {
AddLoadByRequestId(ctx context.Context, load models.Loadster) (models.Loadster, error)
// Get load
GetLoadByRequestId(ctx context.Context, pagination models.Pagination, requestId string) ([]models.Loadster, error)
// Add server
AddServer(ctx context.Context, server models.Server) (models.Server, error)
// UpdateUser to update user information in database
UpdateServer(ctx context.Context, server models.Server) (models.Server, error)
// DeleteUser to delete user information from database
DeleteServerById(ctx context.Context, id string) error
// ListUsers to get list of users from database
ListServer(ctx context.Context, pagination *models.Pagination) (*models.ServerList, error)
// GetuserByEmail
GetServerById(ctx context.Context, email string) (models.Server, error)
// Update server
}
2 changes: 1 addition & 1 deletion server/db/providers/sql/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func NewProvider() (*provider, error) {
logrus.Debug("Failed to drop phone number constraint:", err)
}

err = sqlDB.AutoMigrate(&models.User{}, &models.Request{}, &models.Loadster{})
err = sqlDB.AutoMigrate(&models.User{}, &models.Request{}, &models.Loadster{}, &models.Server{})
if err != nil {
return nil, err
}
Expand Down
98 changes: 98 additions & 0 deletions server/db/providers/sql/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package sql

import (
"context"
"errors"
"time"

"github.com/cirnum/strain-hub/server/db/models"
"github.com/google/uuid"
)

// AddServer to update user information in database
func (p *provider) AddServer(ctx context.Context, server models.Server) (models.Server, error) {
if server.ID == "" {
server.ID = uuid.New().String()
}
server.Token = uuid.New().String()
server.CreatedAt = time.Now().Unix()
server.UpdatedAt = time.Now().Unix()

result := p.db.Create(&server)

if result.Error != nil {
return server, result.Error
}

return server, nil
}

// AddServer to update user information in database
func (p *provider) UpdateServer(ctx context.Context, server models.Server) (models.Server, error) {
server.UpdatedAt = time.Now().Unix()
result := p.db.Model(&server).Where("id = ?", server.ID).Update("UpdatedAt", server.UpdatedAt)
if result.Error != nil {
return server, result.Error
}
return server, nil
}

// ListServer to get list of users from database
func (p *provider) ListServer(ctx context.Context, pagination *models.Pagination) (*models.ServerList, error) {
var servers []models.Server
result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&servers)
if result.Error != nil {
return nil, result.Error
}

serverList := []models.Server{}
for _, request := range servers {
serverList = append(serverList, request)
}

var total int64
totalRes := p.db.Model(&models.Request{}).Count(&total)
if totalRes.Error != nil {
return nil, totalRes.Error
}

paginationClone := pagination
paginationClone.Total = total

return &models.ServerList{
Pagination: paginationClone,
Data: serverList,
}, nil
}

// GetServerById to update user information in database
func (p *provider) GetServerById(ctx context.Context, id string) (models.Server, error) {
var server models.Server

if id == "" {
return server, errors.New("Request id missing.")
}

result := p.db.Where("id = ?", id).First(&server)
if result.Error != nil {
return server, result.Error
}

return server, nil
}

// DeleteServerById Request by id to update user information in database
func (p *provider) DeleteServerById(ctx context.Context, id string) error {

if id == "" {
return errors.New("Request id missing.")
}

result := p.db.Delete(&models.Server{
ID: id,
})
if result.Error != nil {
return result.Error
}
return nil
}
11 changes: 11 additions & 0 deletions server/pkg/middleware/jwt.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,17 @@ func JWTProtected() func(*fiber.Ctx) error {
return jwtMiddleware.New(config)
}

func JWTProtectedClient() func(*fiber.Ctx) error {
// Create config for JWT authentication middleware.
config := jwtMiddleware.Config{
SigningKey: []byte(os.Getenv("CLIENT_SECRET_KEY")),
ContextKey: "jwt", // used in private routes
ErrorHandler: jwtError,
}

return jwtMiddleware.New(config)
}

func jwtError(c *fiber.Ctx, err error) error {
// Return status 401 and failed authentication error.
if err.Error() == "Missing or malformed JWT" {
Expand Down
20 changes: 20 additions & 0 deletions server/pkg/routes/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package routes

import (
"github.com/cirnum/strain-hub/server/app/controllers"
"github.com/cirnum/strain-hub/server/pkg/middleware"
"github.com/gofiber/fiber/v2"
)

// PrivateRoutes func for describe group of private routes.
func ServerRoutes(a *fiber.App) {
// Create routes group.
server := "/server"
route := a.Group("/api/v1")
// user routes
route.Post(server, middleware.JWTProtected(), controllers.AddServer)
route.Get(server, middleware.JWTProtected(), controllers.GetAllServer)
route.Get(server+"/:id", middleware.JWTProtected(), controllers.GetServerById)
route.Delete(server+"/:id", middleware.JWTProtected(), controllers.DeleteServerById)
route.Put(server, middleware.JWTProtectedClient(), controllers.UpdateServer)
}

1 comment on commit 37682a2

@vercel
Copy link

@vercel vercel bot commented on 37682a2 May 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.