diff --git a/enshi_back/.dockerignore b/enshi_back/.dockerignore new file mode 100644 index 0000000..7d02313 --- /dev/null +++ b/enshi_back/.dockerignore @@ -0,0 +1,8 @@ +main +*.log +*.swp +*.tmp +*.out +node_modules +.idea +.vscode \ No newline at end of file diff --git a/enshi_back/dockerfile b/enshi_back/dockerfile new file mode 100644 index 0000000..03b4638 --- /dev/null +++ b/enshi_back/dockerfile @@ -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" ] \ No newline at end of file diff --git a/enshi_back/global/globalColorsForConsole.go b/enshi_back/global/globalColorsForConsole.go index 1de4c21..e7ea966 100644 --- a/enshi_back/global/globalColorsForConsole.go +++ b/enshi_back/global/globalColorsForConsole.go @@ -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" diff --git a/enshi_back/global/globalVars.go b/enshi_back/global/globalVars.go index b064789..a581119 100644 --- a/enshi_back/global/globalVars.go +++ b/enshi_back/global/globalVars.go @@ -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" diff --git a/enshi_back/global/keys.go b/enshi_back/global/keys.go new file mode 100644 index 0000000..902798e --- /dev/null +++ b/enshi_back/global/keys.go @@ -0,0 +1,5 @@ +package global + +const ContextUserId = "id" +const ContextIsAdmin = "isAdmin" +const ContextTokenData = "tokenData" diff --git a/enshi_back/main.go b/enshi_back/main.go index 72320f0..85fe413 100644 --- a/enshi_back/main.go +++ b/enshi_back/main.go @@ -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") } diff --git a/enshi_back/middleware/adminMiddleware.go b/enshi_back/middleware/adminMiddleware.go index d336e0b..49a1165 100644 --- a/enshi_back/middleware/adminMiddleware.go +++ b/enshi_back/middleware/adminMiddleware.go @@ -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() } } diff --git a/enshi_back/middleware/authMiddleware.go b/enshi_back/middleware/authMiddleware.go index d99a6df..201f08f 100644 --- a/enshi_back/middleware/authMiddleware.go +++ b/enshi_back/middleware/authMiddleware.go @@ -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() } diff --git a/enshi_back/middleware/getters/claims.go b/enshi_back/middleware/getters/claims.go index c074cd4..371650d 100644 --- a/enshi_back/middleware/getters/claims.go +++ b/enshi_back/middleware/getters/claims.go @@ -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") diff --git a/enshi_back/middleware/getters/userId.go b/enshi_back/middleware/getters/userId.go index f4a1319..7afaead 100644 --- a/enshi_back/middleware/getters/userId.go +++ b/enshi_back/middleware/getters/userId.go @@ -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") diff --git a/enshi_back/middleware/keys.go b/enshi_back/middleware/keys.go deleted file mode 100644 index 3035b5e..0000000 --- a/enshi_back/middleware/keys.go +++ /dev/null @@ -1,5 +0,0 @@ -package middleware - -var ContextUserId = "id" -var ContextIsAdmin = "isAdmin" -var ContextTokenData = "tokenData" diff --git a/enshi_back/routes/login.go b/enshi_back/routes/authRoutes/login.go similarity index 98% rename from enshi_back/routes/login.go rename to enshi_back/routes/authRoutes/login.go index 6d4e3a7..212cb43 100644 --- a/enshi_back/routes/login.go +++ b/enshi_back/routes/authRoutes/login.go @@ -1,4 +1,4 @@ -package routes +package authRoutes import ( "context" diff --git a/enshi_back/routes/registerUser.go b/enshi_back/routes/authRoutes/registerUser.go similarity index 99% rename from enshi_back/routes/registerUser.go rename to enshi_back/routes/authRoutes/registerUser.go index ffdc7cd..79b994f 100644 --- a/enshi_back/routes/registerUser.go +++ b/enshi_back/routes/authRoutes/registerUser.go @@ -1,4 +1,4 @@ -package routes +package authRoutes import ( "context" diff --git a/enshi_back/routes/createPost.go b/enshi_back/routes/postsRoutes/createPost.go similarity index 97% rename from enshi_back/routes/createPost.go rename to enshi_back/routes/postsRoutes/createPost.go index 65dfc49..2d3b221 100644 --- a/enshi_back/routes/createPost.go +++ b/enshi_back/routes/postsRoutes/createPost.go @@ -1,4 +1,4 @@ -package routes +package postsRoutes import ( "context" diff --git a/enshi_back/routes/deletePost.go b/enshi_back/routes/postsRoutes/deletePost.go similarity index 94% rename from enshi_back/routes/deletePost.go rename to enshi_back/routes/postsRoutes/deletePost.go index 29867e5..0ac4395 100644 --- a/enshi_back/routes/deletePost.go +++ b/enshi_back/routes/postsRoutes/deletePost.go @@ -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 diff --git a/enshi_back/routes/postsRoutes/getPost.go b/enshi_back/routes/postsRoutes/getPost.go new file mode 100644 index 0000000..ab661a6 --- /dev/null +++ b/enshi_back/routes/postsRoutes/getPost.go @@ -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) + +} diff --git a/enshi_back/utils/routesSetup.go b/enshi_back/utils/routesSetup.go index 9bc1057..556dedd 100644 --- a/enshi_back/utils/routesSetup.go +++ b/enshi_back/utils/routesSetup.go @@ -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 } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 793629c..0000000 --- a/package-lock.json +++ /dev/null @@ -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" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 82a5d97..0000000 --- a/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "@tanstack/react-query": "^5.59.0", - "axios": "^1.7.7" - } -}