Skip to content

Commit

Permalink
improved schema check and error messages
Browse files Browse the repository at this point in the history
  • Loading branch information
vcmirko committed Jun 18, 2024
1 parent 94bc2fe commit 7d1b007
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 24 deletions.
11 changes: 9 additions & 2 deletions client/src/views/Schema.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<div class="notification is-danger" v-if="error!=''" v-text="error"></div>
<div class="notification is-success" v-if="success" v-html="success"></div>
<div class="notification is-warning" v-if="failed" v-html="failed"></div>
<form action="" class="box" v-if="error!='FATAL ERROR' && error!=''">
<form action="" class="box" v-if="error!='FATAL ERROR' && error!='' && success==''">
<div class="content">
If this is the first time setup and you don't have your own schema and tables.<br><br>
Would you like me to try and create the schema and tables ?<br>
Expand All @@ -28,6 +28,13 @@
</button>
</div>
</form>
<form action="" class="box" v-else>
<div class="content">
It appears that you have an unuseable schema. Part of the tables is present, and part is missing.<br>
Please contact your database or application administrator to either restore from a backup, or create the missing tables.
For now there is nothing I can do for you, until the schema and tables are in a consistent state.
</div>
</form>
<div v-if="error=='FATAL ERROR'" class="box">
<div class="content">
Something went wrong. Most likely the database is simply not reachable.
Expand Down Expand Up @@ -67,7 +74,7 @@
},
failed(){
if(Array.isArray(this.errorData.error)){
return this.errorData.error.map((e)=>{return e.message}).join('<br>')
return this.errorData.error.join('<br>')
}else {
return this.errorData.error
}
Expand Down
4 changes: 3 additions & 1 deletion server/src/controllers/schema.controller.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
'use strict';
const Schema = require('../models/schema.model');
var RestResult = require('../models/restResult.model');
var util = require('util');

exports.hasSchema = function(req, res) {
Schema.hasSchema()
.then((result)=>{ res.json(new RestResult("success","schema and tables are ok",result.data?.success,result.data?.failed)) })
.catch((result)=>{
.catch((err)=>{
var result = err.result // we check if the error has a result
if(!result?.data){
res.json(new RestResult("error","FATAL ERROR",[],[result.message]))
}else{
Expand Down
67 changes: 54 additions & 13 deletions server/src/init/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,69 @@ async function init(){
var Ssh = require('../models/ssh.model');
var Form = require('../models/form.model');
var Job = require('../models/job.model');
var Schema = require('../models/schema.model');
const mysql=require("../models/db.model");
const Repository = require('../models/repository.model');
const parser = require("cron-parser")
const dayjs = require("dayjs")
const util = require('util')

// this is at startup, don't start the app until mysql is ready
// rewrite with await
console.log("Waiting for mysql to start")
async function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
// this is at startup, don't start the app until mysql is ready
// rewrite with await
logger.info("Waiting for mysql to start")
async function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
var MYSQL_IS_READY = false
while(!MYSQL_IS_READY){
try{
await mysql.do("SELECT 1")
MYSQL_IS_READY = true
}catch(e){
logger.log("Mysql not ready yet")
await sleep(5000)
}
var MYSQL_IS_READY = false
while(!MYSQL_IS_READY){
try{
await mysql.do("SELECT 1")
MYSQL_IS_READY = true
}catch(e){
console.log("Mysql not ready yet")
await sleep(5000)
}

logger.info("Mysql is ready")

// check Schema
try{
var schemaresult = await Schema.hasSchema()
if(schemaresult.data.failed.length>0){
logger.warning("Schema is not up to date")
for(let i=0;i<schemaresult.data.success.length;i++){
logger.info(schemaresult.data.success[i])
}
for(let i=0;i<schemaresult.data.failed.length;i++){
logger.error(schemaresult.data.failed[i])
}
}else{
logger.info("Schema is up to date")
// for(let i=0;i<schemaresult.data.success.length;i++){
// logger.info(schemaresult.data.success[i])
// }
}

}catch(err){
var result = err.result
if(result?.data){
if(result.data.failed.length>0){
for(let i=0;i<result.data.success.length;i++){
logger.info(result.data.success[i])
}
for(let i=0;i<result.data.failed.length;i++){
logger.error(result.data.failed[i])
}
}
}else{
logger.error("Fatal error : " + err)
throw err
}

}


Ssh.generate(false)
.catch((err)=>{
logger.warning("Failed to generate ssh keys : " + err)
Expand Down
26 changes: 18 additions & 8 deletions server/src/models/schema.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
const bcrypt = require('bcrypt');
const logger=require("../lib/logger");
const mysql = require("./db.model")
const Helpers = require("../lib/common")
const fs = require('fs');
const NodeCache = require("node-cache")

Expand All @@ -13,8 +14,7 @@ const cache = new NodeCache({
var Schema=function(){
};
function handleError(err){
logger.error(err.toString())
throw(err)
throw err
}

function checkSchema(){
Expand All @@ -31,7 +31,9 @@ function checkSchema(){
}else{
message=`Schema '${db}' is not present`
logger.warning(message)
throw({message:message,data:{success:"",failed:message}})
var err = new Error(message)
err.result = {message:[message],data:{success:[],failed:[message]}}
throw err
}
}
})
Expand Down Expand Up @@ -223,7 +225,7 @@ function checkTable(table){
}else{
message=`Table '${table}' is not present`
logger.warning(message)
throw({message:message,data:{success:"",failed:message}})
throw new Error(message)
}
})

Expand Down Expand Up @@ -353,7 +355,7 @@ function checkAll(){
if(x.status === "fulfilled")
success.push(x.v)
if(x.status === "rejected")
failed.push(x.e)
failed.push(x.e.message)
})
messages=messages.concat(success).concat(failed); // overal message
if(failed.length==0){
Expand All @@ -367,10 +369,14 @@ function checkAll(){
}).catch((res)=>{
messages=messages.concat(res)
failed=failed.concat(res)
throw({message:messages,data:{success:"",failed:failed}}) // throw failed
var err = new Error(messages.toString())
err.result = {message:messages,data:{success:[],failed:failed}}
throw err
})
}else {
throw({message:messages,data:{success:success,failed:failed}}) // throw failed
var err = new Error(messages.toString())
err.result = {message:messages,data:{success:success,failed:failed}}
throw err // throw failed
}
},
handleError
Expand All @@ -383,14 +389,18 @@ Schema.create = function () {
logger.notice(`Trying to create database schema 'AnsibleForms' and tables`)
const buffer=fs.readFileSync(`${__dirname}/../db/create_schema_and_tables.sql`)
const query=buffer.toString();
cache.del('result') // clear cache
return mysql.do(query)
.then((res)=>{
if(res.length > 0){
logger.notice(`Created schema 'AnsibleForms' and tables`)
return `Created schema 'AnsibleForms' and tables`
}else{
throw {message:`Failed to create schema 'AnsibleForms' and/or tables`,data:{success:"",failed:`Failed to create schema 'AnsibleForms' and/or tables`}}
var err = new Error(`Failed to create schema 'AnsibleForms' and/or tables`)
err.result = {message:[`Failed to create schema 'AnsibleForms' and/or tables`],data:{success:[],failed:[`Failed to create schema 'AnsibleForms' and/or tables`]}}
throw err
}

})
};

Expand Down

0 comments on commit 7d1b007

Please sign in to comment.