feat: add Node.js guestbook skeleton

This commit is contained in:
2025-01-27 13:25:14 -07:00
committed by GitHub
parent c88c9681f4
commit d7a45a2452
6 changed files with 120 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
# Node modules
node_modules/
# Environment files or credentials
.env
credentials.json
+20
View File
@@ -0,0 +1,20 @@
# Use a lightweight Node image
FROM node:18-alpine
# Create app directory
WORKDIR /app
# Copy package.json first to leverage Docker caching
COPY package.json .
# Install dependencies
RUN npm install
# Copy the rest of the application files
COPY . .
# Expose port 3000 (the port your Node app will run on)
EXPOSE 3000
# Start the server
CMD ["node", "app.js"]
+35
View File
@@ -0,0 +1,35 @@
This is a simple kiosk landing page that embeds a Google Form and displays approved submissions on a scrolling ticker.
Features
Embeds an existing Google Form in an iframe
Fetches approved entries (Name, Location, Comment) from an API endpoint
Displays approved entries in a scrolling ticker at the bottom of the page
Getting Started
Install Node.js if not using Docker.
Clone this repo and change to the project folder.
Install dependencies:
` npm install `
Run locally:
` node app.js `
Or:
` npm start `
Then open http://localhost:3000 in your browser.
Running in Docker
Build the image:
` docker build -t museum-kiosk . `
Run a container:
` docker run -p 3000:3000 museum-kiosk `
Then open http://localhost:3000 (or the servers IP) in your browser.
Configuration
Google Sheets API credentials: Place them as credentials.json (this file should remain uncommitted).
Adjust environment variables or code as needed for your specific form and sheet.
License
MIT License. See LICENSE for details.
+31
View File
@@ -0,0 +1,31 @@
const express = require('express');
const path = require('path');
// const { google } = require('googleapis'); // only if you're using Google Sheets API
const app = express();
const PORT = process.env.PORT || 3000;
// Serve static files from the 'public' folder
app.use(express.static(path.join(__dirname, 'public')));
// Example route to serve index.html
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
// Example (placeholder) route for approved data
app.get('/api/approved', async (req, res) => {
// TODO: connect to Google Sheets or n8n to fetch approved entries
// For now, just return some sample data
const dummyData = [
{ name: 'Alice', location: 'Paris', comment: 'Loving this exhibit!' },
{ name: 'Bob', location: 'New York', comment: 'Very insightful museum.' }
];
res.json(dummyData);
});
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
+28
View File
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Museum Kiosk</title>
<link rel="stylesheet" href="public/style.css" />
</head>
<body>
<h1>Welcome to the Museum!</h1>
<!-- Embedded Google Form IFrame -->
<iframe
src="https://docs.google.com/forms/d/e/1FAIpQLSekn1-da42vLyOAMDwfswxNOtDsPFaiuYABBe9XqhhEssBndw/viewform?embedded=true"
width="100%" height="600" frameborder="0" style="border: none;">
Loading…
</iframe>
<!-- Ticker Container -->
<div id="ticker-container">
<div id="ticker-content">Loading submissions...</div>
</div>
<script src="public/script.js"></script>
</body>
</html>
View File