diff --git a/api/queryAPI/api.gen.go b/api/queryAPI/api.gen.go
index 7f363e42..a87bdd70 100644
--- a/api/queryAPI/api.gen.go
+++ b/api/queryAPI/api.gen.go
@@ -21,6 +21,7 @@ import (
)
const (
+ CognitoAuthScopes = "cognitoAuth.Scopes"
PlaceholderAuthScopes = "placeholderAuth.Scopes"
)
@@ -350,6 +351,15 @@ type TooManyRequests = ErrorMessage
// Unauthorized Description of error
type Unauthorized = ErrorMessage
+// LoginCallbackParams defines parameters for LoginCallback.
+type LoginCallbackParams struct {
+ // Code Authorization code from Cognito
+ Code string `form:"code" json:"code"`
+
+ // State State parameter for CSRF protection
+ State string `form:"state" json:"state"`
+}
+
// CreateClientJSONRequestBody defines body for CreateClient for application/json ContentType.
type CreateClientJSONRequestBody = ClientCreate
@@ -403,6 +413,18 @@ type ServerInterface interface {
// Check export state.
// (GET /export/{id})
ExportState(ctx echo.Context, id ExportID) error
+ // Get the home page menu
+ // (GET /home)
+ GetHomePage(ctx echo.Context) error
+ // Login to the application
+ // (GET /login)
+ Login(ctx echo.Context) error
+ // OAuth2 callback endpoint
+ // (GET /login-callback)
+ LoginCallback(ctx echo.Context, params LoginCallbackParams) error
+ // Logout from the application
+ // (GET /logout)
+ Logout(ctx echo.Context) error
// List queries
// (GET /query)
ListQueries(ctx echo.Context) error
@@ -598,6 +620,64 @@ func (w *ServerInterfaceWrapper) ExportState(ctx echo.Context) error {
return err
}
+// GetHomePage converts echo context to params.
+func (w *ServerInterfaceWrapper) GetHomePage(ctx echo.Context) error {
+ var err error
+
+ ctx.Set(PlaceholderAuthScopes, []string{})
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.GetHomePage(ctx)
+ return err
+}
+
+// Login converts echo context to params.
+func (w *ServerInterfaceWrapper) Login(ctx echo.Context) error {
+ var err error
+
+ ctx.Set(CognitoAuthScopes, []string{"openid", "email", "profile"})
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.Login(ctx)
+ return err
+}
+
+// LoginCallback converts echo context to params.
+func (w *ServerInterfaceWrapper) LoginCallback(ctx echo.Context) error {
+ var err error
+
+ // Parameter object where we will unmarshal all parameters from the context
+ var params LoginCallbackParams
+ // ------------- Required query parameter "code" -------------
+
+ err = runtime.BindQueryParameter("form", true, true, "code", ctx.QueryParams(), ¶ms.Code)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter code: %s", err))
+ }
+
+ // ------------- Required query parameter "state" -------------
+
+ err = runtime.BindQueryParameter("form", true, true, "state", ctx.QueryParams(), ¶ms.State)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter state: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.LoginCallback(ctx, params)
+ return err
+}
+
+// Logout converts echo context to params.
+func (w *ServerInterfaceWrapper) Logout(ctx echo.Context) error {
+ var err error
+
+ ctx.Set(PlaceholderAuthScopes, []string{})
+
+ // Invoke the callback with all the unmarshaled arguments
+ err = w.Handler.Logout(ctx)
+ return err
+}
+
// ListQueries converts echo context to params.
func (w *ServerInterfaceWrapper) ListQueries(ctx echo.Context) error {
var err error
@@ -712,6 +792,10 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.GET(baseURL+"/client/:id/status", wrapper.GetStatusByClientId)
router.GET(baseURL+"/document/:id", wrapper.GetDocument)
router.GET(baseURL+"/export/:id", wrapper.ExportState)
+ router.GET(baseURL+"/home", wrapper.GetHomePage)
+ router.GET(baseURL+"/login", wrapper.Login)
+ router.GET(baseURL+"/login-callback", wrapper.LoginCallback)
+ router.GET(baseURL+"/logout", wrapper.Logout)
router.GET(baseURL+"/query", wrapper.ListQueries)
router.POST(baseURL+"/query", wrapper.CreateQuery)
router.GET(baseURL+"/query/:id", wrapper.GetQuery)
@@ -723,66 +807,78 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
- "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",
+ "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",
+ "CwAA///aY3I0l2cAAA==",
}
// GetSwagger returns the content of the embedded swagger specification file
diff --git a/api/queryAPI/authHandlers.go b/api/queryAPI/authHandlers.go
new file mode 100644
index 00000000..af9e095f
--- /dev/null
+++ b/api/queryAPI/authHandlers.go
@@ -0,0 +1,32 @@
+package queryapi
+
+import (
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+)
+
+func (s *Controllers) Login(ctx echo.Context) error {
+ // Redirect to Cognito login page
+ // This is a placeholder implementation - you'll need to implement the actual Cognito redirect logic
+ loginURL := "https://doczy.auth.us-east-1.amazoncognito.com/oauth2/authorize"
+ return ctx.Redirect(http.StatusFound, loginURL)
+}
+
+func (s *Controllers) LoginCallback(ctx echo.Context, params LoginCallbackParams) error {
+ // Handle OAuth2 callback
+ // This is a placeholder implementation - you'll need to implement the actual token exchange logic
+ redirectURL := "https://doczy.com" // Replace with your actual redirect URL
+ return ctx.Redirect(http.StatusFound, redirectURL)
+}
+
+func (s *Controllers) Logout(ctx echo.Context) error {
+ // Handle logout
+ // This is a placeholder implementation - you'll need to implement the actual logout logic
+ logoutURL := "https://doczy.auth.us-east-1.amazoncognito.com/logout"
+ return ctx.Redirect(http.StatusFound, logoutURL)
+}
+
+func (s *Controllers) GetHomePage(ctx echo.Context) error {
+ return HomeHandler(ctx)
+}
diff --git a/api/queryAPI/homehandler.go b/api/queryAPI/homehandler.go
new file mode 100644
index 00000000..043bc0bb
--- /dev/null
+++ b/api/queryAPI/homehandler.go
@@ -0,0 +1,202 @@
+package queryapi
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+ "strings"
+
+ "github.com/labstack/echo/v4"
+ "github.com/lestrrat-go/jwx/v2/jwt"
+)
+
+// Constants for route paths
+const (
+ LOGIN_CALLBACK_PATH = "/login-callback"
+)
+
+// endpointsList keeps track of registered endpoints
+// This list should be kept in sync with actual route registrations
+var endpointsList = []string{
+ // Auth Service Endpoints
+ "/login",
+ LOGIN_CALLBACK_PATH,
+ "/logout",
+ "/home",
+
+ // Client Service Endpoints
+ "/client",
+ "/client/:id",
+ "/client/:id/status",
+ "/client/:id/collector",
+ "/client/:id/documents",
+ "/client/:id/export",
+
+ // Query API Endpoints
+ "/query",
+ "/query/:id",
+ "/query/:id/test",
+
+ // Document Service Endpoints
+ "/document/:id",
+
+ // Export Service Endpoints
+ "/export/:id",
+}
+
+// homeHandler renders a simple HTML page with links to all endpoints
+// and displays authentication status based on JWT token
+func HomeHandler(c echo.Context) error {
+ var linksHTML string
+ baseURL := "http://localhost:8080"
+
+ // Create list items for each endpoint
+ for _, endpoint := range endpointsList {
+ // Skip endpoints with path parameters for direct linking
+ if strings.Contains(endpoint, ":") {
+ displayPath := strings.Replace(endpoint, ":id", "{id}", -1)
+ linksHTML += fmt.Sprintf("
%s (requires parameter)\n", displayPath)
+ } else {
+ linksHTML += fmt.Sprintf("%s\n", baseURL, endpoint, endpoint)
+ }
+ }
+
+ // Check if user is authenticated by looking for token in cookie
+ tokenCookie, err := c.Cookie("auth_token")
+ isAuthenticated := (err == nil && tokenCookie.Value != "")
+
+ // Variables for user info
+ username := ""
+ email := ""
+ var userGroups []string
+
+ // If authenticated, try to decode the JWT token to get user info
+ if isAuthenticated {
+ // Parse the JWT token without verification (just to extract info for display)
+ // In a production application, you would want to verify the token here as well
+ token, _ := jwt.Parse([]byte(tokenCookie.Value), jwt.WithVerify(false))
+ if token != nil {
+ claims, _ := token.AsMap(context.Background())
+ username, _ = claims["cognito:username"].(string)
+ email, _ = claims["email"].(string)
+
+ // Try to extract groups
+ if rawGroups, ok := claims["cognito:groups"]; ok {
+ if groups, ok := rawGroups.([]interface{}); ok {
+ userGroups = make([]string, len(groups))
+ for i, g := range groups {
+ userGroups[i] = fmt.Sprint(g)
+ }
+ }
+ }
+ }
+ }
+
+ // Create authentication status section
+ var authStatusHTML string
+ if isAuthenticated {
+ authStatusHTML = fmt.Sprintf(`
+
+
Authentication Status: Authenticated
+
Username: %s
+
Email: %s
+
Groups: %s
+
Logout
+
+ `, username, email, strings.Join(userGroups, ", "))
+ } else {
+ authStatusHTML = `
+
+
Authentication Status: Not Authenticated
+
You are not currently logged in.
+
Login
+
+ `
+ }
+
+ // Create the complete HTML page
+ html := fmt.Sprintf(`
+
+
+
+ Doczy Home
+
+
+
+ Doczy Home
+
+ %s
+
+ Available Endpoints
+
+
+
+
Note: This is a debugging page. Some endpoints require authentication or specific permissions.
+
+
+
+ `, authStatusHTML, linksHTML)
+
+ return c.HTML(http.StatusOK, html)
+}
diff --git a/mocks/queryapi/mock_ClientInterface.go b/mocks/queryapi/mock_ClientInterface.go
index 57a4d549..841505f7 100644
--- a/mocks/queryapi/mock_ClientInterface.go
+++ b/mocks/queryapi/mock_ClientInterface.go
@@ -622,6 +622,79 @@ func (_c *MockClientInterface_GetDocument_Call) RunAndReturn(run func(context.Co
return _c
}
+// GetHomePage provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientInterface) GetHomePage(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetHomePage")
+ }
+
+ var r0 *http.Response
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *http.Response); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*http.Response)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientInterface_GetHomePage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetHomePage'
+type MockClientInterface_GetHomePage_Call struct {
+ *mock.Call
+}
+
+// GetHomePage is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientInterface_Expecter) GetHomePage(ctx interface{}, reqEditors ...interface{}) *MockClientInterface_GetHomePage_Call {
+ return &MockClientInterface_GetHomePage_Call{Call: _e.mock.On("GetHomePage",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientInterface_GetHomePage_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientInterface_GetHomePage_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientInterface_GetHomePage_Call) Return(_a0 *http.Response, _a1 error) *MockClientInterface_GetHomePage_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientInterface_GetHomePage_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)) *MockClientInterface_GetHomePage_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// GetQuery provides a mock function with given fields: ctx, id, reqEditors
func (_m *MockClientInterface) GetQuery(ctx context.Context, id uuid.UUID, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
_va := make([]interface{}, len(reqEditors))
@@ -917,6 +990,226 @@ func (_c *MockClientInterface_ListQueries_Call) RunAndReturn(run func(context.Co
return _c
}
+// Login provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientInterface) Login(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for Login")
+ }
+
+ var r0 *http.Response
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *http.Response); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*http.Response)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientInterface_Login_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Login'
+type MockClientInterface_Login_Call struct {
+ *mock.Call
+}
+
+// Login is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientInterface_Expecter) Login(ctx interface{}, reqEditors ...interface{}) *MockClientInterface_Login_Call {
+ return &MockClientInterface_Login_Call{Call: _e.mock.On("Login",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientInterface_Login_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientInterface_Login_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientInterface_Login_Call) Return(_a0 *http.Response, _a1 error) *MockClientInterface_Login_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientInterface_Login_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)) *MockClientInterface_Login_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// LoginCallback provides a mock function with given fields: ctx, params, reqEditors
+func (_m *MockClientInterface) LoginCallback(ctx context.Context, params *queryapi.LoginCallbackParams, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, params)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LoginCallback")
+ }
+
+ var r0 *http.Response
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) (*http.Response, error)); ok {
+ return rf(ctx, params, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) *http.Response); ok {
+ r0 = rf(ctx, params, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*http.Response)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, params, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientInterface_LoginCallback_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LoginCallback'
+type MockClientInterface_LoginCallback_Call struct {
+ *mock.Call
+}
+
+// LoginCallback is a helper method to define mock.On call
+// - ctx context.Context
+// - params *queryapi.LoginCallbackParams
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientInterface_Expecter) LoginCallback(ctx interface{}, params interface{}, reqEditors ...interface{}) *MockClientInterface_LoginCallback_Call {
+ return &MockClientInterface_LoginCallback_Call{Call: _e.mock.On("LoginCallback",
+ append([]interface{}{ctx, params}, reqEditors...)...)}
+}
+
+func (_c *MockClientInterface_LoginCallback_Call) Run(run func(ctx context.Context, params *queryapi.LoginCallbackParams, reqEditors ...queryapi.RequestEditorFn)) *MockClientInterface_LoginCallback_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*queryapi.LoginCallbackParams), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientInterface_LoginCallback_Call) Return(_a0 *http.Response, _a1 error) *MockClientInterface_LoginCallback_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientInterface_LoginCallback_Call) RunAndReturn(run func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) (*http.Response, error)) *MockClientInterface_LoginCallback_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// Logout provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientInterface) Logout(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for Logout")
+ }
+
+ var r0 *http.Response
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *http.Response); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*http.Response)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientInterface_Logout_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Logout'
+type MockClientInterface_Logout_Call struct {
+ *mock.Call
+}
+
+// Logout is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientInterface_Expecter) Logout(ctx interface{}, reqEditors ...interface{}) *MockClientInterface_Logout_Call {
+ return &MockClientInterface_Logout_Call{Call: _e.mock.On("Logout",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientInterface_Logout_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientInterface_Logout_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientInterface_Logout_Call) Return(_a0 *http.Response, _a1 error) *MockClientInterface_Logout_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientInterface_Logout_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*http.Response, error)) *MockClientInterface_Logout_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// SetCollectorByClientId provides a mock function with given fields: ctx, id, body, reqEditors
func (_m *MockClientInterface) SetCollectorByClientId(ctx context.Context, id string, body queryapi.CollectorSet, reqEditors ...queryapi.RequestEditorFn) (*http.Response, error) {
_va := make([]interface{}, len(reqEditors))
diff --git a/mocks/queryapi/mock_ClientWithResponsesInterface.go b/mocks/queryapi/mock_ClientWithResponsesInterface.go
index e602fa27..1c8382df 100644
--- a/mocks/queryapi/mock_ClientWithResponsesInterface.go
+++ b/mocks/queryapi/mock_ClientWithResponsesInterface.go
@@ -620,6 +620,79 @@ func (_c *MockClientWithResponsesInterface_GetDocumentWithResponse_Call) RunAndR
return _c
}
+// GetHomePageWithResponse provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientWithResponsesInterface) GetHomePageWithResponse(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*queryapi.GetHomePageResponse, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetHomePageWithResponse")
+ }
+
+ var r0 *queryapi.GetHomePageResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.GetHomePageResponse, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *queryapi.GetHomePageResponse); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*queryapi.GetHomePageResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientWithResponsesInterface_GetHomePageWithResponse_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetHomePageWithResponse'
+type MockClientWithResponsesInterface_GetHomePageWithResponse_Call struct {
+ *mock.Call
+}
+
+// GetHomePageWithResponse is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientWithResponsesInterface_Expecter) GetHomePageWithResponse(ctx interface{}, reqEditors ...interface{}) *MockClientWithResponsesInterface_GetHomePageWithResponse_Call {
+ return &MockClientWithResponsesInterface_GetHomePageWithResponse_Call{Call: _e.mock.On("GetHomePageWithResponse",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientWithResponsesInterface_GetHomePageWithResponse_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientWithResponsesInterface_GetHomePageWithResponse_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_GetHomePageWithResponse_Call) Return(_a0 *queryapi.GetHomePageResponse, _a1 error) *MockClientWithResponsesInterface_GetHomePageWithResponse_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_GetHomePageWithResponse_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.GetHomePageResponse, error)) *MockClientWithResponsesInterface_GetHomePageWithResponse_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// GetQueryWithResponse provides a mock function with given fields: ctx, id, reqEditors
func (_m *MockClientWithResponsesInterface) GetQueryWithResponse(ctx context.Context, id uuid.UUID, reqEditors ...queryapi.RequestEditorFn) (*queryapi.GetQueryResponse, error) {
_va := make([]interface{}, len(reqEditors))
@@ -915,6 +988,226 @@ func (_c *MockClientWithResponsesInterface_ListQueriesWithResponse_Call) RunAndR
return _c
}
+// LoginCallbackWithResponse provides a mock function with given fields: ctx, params, reqEditors
+func (_m *MockClientWithResponsesInterface) LoginCallbackWithResponse(ctx context.Context, params *queryapi.LoginCallbackParams, reqEditors ...queryapi.RequestEditorFn) (*queryapi.LoginCallbackResponse, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, params)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LoginCallbackWithResponse")
+ }
+
+ var r0 *queryapi.LoginCallbackResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) (*queryapi.LoginCallbackResponse, error)); ok {
+ return rf(ctx, params, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) *queryapi.LoginCallbackResponse); ok {
+ r0 = rf(ctx, params, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*queryapi.LoginCallbackResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, params, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientWithResponsesInterface_LoginCallbackWithResponse_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LoginCallbackWithResponse'
+type MockClientWithResponsesInterface_LoginCallbackWithResponse_Call struct {
+ *mock.Call
+}
+
+// LoginCallbackWithResponse is a helper method to define mock.On call
+// - ctx context.Context
+// - params *queryapi.LoginCallbackParams
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientWithResponsesInterface_Expecter) LoginCallbackWithResponse(ctx interface{}, params interface{}, reqEditors ...interface{}) *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call {
+ return &MockClientWithResponsesInterface_LoginCallbackWithResponse_Call{Call: _e.mock.On("LoginCallbackWithResponse",
+ append([]interface{}{ctx, params}, reqEditors...)...)}
+}
+
+func (_c *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call) Run(run func(ctx context.Context, params *queryapi.LoginCallbackParams, reqEditors ...queryapi.RequestEditorFn)) *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*queryapi.LoginCallbackParams), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call) Return(_a0 *queryapi.LoginCallbackResponse, _a1 error) *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call) RunAndReturn(run func(context.Context, *queryapi.LoginCallbackParams, ...queryapi.RequestEditorFn) (*queryapi.LoginCallbackResponse, error)) *MockClientWithResponsesInterface_LoginCallbackWithResponse_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// LoginWithResponse provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientWithResponsesInterface) LoginWithResponse(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*queryapi.LoginResponse, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LoginWithResponse")
+ }
+
+ var r0 *queryapi.LoginResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.LoginResponse, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *queryapi.LoginResponse); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*queryapi.LoginResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientWithResponsesInterface_LoginWithResponse_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LoginWithResponse'
+type MockClientWithResponsesInterface_LoginWithResponse_Call struct {
+ *mock.Call
+}
+
+// LoginWithResponse is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientWithResponsesInterface_Expecter) LoginWithResponse(ctx interface{}, reqEditors ...interface{}) *MockClientWithResponsesInterface_LoginWithResponse_Call {
+ return &MockClientWithResponsesInterface_LoginWithResponse_Call{Call: _e.mock.On("LoginWithResponse",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientWithResponsesInterface_LoginWithResponse_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientWithResponsesInterface_LoginWithResponse_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LoginWithResponse_Call) Return(_a0 *queryapi.LoginResponse, _a1 error) *MockClientWithResponsesInterface_LoginWithResponse_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LoginWithResponse_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.LoginResponse, error)) *MockClientWithResponsesInterface_LoginWithResponse_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// LogoutWithResponse provides a mock function with given fields: ctx, reqEditors
+func (_m *MockClientWithResponsesInterface) LogoutWithResponse(ctx context.Context, reqEditors ...queryapi.RequestEditorFn) (*queryapi.LogoutResponse, error) {
+ _va := make([]interface{}, len(reqEditors))
+ for _i := range reqEditors {
+ _va[_i] = reqEditors[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LogoutWithResponse")
+ }
+
+ var r0 *queryapi.LogoutResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.LogoutResponse, error)); ok {
+ return rf(ctx, reqEditors...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ...queryapi.RequestEditorFn) *queryapi.LogoutResponse); ok {
+ r0 = rf(ctx, reqEditors...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*queryapi.LogoutResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ...queryapi.RequestEditorFn) error); ok {
+ r1 = rf(ctx, reqEditors...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockClientWithResponsesInterface_LogoutWithResponse_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LogoutWithResponse'
+type MockClientWithResponsesInterface_LogoutWithResponse_Call struct {
+ *mock.Call
+}
+
+// LogoutWithResponse is a helper method to define mock.On call
+// - ctx context.Context
+// - reqEditors ...queryapi.RequestEditorFn
+func (_e *MockClientWithResponsesInterface_Expecter) LogoutWithResponse(ctx interface{}, reqEditors ...interface{}) *MockClientWithResponsesInterface_LogoutWithResponse_Call {
+ return &MockClientWithResponsesInterface_LogoutWithResponse_Call{Call: _e.mock.On("LogoutWithResponse",
+ append([]interface{}{ctx}, reqEditors...)...)}
+}
+
+func (_c *MockClientWithResponsesInterface_LogoutWithResponse_Call) Run(run func(ctx context.Context, reqEditors ...queryapi.RequestEditorFn)) *MockClientWithResponsesInterface_LogoutWithResponse_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]queryapi.RequestEditorFn, len(args)-1)
+ for i, a := range args[1:] {
+ if a != nil {
+ variadicArgs[i] = a.(queryapi.RequestEditorFn)
+ }
+ }
+ run(args[0].(context.Context), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LogoutWithResponse_Call) Return(_a0 *queryapi.LogoutResponse, _a1 error) *MockClientWithResponsesInterface_LogoutWithResponse_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockClientWithResponsesInterface_LogoutWithResponse_Call) RunAndReturn(run func(context.Context, ...queryapi.RequestEditorFn) (*queryapi.LogoutResponse, error)) *MockClientWithResponsesInterface_LogoutWithResponse_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// SetCollectorByClientIdWithBodyWithResponse provides a mock function with given fields: ctx, id, contentType, body, reqEditors
func (_m *MockClientWithResponsesInterface) SetCollectorByClientIdWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...queryapi.RequestEditorFn) (*queryapi.SetCollectorByClientIdResponse, error) {
_va := make([]interface{}, len(reqEditors))
diff --git a/pkg/queryAPI/api.gen.go b/pkg/queryAPI/api.gen.go
index 33eb75c9..e61cc595 100644
--- a/pkg/queryAPI/api.gen.go
+++ b/pkg/queryAPI/api.gen.go
@@ -19,6 +19,7 @@ import (
)
const (
+ CognitoAuthScopes = "cognitoAuth.Scopes"
PlaceholderAuthScopes = "placeholderAuth.Scopes"
)
@@ -348,6 +349,15 @@ type TooManyRequests = ErrorMessage
// Unauthorized Description of error
type Unauthorized = ErrorMessage
+// LoginCallbackParams defines parameters for LoginCallback.
+type LoginCallbackParams struct {
+ // Code Authorization code from Cognito
+ Code string `form:"code" json:"code"`
+
+ // State State parameter for CSRF protection
+ State string `form:"state" json:"state"`
+}
+
// CreateClientJSONRequestBody defines body for CreateClient for application/json ContentType.
type CreateClientJSONRequestBody = ClientCreate
@@ -480,6 +490,18 @@ type ClientInterface interface {
// ExportState request
ExportState(ctx context.Context, id ExportID, reqEditors ...RequestEditorFn) (*http.Response, error)
+ // GetHomePage request
+ GetHomePage(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
+
+ // Login request
+ Login(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
+
+ // LoginCallback request
+ LoginCallback(ctx context.Context, params *LoginCallbackParams, reqEditors ...RequestEditorFn) (*http.Response, error)
+
+ // Logout request
+ Logout(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
+
// ListQueries request
ListQueries(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
@@ -670,6 +692,54 @@ func (c *Client) ExportState(ctx context.Context, id ExportID, reqEditors ...Req
return c.Client.Do(req)
}
+func (c *Client) GetHomePage(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewGetHomePageRequest(c.Server)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
+func (c *Client) Login(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewLoginRequest(c.Server)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
+func (c *Client) LoginCallback(ctx context.Context, params *LoginCallbackParams, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewLoginCallbackRequest(c.Server, params)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
+func (c *Client) Logout(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewLogoutRequest(c.Server)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
func (c *Client) ListQueries(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewListQueriesRequest(c.Server)
if err != nil {
@@ -1151,6 +1221,144 @@ func NewExportStateRequest(server string, id ExportID) (*http.Request, error) {
return req, nil
}
+// NewGetHomePageRequest generates requests for GetHomePage
+func NewGetHomePageRequest(server string) (*http.Request, error) {
+ var err error
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/home")
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequest("GET", queryURL.String(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return req, nil
+}
+
+// NewLoginRequest generates requests for Login
+func NewLoginRequest(server string) (*http.Request, error) {
+ var err error
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/login")
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequest("GET", queryURL.String(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return req, nil
+}
+
+// NewLoginCallbackRequest generates requests for LoginCallback
+func NewLoginCallbackRequest(server string, params *LoginCallbackParams) (*http.Request, error) {
+ var err error
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/login-callback")
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ if params != nil {
+ queryValues := queryURL.Query()
+
+ if queryFrag, err := runtime.StyleParamWithLocation("form", true, "code", runtime.ParamLocationQuery, params.Code); err != nil {
+ return nil, err
+ } else if parsed, err := url.ParseQuery(queryFrag); err != nil {
+ return nil, err
+ } else {
+ for k, v := range parsed {
+ for _, v2 := range v {
+ queryValues.Add(k, v2)
+ }
+ }
+ }
+
+ if queryFrag, err := runtime.StyleParamWithLocation("form", true, "state", runtime.ParamLocationQuery, params.State); err != nil {
+ return nil, err
+ } else if parsed, err := url.ParseQuery(queryFrag); err != nil {
+ return nil, err
+ } else {
+ for k, v := range parsed {
+ for _, v2 := range v {
+ queryValues.Add(k, v2)
+ }
+ }
+ }
+
+ queryURL.RawQuery = queryValues.Encode()
+ }
+
+ req, err := http.NewRequest("GET", queryURL.String(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return req, nil
+}
+
+// NewLogoutRequest generates requests for Logout
+func NewLogoutRequest(server string) (*http.Request, error) {
+ var err error
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/logout")
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequest("GET", queryURL.String(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return req, nil
+}
+
// NewListQueriesRequest generates requests for ListQueries
func NewListQueriesRequest(server string) (*http.Request, error) {
var err error
@@ -1427,6 +1635,18 @@ type ClientWithResponsesInterface interface {
// ExportStateWithResponse request
ExportStateWithResponse(ctx context.Context, id ExportID, reqEditors ...RequestEditorFn) (*ExportStateResponse, error)
+ // GetHomePageWithResponse request
+ GetHomePageWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetHomePageResponse, error)
+
+ // LoginWithResponse request
+ LoginWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*LoginResponse, error)
+
+ // LoginCallbackWithResponse request
+ LoginCallbackWithResponse(ctx context.Context, params *LoginCallbackParams, reqEditors ...RequestEditorFn) (*LoginCallbackResponse, error)
+
+ // LogoutWithResponse request
+ LogoutWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*LogoutResponse, error)
+
// ListQueriesWithResponse request
ListQueriesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListQueriesResponse, error)
@@ -1707,6 +1927,106 @@ func (r ExportStateResponse) StatusCode() int {
return 0
}
+type GetHomePageResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSON400 *InvalidRequest
+ JSON401 *Unauthorized
+ JSON429 *TooManyRequests
+ JSON500 *InternalError
+}
+
+// Status returns HTTPResponse.Status
+func (r GetHomePageResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r GetHomePageResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
+type LoginResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSON400 *InvalidRequest
+ JSON401 *Unauthorized
+ JSON429 *TooManyRequests
+ JSON500 *InternalError
+}
+
+// Status returns HTTPResponse.Status
+func (r LoginResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r LoginResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
+type LoginCallbackResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSON400 *InvalidRequest
+ JSON401 *Unauthorized
+ JSON429 *TooManyRequests
+ JSON500 *InternalError
+}
+
+// Status returns HTTPResponse.Status
+func (r LoginCallbackResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r LoginCallbackResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
+type LogoutResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSON400 *InvalidRequest
+ JSON401 *Unauthorized
+ JSON429 *TooManyRequests
+ JSON500 *InternalError
+}
+
+// Status returns HTTPResponse.Status
+func (r LogoutResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r LogoutResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
type ListQueriesResponse struct {
Body []byte
HTTPResponse *http.Response
@@ -1958,6 +2278,42 @@ func (c *ClientWithResponses) ExportStateWithResponse(ctx context.Context, id Ex
return ParseExportStateResponse(rsp)
}
+// GetHomePageWithResponse request returning *GetHomePageResponse
+func (c *ClientWithResponses) GetHomePageWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetHomePageResponse, error) {
+ rsp, err := c.GetHomePage(ctx, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseGetHomePageResponse(rsp)
+}
+
+// LoginWithResponse request returning *LoginResponse
+func (c *ClientWithResponses) LoginWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*LoginResponse, error) {
+ rsp, err := c.Login(ctx, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseLoginResponse(rsp)
+}
+
+// LoginCallbackWithResponse request returning *LoginCallbackResponse
+func (c *ClientWithResponses) LoginCallbackWithResponse(ctx context.Context, params *LoginCallbackParams, reqEditors ...RequestEditorFn) (*LoginCallbackResponse, error) {
+ rsp, err := c.LoginCallback(ctx, params, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseLoginCallbackResponse(rsp)
+}
+
+// LogoutWithResponse request returning *LogoutResponse
+func (c *ClientWithResponses) LogoutWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*LogoutResponse, error) {
+ rsp, err := c.Logout(ctx, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseLogoutResponse(rsp)
+}
+
// ListQueriesWithResponse request returning *ListQueriesResponse
func (c *ClientWithResponses) ListQueriesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListQueriesResponse, error) {
rsp, err := c.ListQueries(ctx, reqEditors...)
@@ -2553,6 +2909,194 @@ func ParseExportStateResponse(rsp *http.Response) (*ExportStateResponse, error)
return response, nil
}
+// ParseGetHomePageResponse parses an HTTP response from a GetHomePageWithResponse call
+func ParseGetHomePageResponse(rsp *http.Response) (*GetHomePageResponse, error) {
+ bodyBytes, err := io.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &GetHomePageResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400:
+ var dest InvalidRequest
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON400 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401:
+ var dest Unauthorized
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON401 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 429:
+ var dest TooManyRequests
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON429 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500:
+ var dest InternalError
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON500 = &dest
+
+ }
+
+ return response, nil
+}
+
+// ParseLoginResponse parses an HTTP response from a LoginWithResponse call
+func ParseLoginResponse(rsp *http.Response) (*LoginResponse, error) {
+ bodyBytes, err := io.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &LoginResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400:
+ var dest InvalidRequest
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON400 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401:
+ var dest Unauthorized
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON401 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 429:
+ var dest TooManyRequests
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON429 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500:
+ var dest InternalError
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON500 = &dest
+
+ }
+
+ return response, nil
+}
+
+// ParseLoginCallbackResponse parses an HTTP response from a LoginCallbackWithResponse call
+func ParseLoginCallbackResponse(rsp *http.Response) (*LoginCallbackResponse, error) {
+ bodyBytes, err := io.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &LoginCallbackResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400:
+ var dest InvalidRequest
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON400 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401:
+ var dest Unauthorized
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON401 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 429:
+ var dest TooManyRequests
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON429 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500:
+ var dest InternalError
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON500 = &dest
+
+ }
+
+ return response, nil
+}
+
+// ParseLogoutResponse parses an HTTP response from a LogoutWithResponse call
+func ParseLogoutResponse(rsp *http.Response) (*LogoutResponse, error) {
+ bodyBytes, err := io.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &LogoutResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400:
+ var dest InvalidRequest
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON400 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401:
+ var dest Unauthorized
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON401 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 429:
+ var dest TooManyRequests
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON429 = &dest
+
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500:
+ var dest InternalError
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON500 = &dest
+
+ }
+
+ return response, nil
+}
+
// ParseListQueriesResponse parses an HTTP response from a ListQueriesWithResponse call
func ParseListQueriesResponse(rsp *http.Response) (*ListQueriesResponse, error) {
bodyBytes, err := io.ReadAll(rsp.Body)
diff --git a/serviceAPIs/queryAPI.yaml b/serviceAPIs/queryAPI.yaml
index 34ad2068..91d29451 100644
--- a/serviceAPIs/queryAPI.yaml
+++ b/serviceAPIs/queryAPI.yaml
@@ -25,6 +25,8 @@ tags:
description: Operations related to queries
- name: ExportService
description: Operations related to exports
+ - name: AuthService
+ description: Operations related to authentication
paths:
/client:
@@ -494,6 +496,151 @@ paths:
"500":
$ref: "#/components/responses/InternalError"
+
+ /login:
+ get:
+ operationId: login
+ tags:
+ - AuthService
+ summary: Login to the application
+ description: >-
+ Initiates the login flow by redirecting to Cognito IDP login page.
+ security:
+ - {}
+ - cognitoAuth: [openid, email, profile]
+ responses:
+ "302":
+ description: Redirect to Cognito login page
+ headers:
+ Location:
+ schema:
+ type: string
+ format: uri
+ maxLength: 2048
+ pattern: "^https://.*"
+ description: URL to the Cognito login page
+ RateLimit:
+ $ref: "#/components/headers/RateLimit"
+ "400":
+ $ref: "#/components/responses/InvalidRequest"
+ "401":
+ $ref: "#/components/responses/Unauthorized"
+ "429":
+ $ref: "#/components/responses/TooManyRequests"
+ "500":
+ $ref: "#/components/responses/InternalError"
+
+ /login-callback:
+ get:
+ operationId: loginCallback
+ tags:
+ - AuthService
+ summary: OAuth2 callback endpoint
+ description: >-
+ Handles the OAuth2 callback during the login process. Receives the
+ authorization code from Cognito IDP and exchanges it for tokens.
+ security:
+ - {}
+ parameters:
+ - name: code
+ in: query
+ description: Authorization code from Cognito
+ required: true
+ schema:
+ type: string
+ maxLength: 2048
+ pattern: "^[A-Za-z0-9\\-_]+$"
+ - name: state
+ in: query
+ description: State parameter for CSRF protection
+ required: true
+ schema:
+ type: string
+ maxLength: 1024
+ pattern: "^[A-Za-z0-9\\-_]+$"
+ responses:
+ "302":
+ description: Redirect to application after successful login
+ headers:
+ Location:
+ schema:
+ type: string
+ format: uri
+ maxLength: 2048
+ pattern: "^https?://.*"
+ description: URL to redirect after successful login
+ "400":
+ $ref: "#/components/responses/InvalidRequest"
+ "401":
+ $ref: "#/components/responses/Unauthorized"
+ "429":
+ $ref: "#/components/responses/TooManyRequests"
+ "500":
+ $ref: "#/components/responses/InternalError"
+
+ /logout:
+ get:
+ operationId: logout
+ tags:
+ - AuthService
+ summary: Logout from the application
+ description: >-
+ Logs the user out by invalidating the session and redirecting to
+ Cognito logout endpoint.
+ security:
+ - placeholderAuth: []
+ responses:
+ "302":
+ description: Redirect to Cognito logout page or application home page
+ headers:
+ Location:
+ schema:
+ type: string
+ format: uri
+ maxLength: 2048
+ pattern: "^https?://.*"
+ description: URL to redirect after logout
+ "400":
+ $ref: "#/components/responses/InvalidRequest"
+ "401":
+ $ref: "#/components/responses/Unauthorized"
+ "429":
+ $ref: "#/components/responses/TooManyRequests"
+ "500":
+ $ref: "#/components/responses/InternalError"
+ /home:
+ get:
+ operationId: getHomePage
+ tags:
+ - AuthService
+ summary: Get the home page menu
+ description: >-
+ Returns the HTML menu page for authenticated users.
+ security:
+ - placeholderAuth: []
+ responses:
+ "200":
+ description: Home page HTML
+ headers:
+ RateLimit:
+ $ref: "#/components/headers/RateLimit"
+ content:
+ text/html:
+ schema:
+ type: string
+ description: HTML content for the home page menu
+ maxLength: 1048576 # 1MB limit
+ pattern: "^.*$" # Any string content
+ format: html # Indicate format is HTML
+ "400":
+ $ref: "#/components/responses/InvalidRequest"
+ "401":
+ $ref: "#/components/responses/Unauthorized"
+ "429":
+ $ref: "#/components/responses/TooManyRequests"
+ "500":
+ $ref: "#/components/responses/InternalError"
+
components:
parameters:
ClientID:
@@ -544,6 +691,21 @@ components:
in: header
name: X-API-Key
description: "Placeholder security scheme for future implementation"
+ cognitoAuth:
+ type: oauth2
+ description: >-
+ Authentication using Amazon Cognito IDP. Implements RFC8725 JWT best
+ practices for security.
+ flows:
+ authorizationCode:
+ authorizationUrl: >-
+ https://doczy.auth.us-east-1.amazoncognito.com/oauth2/authorize
+ tokenUrl: >-
+ https://doczy.auth.us-east-1.amazoncognito.com/oauth2/token
+ scopes:
+ openid: Get OIDC token
+ email: Access to user's email
+ profile: Access to user's profile
responses:
InvalidRequest:
@@ -595,6 +757,9 @@ components:
$ref: "#/components/schemas/ErrorMessage"
schemas:
+
+
+ # Query API schemas
ClientID:
type: string
description: The client external id