Integrate complete Candidat platform with ASP.NET chatbot service
- Added Next.js frontend for candidate interviews - Added Node.js backend with TypeScript and AI integration - Added ASP.NET Core chatbot service for specialized AI conversations - Added MySQL database with complete schema - Added Nginx reverse proxy configuration - Complete Docker Compose orchestration for all services - Environment configuration for production, development, and Cloudflare - Comprehensive documentation and setup instructions - Flattened nested folder structures for clean organization - Integrated chatbot service with fallback to direct AI calls
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Swagger UI</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700"
|
||||
rel="stylesheet">
|
||||
<link rel="stylesheet" type="text/css" href="./swagger-ui.css">
|
||||
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32"/>
|
||||
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16"/>
|
||||
<style>
|
||||
<% if (!showExplorer) { %>
|
||||
.swagger-ui .topbar .download-url-wrapper {
|
||||
display: none
|
||||
}
|
||||
<% } %>
|
||||
</style>
|
||||
<% if (cssPath) { %>
|
||||
<link rel="stylesheet" type="text/css" href="<%= cssPath %>">
|
||||
<% } %>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="swagger-ui"></div>
|
||||
|
||||
<script src="./swagger-ui-bundle.js"></script>
|
||||
<script src="./swagger-ui-standalone-preset.js"></script>
|
||||
|
||||
<script>
|
||||
const initialOptions = <%- JSON.stringify(swaggerOptions) %>;
|
||||
const currentUrl = window.origin + "<%- url %>";
|
||||
const urls = <%- JSON.stringify(urls) %>
|
||||
.map(function (o) {
|
||||
if (!o.url.match(/^https?:/)) {
|
||||
const url = window.origin + o.url;
|
||||
return {
|
||||
name: o.name,
|
||||
url: url,
|
||||
selected: url === currentUrl
|
||||
}
|
||||
}
|
||||
return o;
|
||||
})
|
||||
.sort(function (a, b) {
|
||||
return a.selected ? -1 : 1
|
||||
});
|
||||
|
||||
const SwaggerUIBuilder = {
|
||||
config: Object.assign({
|
||||
urls: urls,
|
||||
dom_id: '#swagger-ui',
|
||||
deepLinking: true,
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis,
|
||||
SwaggerUIStandalonePreset
|
||||
],
|
||||
plugins: [
|
||||
SwaggerUIBundle.plugins.DownloadUrl
|
||||
],
|
||||
layout: "StandaloneLayout",
|
||||
oauth2RedirectUrl: currentUrl.replace('swagger.json', 'oauth2-redirect.html')
|
||||
}, initialOptions),
|
||||
/**
|
||||
*
|
||||
*/
|
||||
init: function () {
|
||||
this.ui = SwaggerUIBundle(this.config);
|
||||
|
||||
if (this.config.oauth) {
|
||||
this.ui.initOAuth(this.config.oauth);
|
||||
}
|
||||
|
||||
if (this.config.authorize) {
|
||||
this.ui.authActions.authorize(this.config.authorize);
|
||||
}
|
||||
|
||||
window.ui = this.ui;
|
||||
|
||||
const event = new Event('swagger.init');
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
<% if (jsPath) { %>
|
||||
<script src="<%= jsPath %>"></script>
|
||||
<% } %>
|
||||
<script>
|
||||
window.onload = function () {
|
||||
SwaggerUIBuilder.init();
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,100 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title>client</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700" rel="stylesheet" />
|
||||
<style>
|
||||
body, h1 {
|
||||
font-family: Source Sans Pro,sans-serif;
|
||||
}
|
||||
body:after {
|
||||
content: "";
|
||||
background-image: radial-gradient(#eef2f5 0,#f4f7f8 40%,transparent 75%);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 60%;
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
.container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.container-logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
.container-logo img {
|
||||
max-width: 150px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
ul li a {
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
padding-top: .25rem;
|
||||
padding-bottom: .25rem;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
border: 2px solid #504747;
|
||||
min-width: 110px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
display: block;
|
||||
border-radius: 1rem;
|
||||
color: #504747;
|
||||
text-decoration: none;
|
||||
transition: all ease-in-out 0.5s;
|
||||
}
|
||||
ul li a:hover {
|
||||
color: #14a5c2;
|
||||
border-color: #14a5c2;
|
||||
}
|
||||
ul li a span {
|
||||
margin: .25rem;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div>
|
||||
<div class="container-logo">
|
||||
<img src="https://tsed.dev/tsed-og.png" alt="Ts.ED">
|
||||
</div>
|
||||
|
||||
<ul>
|
||||
<% docs.forEach((doc) => { %>
|
||||
|
||||
<li><a href="<%= doc.path %>"><span>OpenSpec <%= doc.specVersion %></span></a></li>
|
||||
|
||||
<% }) %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user