list public frontends for account implementation (#996)

This commit is contained in:
Michael Quigley 2025-06-27 13:12:10 -04:00
parent ac95ebd2f7
commit f6d1b01ef0
No known key found for this signature in database
GPG Key ID: 9B60314A9DD20A62
26 changed files with 730 additions and 61 deletions

View File

@ -95,6 +95,7 @@ func Run(inCfg *config.Config) error {
api.MetadataGetShareDetailHandler = newShareDetailHandler() api.MetadataGetShareDetailHandler = newShareDetailHandler()
api.MetadataListMembershipsHandler = newListMembershipsHandler() api.MetadataListMembershipsHandler = newListMembershipsHandler()
api.MetadataListOrgMembersHandler = newListOrgMembersHandler() api.MetadataListOrgMembersHandler = newListOrgMembersHandler()
api.MetadataListPublicFrontendsForAccountHandler = newListPublicFrontendsForAccountHandler()
api.MetadataOrgAccountOverviewHandler = newOrgAccountOverviewHandler() api.MetadataOrgAccountOverviewHandler = newOrgAccountOverviewHandler()
api.MetadataOverviewHandler = newOverviewHandler() api.MetadataOverviewHandler = newOverviewHandler()
api.MetadataVersionHandler = metadata.VersionHandlerFunc(versionHandler) api.MetadataVersionHandler = metadata.VersionHandlerFunc(versionHandler)

View File

@ -16,7 +16,7 @@ func newListMembershipsHandler() *listMembershipsHandler {
func (h *listMembershipsHandler) Handle(_ metadata.ListMembershipsParams, principal *rest_model_zrok.Principal) middleware.Responder { func (h *listMembershipsHandler) Handle(_ metadata.ListMembershipsParams, principal *rest_model_zrok.Principal) middleware.Responder {
trx, err := str.Begin() trx, err := str.Begin()
if err != nil { if err != nil {
logrus.Errorf("error startin transaction: %v", err) logrus.Errorf("error starting transaction: %v", err)
return metadata.NewListMembershipsInternalServerError() return metadata.NewListMembershipsInternalServerError()
} }
defer func() { _ = trx.Rollback() }() defer func() { _ = trx.Rollback() }()

View File

@ -0,0 +1,52 @@
package controller
import (
"github.com/go-openapi/runtime/middleware"
"github.com/openziti/zrok/rest_model_zrok"
"github.com/openziti/zrok/rest_server_zrok/operations/metadata"
"github.com/sirupsen/logrus"
)
type listPublicFrontendsForAccountHandler struct{}
func newListPublicFrontendsForAccountHandler() *listPublicFrontendsForAccountHandler {
return &listPublicFrontendsForAccountHandler{}
}
func (h *listPublicFrontendsForAccountHandler) Handle(_ metadata.ListPublicFrontendsForAccountParams, principal *rest_model_zrok.Principal) middleware.Responder {
trx, err := str.Begin()
if err != nil {
logrus.Errorf("error starting transaction: %v", err)
return metadata.NewListPublicFrontendsForAccountInternalServerError()
}
defer trx.Rollback()
var publicFrontends []*metadata.ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0
openFes, err := str.FindOpenPublicFrontends(trx)
if err != nil {
logrus.Errorf("error finding open public frontends: %v", err)
return metadata.NewListPublicFrontendsForAccountInternalServerError()
}
for _, openFe := range openFes {
publicFrontends = append(publicFrontends, &metadata.ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0{
PublicName: *openFe.PublicName,
URLTemplate: *openFe.UrlTemplate,
})
}
closedFes, err := str.FindClosedPublicFrontendsGrantedToAccount(int(principal.ID), trx)
if err != nil {
logrus.Errorf("error finding closed public frontends: %v", err)
return metadata.NewListPublicFrontendsForAccountInternalServerError()
}
for _, closedFe := range closedFes {
publicFrontends = append(publicFrontends, &metadata.ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0{
PublicName: *closedFe.PublicName,
URLTemplate: *closedFe.UrlTemplate,
})
}
payload := &metadata.ListPublicFrontendsForAccountOKBody{PublicFrontends: publicFrontends}
return metadata.NewListPublicFrontendsForAccountOK().WithPayload(payload)
}

View File

@ -107,6 +107,46 @@ func (str *Store) FindPublicFrontends(tx *sqlx.Tx) ([]*Frontend, error) {
return frontends, nil return frontends, nil
} }
func (str *Store) FindOpenPublicFrontends(tx *sqlx.Tx) ([]*Frontend, error) {
rows, err := tx.Queryx("select frontends.* from frontends where environment_id is null and permission_mode = 'open' and reserved = true and not deleted")
if err != nil {
return nil, errors.Wrap(err, "error selecting open public frontends")
}
var frontends []*Frontend
for rows.Next() {
frontend := &Frontend{}
if err := rows.StructScan(frontend); err != nil {
return nil, errors.Wrap(err, "error scanning frontend")
}
frontends = append(frontends, frontend)
}
return frontends, nil
}
func (str *Store) FindClosedPublicFrontendsGrantedToAccount(accountId int, tx *sqlx.Tx) ([]*Frontend, error) {
rows, err := tx.Queryx(`
select frontends.* from frontends
inner join frontend_grants on frontends.id = frontend_grants.frontend_id
where frontend_grants.account_id = $1
and frontends.environment_id is null
and frontends.permission_mode = 'closed'
and frontends.reserved = true
and not frontends.deleted
and not frontend_grants.deleted`, accountId)
if err != nil {
return nil, errors.Wrap(err, "error selecting closed public frontends granted to account")
}
var frontends []*Frontend
for rows.Next() {
frontend := &Frontend{}
if err := rows.StructScan(frontend); err != nil {
return nil, errors.Wrap(err, "error scanning frontend")
}
frontends = append(frontends, frontend)
}
return frontends, nil
}
func (str *Store) FindFrontendsForPrivateShare(shrId int, tx *sqlx.Tx) ([]*Frontend, error) { func (str *Store) FindFrontendsForPrivateShare(shrId int, tx *sqlx.Tx) ([]*Frontend, error) {
rows, err := tx.Queryx("select frontends.* from frontends where private_share_id = $1 and not deleted", shrId) rows, err := tx.Queryx("select frontends.* from frontends where private_share_id = $1 and not deleted", shrId)
if err != nil { if err != nil {

View File

@ -9,7 +9,9 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"strconv"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime" "github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
"github.com/go-openapi/swag" "github.com/go-openapi/swag"
@ -232,20 +234,86 @@ swagger:model ListPublicFrontendsForAccountOKBody
*/ */
type ListPublicFrontendsForAccountOKBody struct { type ListPublicFrontendsForAccountOKBody struct {
// public name // public frontends
PublicName string `json:"publicName,omitempty"` PublicFrontends []*ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 `json:"publicFrontends"`
// url template
URLTemplate string `json:"urlTemplate,omitempty"`
} }
// Validate validates this list public frontends for account o k body // Validate validates this list public frontends for account o k body
func (o *ListPublicFrontendsForAccountOKBody) Validate(formats strfmt.Registry) error { func (o *ListPublicFrontendsForAccountOKBody) Validate(formats strfmt.Registry) error {
var res []error
if err := o.validatePublicFrontends(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil return nil
} }
// ContextValidate validates this list public frontends for account o k body based on context it is used func (o *ListPublicFrontendsForAccountOKBody) validatePublicFrontends(formats strfmt.Registry) error {
if swag.IsZero(o.PublicFrontends) { // not required
return nil
}
for i := 0; i < len(o.PublicFrontends); i++ {
if swag.IsZero(o.PublicFrontends[i]) { // not required
continue
}
if o.PublicFrontends[i] != nil {
if err := o.PublicFrontends[i].Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
// ContextValidate validate this list public frontends for account o k body based on the context it is used
func (o *ListPublicFrontendsForAccountOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { func (o *ListPublicFrontendsForAccountOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
if err := o.contextValidatePublicFrontends(ctx, formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (o *ListPublicFrontendsForAccountOKBody) contextValidatePublicFrontends(ctx context.Context, formats strfmt.Registry) error {
for i := 0; i < len(o.PublicFrontends); i++ {
if o.PublicFrontends[i] != nil {
if swag.IsZero(o.PublicFrontends[i]) { // not required
return nil
}
if err := o.PublicFrontends[i].ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil return nil
} }
@ -266,3 +334,44 @@ func (o *ListPublicFrontendsForAccountOKBody) UnmarshalBinary(b []byte) error {
*o = res *o = res
return nil return nil
} }
/*
ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 list public frontends for account o k body public frontends items0
swagger:model ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0
*/
type ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 struct {
// public name
PublicName string `json:"publicName,omitempty"`
// url template
URLTemplate string `json:"urlTemplate,omitempty"`
}
// Validate validates this list public frontends for account o k body public frontends items0
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this list public frontends for account o k body public frontends items0 based on context it is used
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) MarshalBinary() ([]byte, error) {
if o == nil {
return nil, nil
}
return swag.WriteJSON(o)
}
// UnmarshalBinary interface implementation
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) UnmarshalBinary(b []byte) error {
var res ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*o = res
return nil
}

View File

@ -2083,11 +2083,19 @@ func init() {
"description": "public frontends list returned", "description": "public frontends list returned",
"schema": { "schema": {
"properties": { "properties": {
"publicName": { "publicFrontends": {
"type": "string" "type": "array",
}, "items": {
"urlTemplate": { "type": "object",
"type": "string" "properties": {
"publicName": {
"type": "string"
},
"urlTemplate": {
"type": "string"
}
}
}
} }
} }
} }
@ -4977,11 +4985,11 @@ func init() {
"description": "public frontends list returned", "description": "public frontends list returned",
"schema": { "schema": {
"properties": { "properties": {
"publicName": { "publicFrontends": {
"type": "string" "type": "array",
}, "items": {
"urlTemplate": { "$ref": "#/definitions/PublicFrontendsItems0"
"type": "string" }
} }
} }
} }
@ -5612,6 +5620,17 @@ func init() {
} }
} }
}, },
"PublicFrontendsItems0": {
"type": "object",
"properties": {
"publicName": {
"type": "string"
},
"urlTemplate": {
"type": "string"
}
}
},
"SharesItems0": { "SharesItems0": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -8,7 +8,9 @@ package metadata
import ( import (
"context" "context"
"net/http" "net/http"
"strconv"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime/middleware" "github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
"github.com/go-openapi/swag" "github.com/go-openapi/swag"
@ -78,20 +80,86 @@ func (o *ListPublicFrontendsForAccount) ServeHTTP(rw http.ResponseWriter, r *htt
// swagger:model ListPublicFrontendsForAccountOKBody // swagger:model ListPublicFrontendsForAccountOKBody
type ListPublicFrontendsForAccountOKBody struct { type ListPublicFrontendsForAccountOKBody struct {
// public name // public frontends
PublicName string `json:"publicName,omitempty"` PublicFrontends []*ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 `json:"publicFrontends"`
// url template
URLTemplate string `json:"urlTemplate,omitempty"`
} }
// Validate validates this list public frontends for account o k body // Validate validates this list public frontends for account o k body
func (o *ListPublicFrontendsForAccountOKBody) Validate(formats strfmt.Registry) error { func (o *ListPublicFrontendsForAccountOKBody) Validate(formats strfmt.Registry) error {
var res []error
if err := o.validatePublicFrontends(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil return nil
} }
// ContextValidate validates this list public frontends for account o k body based on context it is used func (o *ListPublicFrontendsForAccountOKBody) validatePublicFrontends(formats strfmt.Registry) error {
if swag.IsZero(o.PublicFrontends) { // not required
return nil
}
for i := 0; i < len(o.PublicFrontends); i++ {
if swag.IsZero(o.PublicFrontends[i]) { // not required
continue
}
if o.PublicFrontends[i] != nil {
if err := o.PublicFrontends[i].Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
// ContextValidate validate this list public frontends for account o k body based on the context it is used
func (o *ListPublicFrontendsForAccountOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { func (o *ListPublicFrontendsForAccountOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
if err := o.contextValidatePublicFrontends(ctx, formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (o *ListPublicFrontendsForAccountOKBody) contextValidatePublicFrontends(ctx context.Context, formats strfmt.Registry) error {
for i := 0; i < len(o.PublicFrontends); i++ {
if o.PublicFrontends[i] != nil {
if swag.IsZero(o.PublicFrontends[i]) { // not required
return nil
}
if err := o.PublicFrontends[i].ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("listPublicFrontendsForAccountOK" + "." + "publicFrontends" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil return nil
} }
@ -112,3 +180,43 @@ func (o *ListPublicFrontendsForAccountOKBody) UnmarshalBinary(b []byte) error {
*o = res *o = res
return nil return nil
} }
// ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 list public frontends for account o k body public frontends items0
//
// swagger:model ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0
type ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0 struct {
// public name
PublicName string `json:"publicName,omitempty"`
// url template
URLTemplate string `json:"urlTemplate,omitempty"`
}
// Validate validates this list public frontends for account o k body public frontends items0
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this list public frontends for account o k body public frontends items0 based on context it is used
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) MarshalBinary() ([]byte, error) {
if o == nil {
return nil, nil
}
return swag.WriteJSON(o)
}
// UnmarshalBinary interface implementation
func (o *ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0) UnmarshalBinary(b []byte) error {
var res ListPublicFrontendsForAccountOKBodyPublicFrontendsItems0
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*o = res
return nil
}

View File

@ -39,6 +39,7 @@ models/ListOrganizationMembers200ResponseMembersInner.ts
models/ListOrganizations200Response.ts models/ListOrganizations200Response.ts
models/ListOrganizations200ResponseOrganizationsInner.ts models/ListOrganizations200ResponseOrganizationsInner.ts
models/ListPublicFrontendsForAccount200Response.ts models/ListPublicFrontendsForAccount200Response.ts
models/ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.ts
models/LoginRequest.ts models/LoginRequest.ts
models/Metrics.ts models/Metrics.ts
models/MetricsSample.ts models/MetricsSample.ts

View File

@ -13,6 +13,14 @@
*/ */
import { mapValues } from '../runtime'; import { mapValues } from '../runtime';
import type { ListPublicFrontendsForAccount200ResponsePublicFrontendsInner } from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
import {
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped,
} from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
/** /**
* *
* @export * @export
@ -21,16 +29,10 @@ import { mapValues } from '../runtime';
export interface ListPublicFrontendsForAccount200Response { export interface ListPublicFrontendsForAccount200Response {
/** /**
* *
* @type {string} * @type {Array<ListPublicFrontendsForAccount200ResponsePublicFrontendsInner>}
* @memberof ListPublicFrontendsForAccount200Response * @memberof ListPublicFrontendsForAccount200Response
*/ */
publicName?: string; publicFrontends?: Array<ListPublicFrontendsForAccount200ResponsePublicFrontendsInner>;
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200Response
*/
urlTemplate?: string;
} }
/** /**
@ -50,8 +52,7 @@ export function ListPublicFrontendsForAccount200ResponseFromJSONTyped(json: any,
} }
return { return {
'publicName': json['publicName'] == null ? undefined : json['publicName'], 'publicFrontends': json['publicFrontends'] == null ? undefined : ((json['publicFrontends'] as Array<any>).map(ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON)),
'urlTemplate': json['urlTemplate'] == null ? undefined : json['urlTemplate'],
}; };
} }
@ -66,8 +67,7 @@ export function ListPublicFrontendsForAccount200ResponseToJSONTyped(value?: List
return { return {
'publicName': value['publicName'], 'publicFrontends': value['publicFrontends'] == null ? undefined : ((value['publicFrontends'] as Array<any>).map(ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON)),
'urlTemplate': value['urlTemplate'],
}; };
} }

View File

@ -0,0 +1,73 @@
/* tslint:disable */
/* eslint-disable */
/**
* zrok
* zrok client access
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
export interface ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
publicName?: string;
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
urlTemplate?: string;
}
/**
* Check if a given object implements the ListPublicFrontendsForAccount200ResponsePublicFrontendsInner interface.
*/
export function instanceOfListPublicFrontendsForAccount200ResponsePublicFrontendsInner(value: object): value is ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return true;
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON(json: any): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped(json, false);
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped(json: any, ignoreDiscriminator: boolean): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
if (json == null) {
return json;
}
return {
'publicName': json['publicName'] == null ? undefined : json['publicName'],
'urlTemplate': json['urlTemplate'] == null ? undefined : json['urlTemplate'],
};
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON(json: any): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped(json, false);
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped(value?: ListPublicFrontendsForAccount200ResponsePublicFrontendsInner | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'publicName': value['publicName'],
'urlTemplate': value['urlTemplate'],
};
}

View File

@ -32,6 +32,7 @@ export * from './ListOrganizationMembers200ResponseMembersInner';
export * from './ListOrganizations200Response'; export * from './ListOrganizations200Response';
export * from './ListOrganizations200ResponseOrganizationsInner'; export * from './ListOrganizations200ResponseOrganizationsInner';
export * from './ListPublicFrontendsForAccount200Response'; export * from './ListPublicFrontendsForAccount200Response';
export * from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
export * from './LoginRequest'; export * from './LoginRequest';
export * from './Metrics'; export * from './Metrics';
export * from './MetricsSample'; export * from './MetricsSample';

View File

@ -37,6 +37,7 @@ docs/ListOrganizationMembers200ResponseMembersInner.md
docs/ListOrganizations200Response.md docs/ListOrganizations200Response.md
docs/ListOrganizations200ResponseOrganizationsInner.md docs/ListOrganizations200ResponseOrganizationsInner.md
docs/ListPublicFrontendsForAccount200Response.md docs/ListPublicFrontendsForAccount200Response.md
docs/ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.md
docs/LoginRequest.md docs/LoginRequest.md
docs/MetadataApi.md docs/MetadataApi.md
docs/Metrics.md docs/Metrics.md
@ -110,6 +111,7 @@ test/test_list_organization_members200_response_members_inner.py
test/test_list_organizations200_response.py test/test_list_organizations200_response.py
test/test_list_organizations200_response_organizations_inner.py test/test_list_organizations200_response_organizations_inner.py
test/test_list_public_frontends_for_account200_response.py test/test_list_public_frontends_for_account200_response.py
test/test_list_public_frontends_for_account200_response_public_frontends_inner.py
test/test_login_request.py test/test_login_request.py
test/test_metadata_api.py test/test_metadata_api.py
test/test_metrics.py test/test_metrics.py
@ -189,6 +191,7 @@ zrok_api/models/list_organization_members200_response_members_inner.py
zrok_api/models/list_organizations200_response.py zrok_api/models/list_organizations200_response.py
zrok_api/models/list_organizations200_response_organizations_inner.py zrok_api/models/list_organizations200_response_organizations_inner.py
zrok_api/models/list_public_frontends_for_account200_response.py zrok_api/models/list_public_frontends_for_account200_response.py
zrok_api/models/list_public_frontends_for_account200_response_public_frontends_inner.py
zrok_api/models/login_request.py zrok_api/models/login_request.py
zrok_api/models/metrics.py zrok_api/models/metrics.py
zrok_api/models/metrics_sample.py zrok_api/models/metrics_sample.py

View File

@ -187,6 +187,7 @@ Class | Method | HTTP request | Description
- [ListOrganizations200Response](docs/ListOrganizations200Response.md) - [ListOrganizations200Response](docs/ListOrganizations200Response.md)
- [ListOrganizations200ResponseOrganizationsInner](docs/ListOrganizations200ResponseOrganizationsInner.md) - [ListOrganizations200ResponseOrganizationsInner](docs/ListOrganizations200ResponseOrganizationsInner.md)
- [ListPublicFrontendsForAccount200Response](docs/ListPublicFrontendsForAccount200Response.md) - [ListPublicFrontendsForAccount200Response](docs/ListPublicFrontendsForAccount200Response.md)
- [ListPublicFrontendsForAccount200ResponsePublicFrontendsInner](docs/ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.md)
- [LoginRequest](docs/LoginRequest.md) - [LoginRequest](docs/LoginRequest.md)
- [Metrics](docs/Metrics.md) - [Metrics](docs/Metrics.md)
- [MetricsSample](docs/MetricsSample.md) - [MetricsSample](docs/MetricsSample.md)

View File

@ -5,8 +5,7 @@
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**public_name** | **str** | | [optional] **public_frontends** | [**List[ListPublicFrontendsForAccount200ResponsePublicFrontendsInner]**](ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.md) | | [optional]
**url_template** | **str** | | [optional]
## Example ## Example

View File

@ -0,0 +1,30 @@
# ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**public_name** | **str** | | [optional]
**url_template** | **str** | | [optional]
## Example
```python
from zrok_api.models.list_public_frontends_for_account200_response_public_frontends_inner import ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
# TODO update the JSON string below
json = "{}"
# create an instance of ListPublicFrontendsForAccount200ResponsePublicFrontendsInner from a JSON string
list_public_frontends_for_account200_response_public_frontends_inner_instance = ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.from_json(json)
# print the JSON string representation of the object
print(ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.to_json())
# convert the object into a dict
list_public_frontends_for_account200_response_public_frontends_inner_dict = list_public_frontends_for_account200_response_public_frontends_inner_instance.to_dict()
# create an instance of ListPublicFrontendsForAccount200ResponsePublicFrontendsInner from a dict
list_public_frontends_for_account200_response_public_frontends_inner_from_dict = ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.from_dict(list_public_frontends_for_account200_response_public_frontends_inner_dict)
```
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -35,8 +35,11 @@ class TestListPublicFrontendsForAccount200Response(unittest.TestCase):
model = ListPublicFrontendsForAccount200Response() model = ListPublicFrontendsForAccount200Response()
if include_optional: if include_optional:
return ListPublicFrontendsForAccount200Response( return ListPublicFrontendsForAccount200Response(
public_name = '', public_frontends = [
url_template = '' zrok_api.models.list_public_frontends_for_account_200_response_public_frontends_inner.listPublicFrontendsForAccount_200_response_publicFrontends_inner(
public_name = '',
url_template = '', )
]
) )
else: else:
return ListPublicFrontendsForAccount200Response( return ListPublicFrontendsForAccount200Response(

View File

@ -0,0 +1,52 @@
# coding: utf-8
"""
zrok
zrok client access
The version of the OpenAPI document: 1.0.0
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
import unittest
from zrok_api.models.list_public_frontends_for_account200_response_public_frontends_inner import ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
class TestListPublicFrontendsForAccount200ResponsePublicFrontendsInner(unittest.TestCase):
"""ListPublicFrontendsForAccount200ResponsePublicFrontendsInner unit test stubs"""
def setUp(self):
pass
def tearDown(self):
pass
def make_instance(self, include_optional) -> ListPublicFrontendsForAccount200ResponsePublicFrontendsInner:
"""Test ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
include_optional is a boolean, when False only required
params are included, when True both required and
optional params are included """
# uncomment below to create an instance of `ListPublicFrontendsForAccount200ResponsePublicFrontendsInner`
"""
model = ListPublicFrontendsForAccount200ResponsePublicFrontendsInner()
if include_optional:
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInner(
public_name = '',
url_template = ''
)
else:
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInner(
)
"""
def testListPublicFrontendsForAccount200ResponsePublicFrontendsInner(self):
"""Test ListPublicFrontendsForAccount200ResponsePublicFrontendsInner"""
# inst_req_only = self.make_instance(include_optional=False)
# inst_req_and_optional = self.make_instance(include_optional=True)
if __name__ == '__main__':
unittest.main()

View File

@ -69,6 +69,7 @@ from zrok_api.models.list_organization_members200_response_members_inner import
from zrok_api.models.list_organizations200_response import ListOrganizations200Response from zrok_api.models.list_organizations200_response import ListOrganizations200Response
from zrok_api.models.list_organizations200_response_organizations_inner import ListOrganizations200ResponseOrganizationsInner from zrok_api.models.list_organizations200_response_organizations_inner import ListOrganizations200ResponseOrganizationsInner
from zrok_api.models.list_public_frontends_for_account200_response import ListPublicFrontendsForAccount200Response from zrok_api.models.list_public_frontends_for_account200_response import ListPublicFrontendsForAccount200Response
from zrok_api.models.list_public_frontends_for_account200_response_public_frontends_inner import ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
from zrok_api.models.login_request import LoginRequest from zrok_api.models.login_request import LoginRequest
from zrok_api.models.metrics import Metrics from zrok_api.models.metrics import Metrics
from zrok_api.models.metrics_sample import MetricsSample from zrok_api.models.metrics_sample import MetricsSample

View File

@ -47,6 +47,7 @@ from zrok_api.models.list_organization_members200_response_members_inner import
from zrok_api.models.list_organizations200_response import ListOrganizations200Response from zrok_api.models.list_organizations200_response import ListOrganizations200Response
from zrok_api.models.list_organizations200_response_organizations_inner import ListOrganizations200ResponseOrganizationsInner from zrok_api.models.list_organizations200_response_organizations_inner import ListOrganizations200ResponseOrganizationsInner
from zrok_api.models.list_public_frontends_for_account200_response import ListPublicFrontendsForAccount200Response from zrok_api.models.list_public_frontends_for_account200_response import ListPublicFrontendsForAccount200Response
from zrok_api.models.list_public_frontends_for_account200_response_public_frontends_inner import ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
from zrok_api.models.login_request import LoginRequest from zrok_api.models.login_request import LoginRequest
from zrok_api.models.metrics import Metrics from zrok_api.models.metrics import Metrics
from zrok_api.models.metrics_sample import MetricsSample from zrok_api.models.metrics_sample import MetricsSample

View File

@ -17,8 +17,9 @@ import pprint
import re # noqa: F401 import re # noqa: F401
import json import json
from pydantic import BaseModel, ConfigDict, Field, StrictStr from pydantic import BaseModel, ConfigDict, Field
from typing import Any, ClassVar, Dict, List, Optional from typing import Any, ClassVar, Dict, List, Optional
from zrok_api.models.list_public_frontends_for_account200_response_public_frontends_inner import ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
from typing import Optional, Set from typing import Optional, Set
from typing_extensions import Self from typing_extensions import Self
@ -26,9 +27,8 @@ class ListPublicFrontendsForAccount200Response(BaseModel):
""" """
ListPublicFrontendsForAccount200Response ListPublicFrontendsForAccount200Response
""" # noqa: E501 """ # noqa: E501
public_name: Optional[StrictStr] = Field(default=None, alias="publicName") public_frontends: Optional[List[ListPublicFrontendsForAccount200ResponsePublicFrontendsInner]] = Field(default=None, alias="publicFrontends")
url_template: Optional[StrictStr] = Field(default=None, alias="urlTemplate") __properties: ClassVar[List[str]] = ["publicFrontends"]
__properties: ClassVar[List[str]] = ["publicName", "urlTemplate"]
model_config = ConfigDict( model_config = ConfigDict(
populate_by_name=True, populate_by_name=True,
@ -69,6 +69,13 @@ class ListPublicFrontendsForAccount200Response(BaseModel):
exclude=excluded_fields, exclude=excluded_fields,
exclude_none=True, exclude_none=True,
) )
# override the default output from pydantic by calling `to_dict()` of each item in public_frontends (list)
_items = []
if self.public_frontends:
for _item_public_frontends in self.public_frontends:
if _item_public_frontends:
_items.append(_item_public_frontends.to_dict())
_dict['publicFrontends'] = _items
return _dict return _dict
@classmethod @classmethod
@ -81,8 +88,7 @@ class ListPublicFrontendsForAccount200Response(BaseModel):
return cls.model_validate(obj) return cls.model_validate(obj)
_obj = cls.model_validate({ _obj = cls.model_validate({
"publicName": obj.get("publicName"), "publicFrontends": [ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.from_dict(_item) for _item in obj["publicFrontends"]] if obj.get("publicFrontends") is not None else None
"urlTemplate": obj.get("urlTemplate")
}) })
return _obj return _obj

View File

@ -0,0 +1,89 @@
# coding: utf-8
"""
zrok
zrok client access
The version of the OpenAPI document: 1.0.0
Generated by OpenAPI Generator (https://openapi-generator.tech)
Do not edit the class manually.
""" # noqa: E501
from __future__ import annotations
import pprint
import re # noqa: F401
import json
from pydantic import BaseModel, ConfigDict, Field, StrictStr
from typing import Any, ClassVar, Dict, List, Optional
from typing import Optional, Set
from typing_extensions import Self
class ListPublicFrontendsForAccount200ResponsePublicFrontendsInner(BaseModel):
"""
ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
""" # noqa: E501
public_name: Optional[StrictStr] = Field(default=None, alias="publicName")
url_template: Optional[StrictStr] = Field(default=None, alias="urlTemplate")
__properties: ClassVar[List[str]] = ["publicName", "urlTemplate"]
model_config = ConfigDict(
populate_by_name=True,
validate_assignment=True,
protected_namespaces=(),
)
def to_str(self) -> str:
"""Returns the string representation of the model using alias"""
return pprint.pformat(self.model_dump(by_alias=True))
def to_json(self) -> str:
"""Returns the JSON representation of the model using alias"""
# TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
return json.dumps(self.to_dict())
@classmethod
def from_json(cls, json_str: str) -> Optional[Self]:
"""Create an instance of ListPublicFrontendsForAccount200ResponsePublicFrontendsInner from a JSON string"""
return cls.from_dict(json.loads(json_str))
def to_dict(self) -> Dict[str, Any]:
"""Return the dictionary representation of the model using alias.
This has the following differences from calling pydantic's
`self.model_dump(by_alias=True)`:
* `None` is only added to the output dict for nullable fields that
were set at model initialization. Other fields with value `None`
are ignored.
"""
excluded_fields: Set[str] = set([
])
_dict = self.model_dump(
by_alias=True,
exclude=excluded_fields,
exclude_none=True,
)
return _dict
@classmethod
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
"""Create an instance of ListPublicFrontendsForAccount200ResponsePublicFrontendsInner from a dict"""
if obj is None:
return None
if not isinstance(obj, dict):
return cls.model_validate(obj)
_obj = cls.model_validate({
"publicName": obj.get("publicName"),
"urlTemplate": obj.get("urlTemplate")
})
return _obj

View File

@ -1266,10 +1266,15 @@ paths:
description: public frontends list returned description: public frontends list returned
schema: schema:
properties: properties:
publicName: publicFrontends:
type: string type: array
urlTemplate: items:
type: string type: object
properties:
publicName:
type: string
urlTemplate:
type: string
401: 401:
description: unauthorized description: unauthorized
500: 500:

View File

@ -39,6 +39,7 @@ models/ListOrganizationMembers200ResponseMembersInner.ts
models/ListOrganizations200Response.ts models/ListOrganizations200Response.ts
models/ListOrganizations200ResponseOrganizationsInner.ts models/ListOrganizations200ResponseOrganizationsInner.ts
models/ListPublicFrontendsForAccount200Response.ts models/ListPublicFrontendsForAccount200Response.ts
models/ListPublicFrontendsForAccount200ResponsePublicFrontendsInner.ts
models/LoginRequest.ts models/LoginRequest.ts
models/Metrics.ts models/Metrics.ts
models/MetricsSample.ts models/MetricsSample.ts

View File

@ -13,6 +13,14 @@
*/ */
import { mapValues } from '../runtime'; import { mapValues } from '../runtime';
import type { ListPublicFrontendsForAccount200ResponsePublicFrontendsInner } from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
import {
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON,
ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped,
} from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
/** /**
* *
* @export * @export
@ -21,16 +29,10 @@ import { mapValues } from '../runtime';
export interface ListPublicFrontendsForAccount200Response { export interface ListPublicFrontendsForAccount200Response {
/** /**
* *
* @type {string} * @type {Array<ListPublicFrontendsForAccount200ResponsePublicFrontendsInner>}
* @memberof ListPublicFrontendsForAccount200Response * @memberof ListPublicFrontendsForAccount200Response
*/ */
publicName?: string; publicFrontends?: Array<ListPublicFrontendsForAccount200ResponsePublicFrontendsInner>;
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200Response
*/
urlTemplate?: string;
} }
/** /**
@ -50,8 +52,7 @@ export function ListPublicFrontendsForAccount200ResponseFromJSONTyped(json: any,
} }
return { return {
'publicName': json['publicName'] == null ? undefined : json['publicName'], 'publicFrontends': json['publicFrontends'] == null ? undefined : ((json['publicFrontends'] as Array<any>).map(ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON)),
'urlTemplate': json['urlTemplate'] == null ? undefined : json['urlTemplate'],
}; };
} }
@ -66,8 +67,7 @@ export function ListPublicFrontendsForAccount200ResponseToJSONTyped(value?: List
return { return {
'publicName': value['publicName'], 'publicFrontends': value['publicFrontends'] == null ? undefined : ((value['publicFrontends'] as Array<any>).map(ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON)),
'urlTemplate': value['urlTemplate'],
}; };
} }

View File

@ -0,0 +1,73 @@
/* tslint:disable */
/* eslint-disable */
/**
* zrok
* zrok client access
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
export interface ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
publicName?: string;
/**
*
* @type {string}
* @memberof ListPublicFrontendsForAccount200ResponsePublicFrontendsInner
*/
urlTemplate?: string;
}
/**
* Check if a given object implements the ListPublicFrontendsForAccount200ResponsePublicFrontendsInner interface.
*/
export function instanceOfListPublicFrontendsForAccount200ResponsePublicFrontendsInner(value: object): value is ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return true;
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSON(json: any): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped(json, false);
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerFromJSONTyped(json: any, ignoreDiscriminator: boolean): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
if (json == null) {
return json;
}
return {
'publicName': json['publicName'] == null ? undefined : json['publicName'],
'urlTemplate': json['urlTemplate'] == null ? undefined : json['urlTemplate'],
};
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSON(json: any): ListPublicFrontendsForAccount200ResponsePublicFrontendsInner {
return ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped(json, false);
}
export function ListPublicFrontendsForAccount200ResponsePublicFrontendsInnerToJSONTyped(value?: ListPublicFrontendsForAccount200ResponsePublicFrontendsInner | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'publicName': value['publicName'],
'urlTemplate': value['urlTemplate'],
};
}

View File

@ -32,6 +32,7 @@ export * from './ListOrganizationMembers200ResponseMembersInner';
export * from './ListOrganizations200Response'; export * from './ListOrganizations200Response';
export * from './ListOrganizations200ResponseOrganizationsInner'; export * from './ListOrganizations200ResponseOrganizationsInner';
export * from './ListPublicFrontendsForAccount200Response'; export * from './ListPublicFrontendsForAccount200Response';
export * from './ListPublicFrontendsForAccount200ResponsePublicFrontendsInner';
export * from './LoginRequest'; export * from './LoginRequest';
export * from './Metrics'; export * from './Metrics';
export * from './MetricsSample'; export * from './MetricsSample';