v0.1.10 Quick fixes for routes and validations

This commit is contained in:
Yann Stepienik 2023-04-07 15:04:42 +01:00
parent 2eac6fbd3a
commit 77bfe683aa
6 changed files with 62 additions and 16 deletions

View file

@ -31,6 +31,14 @@ import RestartModal from './restart';
import RouteManagement, {ValidateRoute} from './routeman'; import RouteManagement, {ValidateRoute} from './routeman';
import { map } from 'lodash'; import { map } from 'lodash';
const stickyButton = {
position: 'fixed',
bottom: '20px',
left: '20px',
right: '20px',
boxShadow: '0px 0px 10px 0px rgba(0,0,0,0.50)',
}
const ProxyManagement = () => { const ProxyManagement = () => {
isLoggedIn(); isLoggedIn();
@ -38,7 +46,8 @@ const ProxyManagement = () => {
const [openModal, setOpenModal] = React.useState(false); const [openModal, setOpenModal] = React.useState(false);
const [error, setError] = React.useState(null); const [error, setError] = React.useState(null);
const [submitErrors, setSubmitErrors] = React.useState([]); const [submitErrors, setSubmitErrors] = React.useState([]);
const [needSave, setNeedSave] = React.useState(false);
function updateRoutes(routes) { function updateRoutes(routes) {
let con = { let con = {
...config, ...config,
@ -51,6 +60,7 @@ const ProxyManagement = () => {
}, },
}; };
setConfig(con); setConfig(con);
setNeedSave(true);
return con; return con;
} }
@ -134,6 +144,7 @@ const ProxyManagement = () => {
<RouteManagement key={key} routeConfig={route} <RouteManagement key={key} routeConfig={route}
setRouteConfig={(newRoute) => { setRouteConfig={(newRoute) => {
routes[key] = newRoute; routes[key] = newRoute;
setNeedSave(true);
}} }}
up={() => up(key)} up={() => up(key)}
down={() => down(key)} down={() => down(key)}
@ -142,20 +153,21 @@ const ProxyManagement = () => {
<br /><br /> <br /><br />
</>))} </>))}
{routes && {routes && needSave &&
<div style={stickyButton}>
<MainCard> <MainCard>
{error && ( {error && (
<Grid item xs={12}> <Grid item xs={12}>
<FormHelperText error>{error}</FormHelperText> <FormHelperText error>{error}</FormHelperText>
</Grid> </Grid>
)} )}
<Grid item xs={12}>
<Stack spacing={1}> <Stack spacing={1}>
{submitErrors.map((err) => { {submitErrors.map((err) => {
return <Alert severity="error">{err}</Alert> return <Alert severity="error">{err}</Alert>
})} })}
<AnimateButton> <AnimateButton>
<Button <Button
className='shinyButton'
disableElevation disableElevation
fullWidth fullWidth
onClick={() => { onClick={() => {
@ -174,6 +186,7 @@ const ProxyManagement = () => {
setSubmitErrors([]); setSubmitErrors([]);
} }
API.config.set(cleanRoutes(updateRoutes(routes))).then(() => { API.config.set(cleanRoutes(updateRoutes(routes))).then(() => {
setNeedSave(false);
setOpenModal(true); setOpenModal(true);
}).catch((err) => { }).catch((err) => {
console.log(err); console.log(err);
@ -189,8 +202,8 @@ const ProxyManagement = () => {
</Button> </Button>
</AnimateButton> </AnimateButton>
</Stack> </Stack>
</Grid>
</MainCard> </MainCard>
</div>
} }
{!routes && <> {!routes && <>
<Typography variant="h6" gutterBottom component="div"> <Typography variant="h6" gutterBottom component="div">

View file

@ -86,7 +86,7 @@ const RouteManagement = ({ routeConfig, TargetContainer, noControls=false, lockT
return false; return false;
}} }}
validate={(values) => { validate={(values) => {
//setRouteConfig(values); setRouteConfig(values);
}} }}
> >
{(formik) => ( {(formik) => (

View file

@ -10,7 +10,7 @@ import { styled } from '@mui/material/styles';
import * as API from '../../api'; import * as API from '../../api';
import isLoggedIn from '../../isLoggedIn'; import isLoggedIn from '../../isLoggedIn';
import RestartModal from '../config/users/restart'; import RestartModal from '../config/users/restart';
import RouteManagement from '../config/users/routeman'; import RouteManagement, { ValidateRoute } from '../config/users/routeman';
const Item = styled(Paper)(({ theme }) => ({ const Item = styled(Paper)(({ theme }) => ({
backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff',
@ -29,6 +29,7 @@ const ServeApps = () => {
const [config, setConfig] = useState(null); const [config, setConfig] = useState(null);
const [openModal, setOpenModal] = useState(false); const [openModal, setOpenModal] = useState(false);
const [newRoute, setNewRoute] = useState(null); const [newRoute, setNewRoute] = useState(null);
const [submitErrors, setSubmitErrors] = useState([]);
const [openRestartModal, setOpenRestartModal] = useState(false); const [openRestartModal, setOpenRestartModal] = useState(false);
const hasCosmosNetwork = (containerName) => { const hasCosmosNetwork = (containerName) => {
@ -41,6 +42,15 @@ const ServeApps = () => {
}) })
} }
const testRoute = (route) => {
console.log(newRoute)
try {
ValidateRoute.validateSync(route);
} catch (e) {
return e.errors;
}
}
const refreshServeApps = () => { const refreshServeApps = () => {
API.docker.list().then((res) => { API.docker.list().then((res) => {
setServeApps(res.data); setServeApps(res.data);
@ -146,9 +156,25 @@ const ServeApps = () => {
</DialogContentText> </DialogContentText>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
{submitErrors && submitErrors.length > 0 && <Stack spacing={2} direction={"column"}>
<Alert severity="error">{submitErrors.map((err) => {
return <div>{err}</div>
})}</Alert>
</Stack>}
<Button onClick={() => setOpenModal(false)}>Cancel</Button> <Button onClick={() => setOpenModal(false)}>Cancel</Button>
<Button onClick={() => { <Button onClick={() => {
updateRoutes() let errors = testRoute(newRoute);
if (errors && errors.length > 0) {
errors = errors.map((err) => {
return `${err}`;
});
setSubmitErrors(errors);
return true;
} else {
setSubmitErrors([]);
updateRoutes();
}
}}>Connect</Button> }}>Connect</Button>
</DialogActions> </DialogActions>
</>} </>}

View file

@ -40,6 +40,13 @@ func LoadConfig() utils.Config {
utils.Fatal("Reading Config File: " + errString, err) utils.Fatal("Reading Config File: " + errString, err)
} }
// check if config is valid
utils.Log("Validating config file...")
err = utils.Validate.Struct(config)
if err != nil {
utils.Fatal("Reading Config File: " + err.Error(), err)
}
utils.LoadBaseMainConfig(config) utils.LoadBaseMainConfig(config)
return config return config

View file

@ -71,25 +71,25 @@ type User struct {
} }
type Config struct { type Config struct {
LoggingLevel LoggingLevel `validate:"oneof=DEBUG INFO WARNING ERROR"` LoggingLevel LoggingLevel `required,validate:"oneof=DEBUG INFO WARNING ERROR"`
MongoDB string MongoDB string
HTTPConfig HTTPConfig
DisableUserManagement bool DisableUserManagement bool
NewInstall bool NewInstall bool `validate:"boolean"`
HTTPConfig HTTPConfig `validate:"required,dive,required"`
} }
type HTTPConfig struct { type HTTPConfig struct {
TLSCert string TLSCert string `validate:"omitempty,contains=\n`
TLSKey string TLSKey string
AuthPrivateKey string AuthPrivateKey string
AuthPublicKey string AuthPublicKey string
GenerateMissingAuthCert bool GenerateMissingAuthCert bool
HTTPSCertificateMode string HTTPSCertificateMode string
HTTPPort string HTTPPort string `validate:"required,containsany=0123456789,min=1,max=6"`
HTTPSPort string HTTPSPort string `validate:"required,containsany=0123456789,min=1,max=6"`
ProxyConfig ProxyConfig ProxyConfig ProxyConfig
Hostname string Hostname string `validate:"required,excludesall=0x2C/ "`
SSLEmail string SSLEmail string `validate:"omitempty,email"`
} }
type ProxyConfig struct { type ProxyConfig struct {

View file

@ -2,4 +2,4 @@ package utils
import "github.com/go-playground/validator/v10" import "github.com/go-playground/validator/v10"
var Validate = validator.New() var Validate = validator.New()