Skip to content

Commit 7999d0d

Browse files
Merge pull request #426 from factly/change-validate-token-routes
feat: add new validation routes
2 parents f8a29b6 + 4204087 commit 7999d0d

File tree

8 files changed

+192
-6
lines changed

8 files changed

+192
-6
lines changed

docker-compose.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,8 @@ services:
194194
restart: on-failure
195195
networks:
196196
- kavach
197-
198197
###########################################################################
199-
####### KAVACH #######
198+
####### KAVACH #######
200199
###########################################################################
201200
kavach-server:
202201
depends_on:

server/action/organisation/application/route.go

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func Router() chi.Router {
3131
r.Post("/", create)
3232
r.Get("/", list)
3333
r.Get("/default", listDefault)
34+
r.Post("/token/validate", validate_token)
3435
r.Get("/{application_slug}/access", access)
3536
r.Route("/{application_id}", func(r chi.Router) {
3637
r.Get("/", details)

server/action/organisation/application/space/route.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
package space
22

33
import (
4+
"github.com/factly/kavach-server/action/organisation/application/space/policy"
45
"github.com/factly/kavach-server/action/organisation/application/space/roles"
56
"github.com/factly/kavach-server/action/organisation/application/space/token"
67
"github.com/factly/kavach-server/action/organisation/application/space/user"
7-
"github.com/factly/kavach-server/action/organisation/application/space/policy"
88
"github.com/go-chi/chi"
99
)
1010

1111
const namespace string = "spaces"
1212
const appNamespace string = "applications"
13+
1314
// Router organisation
1415
func Router() chi.Router {
1516
r := chi.NewRouter()
1617

1718
r.Post("/", create)
1819
r.Get("/", list)
20+
r.Post("/token/validate", validate_token)
1921
r.Route("/{space_id}", func(r chi.Router) {
2022
r.Mount("/users", user.Router())
2123
r.Delete("/", delete)

server/action/organisation/application/space/token/validate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func Validate(w http.ResponseWriter, r *http.Request) {
3232
spaceToken := model.SpaceToken{}
3333
err = model.DB.Model(&model.SpaceToken{}).Where(&model.SpaceToken{
3434
Token: tokenBody.Token,
35-
}).Find(&spaceToken).Error
35+
}).First(&spaceToken).Error
3636
if err != nil {
3737
loggerx.Error(err)
3838
errorx.Render(w, errorx.Parser(errorx.Unauthorized()))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package space
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
9+
"github.com/factly/kavach-server/model"
10+
"github.com/factly/x/errorx"
11+
"github.com/factly/x/loggerx"
12+
"github.com/factly/x/renderx"
13+
"github.com/factly/x/validationx"
14+
)
15+
16+
func validate_token(w http.ResponseWriter, r *http.Request) {
17+
18+
tokenBody := model.ValidationBody{}
19+
err := json.NewDecoder(r.Body).Decode(&tokenBody)
20+
if err != nil {
21+
loggerx.Error(err)
22+
errorx.Render(w, errorx.Parser(errorx.DecodeError()))
23+
return
24+
}
25+
26+
validationError := validationx.Check(tokenBody)
27+
if validationError != nil {
28+
loggerx.Error(errors.New("validation error"))
29+
errorx.Render(w, validationError)
30+
return
31+
}
32+
fmt.Println(tokenBody.Token)
33+
34+
spaceToken := model.SpaceToken{}
35+
err = model.DB.Model(&model.SpaceToken{}).Where(&model.SpaceToken{
36+
Token: tokenBody.Token,
37+
}).First(&spaceToken).Error
38+
39+
if err != nil {
40+
loggerx.Error(err)
41+
errorx.Render(w, errorx.Parser(errorx.GetMessage("invalid space token", 403)))
42+
return
43+
}
44+
45+
renderx.JSON(w, http.StatusOK, map[string]interface{}{"valid": true})
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package application
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"net/http"
7+
8+
"github.com/factly/kavach-server/model"
9+
"github.com/factly/x/errorx"
10+
"github.com/factly/x/loggerx"
11+
"github.com/factly/x/renderx"
12+
"github.com/factly/x/validationx"
13+
"gorm.io/gorm"
14+
)
15+
16+
// validationBody request body
17+
type validationBody struct {
18+
Token string `json:"token" validate:"required"`
19+
}
20+
21+
// Validate - validate_token application token
22+
// @Summary Show a application token
23+
// @Description validate_token application token
24+
// @Tags OrganisationApplicationsTokens
25+
// @ID validate_token-organisation-application-token
26+
// @Produce json
27+
// @Param X-Organisation header string true "Organisation ID"
28+
// @Param application_slug path string true "Application Slug"
29+
// @Param ValidationBody body ValidationBody true "Validation Body"
30+
// @Success 200 {object} model.Application
31+
// @Router /applications/{application_id}/tokens/validate_token [post]
32+
func validate_token(w http.ResponseWriter, r *http.Request) {
33+
//parse applicaion_id
34+
35+
tokenBody := validationBody{}
36+
err := json.NewDecoder(r.Body).Decode(&tokenBody)
37+
if err != nil {
38+
loggerx.Error(err)
39+
errorx.Render(w, errorx.Parser(errorx.DecodeError()))
40+
return
41+
}
42+
43+
validationError := validationx.Check(tokenBody)
44+
if validationError != nil {
45+
loggerx.Error(errors.New("validation error"))
46+
errorx.Render(w, validationError)
47+
return
48+
}
49+
50+
appToken := model.ApplicationToken{}
51+
// Fetch all tokens for a application
52+
// to need to specify the organisation id as token itself is unique
53+
err = model.DB.Model(&model.ApplicationToken{}).Where(&model.ApplicationToken{
54+
Token: tokenBody.Token,
55+
}).First(&appToken).Error
56+
57+
if err != nil {
58+
loggerx.Error(err)
59+
if err == gorm.ErrRecordNotFound {
60+
renderx.JSON(w, http.StatusUnauthorized, map[string]interface{}{"valid": false})
61+
return
62+
}
63+
errorx.Render(w, errorx.Parser(errorx.InternalServerError()))
64+
return
65+
}
66+
67+
renderx.JSON(w, http.StatusOK, map[string]interface{}{"valid": true})
68+
}

server/action/organisation/route.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@ import (
1111
)
1212

1313
type orgWithRole struct {
14-
Organisation model.Organisation `json:"organisation"`
15-
Permission model.OrganisationUser `json:"permission"`
14+
Organisation model.Organisation `json:"organisation"`
15+
Permission model.OrganisationUser `json:"permission"`
1616
AllApplications []model.Application `json:"applications,omitempty"`
1717
}
1818

1919
var userContext model.ContextKey = "organisation_user"
20+
2021
const namespace string = "organisations"
22+
2123
// Router organisation
2224
func Router() chi.Router {
2325
r := chi.NewRouter()
2426

2527
r.Get("/my", list)
2628
r.Post("/", create)
29+
r.Post("/token/validate", validate_token)
2730
// r.Get("/", all)
2831
r.Route("/{organisation_id}", func(r chi.Router) {
2932
r.Get("/", details)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package organisation
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"net/http"
7+
8+
"github.com/factly/kavach-server/model"
9+
"github.com/factly/x/errorx"
10+
"github.com/factly/x/loggerx"
11+
"github.com/factly/x/renderx"
12+
"github.com/factly/x/validationx"
13+
"gorm.io/gorm"
14+
)
15+
16+
// validationBody request body
17+
type validationBody struct {
18+
Token string `json:"token" validate:"required"`
19+
}
20+
21+
// Validate - validate_token organisation token
22+
// @Summary Show a organisation token
23+
// @Description validate_token organisation token
24+
// @Tags OrganisationorganisationsTokens
25+
// @ID validate_token-organisation-organisation-token
26+
// @Produce json
27+
// @Param X-Organisation header string true "Organisation ID"
28+
// @Param organisation_slug path string true "Application Slug"
29+
// @Param ValidationBody body ValidationBody true "Validation Body"
30+
// @Success 200 {object} model.organisation
31+
// @Router /organisations/{application_id}/tokens/validate_token [post]
32+
func validate_token(w http.ResponseWriter, r *http.Request) {
33+
//parse applicaion_id
34+
35+
tokenBody := validationBody{}
36+
err := json.NewDecoder(r.Body).Decode(&tokenBody)
37+
if err != nil {
38+
loggerx.Error(err)
39+
errorx.Render(w, errorx.Parser(errorx.DecodeError()))
40+
return
41+
}
42+
43+
validationError := validationx.Check(tokenBody)
44+
if validationError != nil {
45+
loggerx.Error(errors.New("validation error"))
46+
errorx.Render(w, validationError)
47+
return
48+
}
49+
50+
orgToken := model.OrganisationToken{}
51+
// to need to specify the organisation id as token itself is unique
52+
err = model.DB.Model(&model.OrganisationToken{}).Preload("Organisation").Where(&model.OrganisationToken{
53+
Token: tokenBody.Token,
54+
}).First(&orgToken).Error
55+
56+
if err != nil {
57+
loggerx.Error(err)
58+
if err == gorm.ErrRecordNotFound {
59+
renderx.JSON(w, http.StatusUnauthorized, map[string]interface{}{"valid": false})
60+
return
61+
}
62+
errorx.Render(w, errorx.Parser(errorx.InternalServerError()))
63+
return
64+
}
65+
66+
renderx.JSON(w, http.StatusOK, map[string]interface{}{"valid": true})
67+
}

0 commit comments

Comments
 (0)