Dockerfile was added | admin middleware | get post route

This commit is contained in:
Max 2024-11-12 21:45:18 +03:00
parent c74b71163a
commit 7a507192a4
19 changed files with 138 additions and 215 deletions

8
enshi_back/.dockerignore Normal file
View File

@ -0,0 +1,8 @@
main
*.log
*.swp
*.tmp
*.out
node_modules
.idea
.vscode

15
enshi_back/dockerfile Normal file
View File

@ -0,0 +1,15 @@
FROM golang:1.23.3-alpine3.20
WORKDIR /enshi_app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o enshi_bin .
EXPOSE 9876
CMD [ "./enshi_bin" ]

View File

@ -1,11 +1,11 @@
package global
var ResetColor = "\033[0m"
var RedColor = "\033[31m"
var GreenColor = "\033[32m"
var YellowColor = "\033[33m"
var BlueColor = "\033[34m"
var MagentaColor = "\033[35m"
var CyanColor = "\033[36m"
var GrayColor = "\033[37m"
var WhiteColor = "\033[97m"
const ResetColor = "\033[0m"
const RedColor = "\033[31m"
const GreenColor = "\033[32m"
const YellowColor = "\033[33m"
const BlueColor = "\033[34m"
const MagentaColor = "\033[35m"
const CyanColor = "\033[36m"
const GrayColor = "\033[37m"
const WhiteColor = "\033[97m"

View File

@ -1,6 +1,8 @@
package global
var PathForCookies = "/"
var DomainForCookies = "localhost"
var SecureForCookies = false
var HttpOnlyForCookies = false
const PathForCookies = "/"
const DomainForCookies = "localhost"
const SecureForCookies = false
const HttpOnlyForCookies = false
const GinWorkPath = "localhost:9876"

View File

@ -0,0 +1,5 @@
package global
const ContextUserId = "id"
const ContextIsAdmin = "isAdmin"
const ContextTokenData = "tokenData"

View File

@ -5,6 +5,7 @@ import (
db_repo "enshi/db/go_queries"
"enshi/db_connection"
"enshi/env"
"enshi/global"
utils "enshi/utils"
"fmt"
@ -47,7 +48,7 @@ func main() {
return
}
router.Run("localhost:9876")
router.Run(global.GinWorkPath)
fmt.Printf("Hey!, %v", "you")
}

View File

@ -1,10 +1,40 @@
package middleware
import "github.com/gin-gonic/gin"
import (
"context"
rest_api_stuff "enshi/REST_API_stuff"
db_repo "enshi/db/go_queries"
"enshi/db_connection"
"enshi/middleware/getters"
"fmt"
"github.com/gin-gonic/gin"
)
func AdminMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
userId, err := getters.GetUserIdFromContext(c)
if err != nil || userId == 0 {
rest_api_stuff.BadRequestAnswer(c, err)
c.Abort()
}
user, err :=
db_repo.New(db_connection.Dbx).
GetUserById(context.Background(), userId)
if err != nil || user.UserID == 0 {
rest_api_stuff.BadRequestAnswer(c, err)
c.Abort()
}
if !user.IsAdmin {
rest_api_stuff.UnauthorizedAnswer(c, fmt.Errorf("not allowed"))
c.Abort()
}
c.Next()
}
}

View File

@ -2,6 +2,7 @@ package middleware
import (
"enshi/auth"
"enshi/global"
"net/http"
"github.com/gin-gonic/gin"
@ -28,8 +29,8 @@ func AuthMiddleware() gin.HandlerFunc {
// }
// Claims -> data stored in token
c.Set(ContextUserId, cookieClimes["id"])
c.Set(ContextTokenData, cookieClimes)
c.Set(global.ContextUserId, cookieClimes["id"])
c.Set(global.ContextTokenData, cookieClimes)
c.Next()
}

View File

@ -3,7 +3,6 @@ package getters
import (
"enshi/auth"
"enshi/global"
"enshi/middleware"
"fmt"
"strconv"
@ -14,7 +13,7 @@ import (
func GetClaimsFromContext(c *gin.Context) (auth.UserInfoJWT, error) {
var UserInfo auth.UserInfoJWT
claims, exists := c.Get(middleware.ContextTokenData)
claims, exists := c.Get(global.ContextTokenData)
if !exists {
return auth.UserInfoJWT{}, fmt.Errorf("error getting user id")

View File

@ -1,7 +1,7 @@
package getters
import (
"enshi/middleware"
"enshi/global"
"fmt"
"strconv"
@ -9,7 +9,7 @@ import (
)
func GetUserIdFromContext(c *gin.Context) (int64, error) {
userId, exists := c.Get(middleware.ContextUserId)
userId, exists := c.Get(global.ContextUserId)
if !exists {
return -1, fmt.Errorf("error getting user id")

View File

@ -1,5 +0,0 @@
package middleware
var ContextUserId = "id"
var ContextIsAdmin = "isAdmin"
var ContextTokenData = "tokenData"

View File

@ -1,4 +1,4 @@
package routes
package authRoutes
import (
"context"

View File

@ -1,4 +1,4 @@
package routes
package authRoutes
import (
"context"

View File

@ -1,4 +1,4 @@
package routes
package postsRoutes
import (
"context"

View File

@ -1,4 +1,4 @@
package routes
package postsRoutes
import (
"context"
@ -13,7 +13,7 @@ import (
func DeletePost(c *gin.Context) {
var deletePostId struct {
postId int64
PostId int64
}
if err := c.BindJSON(&deletePostId); err != nil {
@ -28,7 +28,7 @@ func DeletePost(c *gin.Context) {
}
query := db_repo.New(db_connection.Dbx)
post, err := query.GetPostsByPostId(context.Background(), deletePostId.postId)
post, err := query.GetPostsByPostId(context.Background(), deletePostId.PostId)
if err != nil {
rest_api_stuff.InternalErrorAnswer(c, err)
return
@ -41,7 +41,7 @@ func DeletePost(c *gin.Context) {
// TODO: Add block of code, so admin could delete anything
err = query.DeletePostByPostId(context.Background(), deletePostId.postId)
err = query.DeletePostByPostId(context.Background(), deletePostId.PostId)
if err != nil {
rest_api_stuff.InternalErrorAnswer(c, err)
return

View File

@ -0,0 +1,34 @@
package postsRoutes
import (
"context"
rest_api_stuff "enshi/REST_API_stuff"
db_repo "enshi/db/go_queries"
"enshi/db_connection"
"net/http"
"github.com/gin-gonic/gin"
)
func GetPost(c *gin.Context) {
var postParams struct {
PostId int64
}
if err := c.BindJSON(&postParams); err != nil {
rest_api_stuff.BadRequestAnswer(c, err)
return
}
postData, err :=
db_repo.New(db_connection.Dbx).
GetPostsByPostId(context.Background(), postParams.PostId)
if err != nil {
rest_api_stuff.InternalErrorAnswer(c, err)
return
}
c.IndentedJSON(http.StatusOK, postData)
}

View File

@ -3,6 +3,8 @@ package utils
import (
"enshi/middleware"
"enshi/routes"
"enshi/routes/authRoutes"
"enshi/routes/postsRoutes"
"net/http"
"strings"
@ -14,6 +16,10 @@ func testCookie(c *gin.Context) {
c.IndentedJSON(http.StatusOK, gin.H{"token": "SLESAR' U STASA " + strings.Split(cock, "_")[0]})
}
func testAdmin(c *gin.Context) {
c.IndentedJSON(http.StatusOK, gin.H{"message": "you are an admin, congrats!"})
}
func SetupRotes(g *gin.Engine) error {
g.Use(middleware.CORSMiddleware())
@ -22,19 +28,23 @@ func SetupRotes(g *gin.Engine) error {
freeGroup.GET("getCookie", testCookie)
freeGroup.POST("login", routes.Login)
freeGroup.POST("registerUser", routes.RegisterUser)
freeGroup.POST("login", authRoutes.Login)
freeGroup.POST("registerUser", authRoutes.RegisterUser)
// Auth group routes
authGroup := g.Group("/")
authGroup.Use(middleware.AuthMiddleware())
authGroup.POST("createPost", routes.CreatePost)
authGroup.POST("deletePost", routes.DeletePost)
authGroup.GET("getPost", postsRoutes.GetPost)
authGroup.POST("createPost", postsRoutes.CreatePost)
authGroup.POST("deletePost", postsRoutes.DeletePost)
authGroup.POST("changeUserProfile", routes.ChangeUserProfile)
adminGroup := authGroup.Group("/admin/")
adminGroup.Use(middleware.AdminMiddleware())
authGroup.POST("changeUserProfile", routes.ChangeUserProfile)
adminGroup.GET("testAdmin", testAdmin)
return nil
}

171
package-lock.json generated
View File

@ -1,171 +0,0 @@
{
"name": "Enshi",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@tanstack/react-query": "^5.59.0",
"axios": "^1.7.7"
}
},
"node_modules/@tanstack/query-core": {
"version": "5.59.0",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.0.tgz",
"integrity": "sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@tanstack/react-query": {
"version": "5.59.0",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.0.tgz",
"integrity": "sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA==",
"license": "MIT",
"dependencies": {
"@tanstack/query-core": "5.59.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"react": "^18 || ^19"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.7.7",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT",
"peer": true
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/react": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
}
}
}
}

View File

@ -1,6 +0,0 @@
{
"dependencies": {
"@tanstack/react-query": "^5.59.0",
"axios": "^1.7.7"
}
}