| 1 | const auth = require('../lib/auth'); |
| 2 | const data = require('../lib/data'); |
| 3 | const render = require('../lib/render'); |
| 4 | const respond = require('../lib/respond'); |
| 5 | const config = require('../lib/config'); |
| 6 | const validate = require('../lib/validate'); |
| 7 | |
| 8 | function home(req, res) { |
| 9 | const session = auth.getSession(req); |
| 10 | const repos = data.repos().values() |
| 11 | .filter(r => r.visibility === 'public') |
| 12 | .sort((a, b) => b.createdAt - a.createdAt) |
| 13 | .slice(0, 20); |
| 14 | |
| 15 | const repoCards = repos.map(r => { |
| 16 | const date = r.createdAt ? new Date(r.createdAt).toISOString().slice(0, 10) : ''; |
| 17 | const tag = r.visibility === 'private' |
| 18 | ? '<span class="vis-badge private">private</span>' |
| 19 | : '<span class="vis-badge public">public</span>'; |
| 20 | return `<div class="repo-card"> |
| 21 | <div class="repo-card-name"> |
| 22 | <a href="/${render.escape(r.owner)}/${render.escape(r.name)}">${render.escape(r.owner)}/${render.escape(r.name)}</a> |
| 23 | ${tag} |
| 24 | </div> |
| 25 | <div class="repo-card-desc">${render.escape(r.description || 'No description')}</div> |
| 26 | <div class="repo-card-meta"> |
| 27 | 👤 <a href="/${render.escape(r.owner)}">${render.escape(r.owner)}</a> |
| 28 | · 📅 ${render.escape(date)} |
| 29 | · <a href="/${render.escape(r.owner)}/${render.escape(r.name)}/archive/main.zip">⬇ ZIP</a> |
| 30 | </div> |
| 31 | </div>`; |
| 32 | }).join('\n'); |
| 33 | |
| 34 | const content = render.fill(render.loadView('home.html'), { |
| 35 | SITE_NAME: render.escape(config.get('site.name')), |
| 36 | TAGLINE: render.escape(config.get('site.tagline')), |
| 37 | REPOS_HTML: repoCards || '<p>No public repositories yet.</p>', |
| 38 | SIGNUP_PROMPT: session ? '' : '<p><a href="/signup" class="btn">Create an account</a></p>' |
| 39 | }); |
| 40 | |
| 41 | res.end(render.page({ title: '', content, session, addressUrl: '/' })); |
| 42 | } |
| 43 | |
| 44 | function signupPage(req, res) { |
| 45 | const session = auth.getSession(req); |
| 46 | if (session) return respond.redirect(res, `/${session.username}`); |
| 47 | if (!config.get('auth.allowSignup')) return respond.forbidden(res, 'Signup is disabled'); |
| 48 | |
| 49 | const content = render.loadView('auth.html') |
| 50 | .replace('{{FORM_TITLE}}', 'Create account') |
| 51 | .replace('{{FORM_ACTION}}', 'signup') |
| 52 | .replace('{{SUBMIT_LABEL}}', 'Sign up') |
| 53 | .replace('{{EXTRA_FIELDS}}', |
| 54 | '<label for="fDisplay">Display name (optional):</label>' + |
| 55 | '<input type="text" id="fDisplay" name="displayName" maxlength="64">'); |
| 56 | |
| 57 | res.end(render.page({ title: 'Sign up', content, session: null, addressUrl: '/signup' })); |
| 58 | } |
| 59 | |
| 60 | function settingsNewRepo(req, res) { |
| 61 | const session = auth.requireAuth(req, res); |
| 62 | if (!session) return; |
| 63 | const content = render.loadView('repo-new.html'); |
| 64 | res.end(render.page({ title: 'New repository', content, session, addressUrl: '/settings/new' })); |
| 65 | } |
| 66 | |
| 67 | module.exports = function register(router) { |
| 68 | router.get('/', home); |
| 69 | router.get('/signup', signupPage); |
| 70 | router.get('/settings/new', settingsNewRepo); |
| 71 | }; |
| 72 | |