| 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 validate = require('../lib/validate'); |
| 6 | |
| 7 | function userPage(req, res, params) { |
| 8 | const username = params.user.toLowerCase(); |
| 9 | if (!validate.isValidName(username)) return respond.notFound(res); |
| 10 | |
| 11 | const session = auth.getSession(req); |
| 12 | const user = data.users().get(username); |
| 13 | if (!user) return respond.notFound(res); |
| 14 | |
| 15 | const isSelf = session && session.username === username; |
| 16 | const allRepos = data.repos().values(); |
| 17 | const visible = allRepos.filter(r => { |
| 18 | if (r.owner !== username) return false; |
| 19 | if (r.visibility === 'public') return true; |
| 20 | return isSelf; |
| 21 | }).sort((a, b) => b.createdAt - a.createdAt); |
| 22 | |
| 23 | const repoCards = visible.map(r => { |
| 24 | const tag = r.visibility === 'private' |
| 25 | ? '<span class="vis-badge private">private</span>' |
| 26 | : ''; |
| 27 | return `<div class="repo-card"> |
| 28 | <div class="repo-card-name"> |
| 29 | <a href="/${render.escape(username)}/${render.escape(r.name)}">${render.escape(r.name)}</a> |
| 30 | ${tag} |
| 31 | </div> |
| 32 | <div class="repo-card-desc">${render.escape(r.description || '')}</div> |
| 33 | <div class="repo-card-meta">${render.escape(r.visibility)} · created ${new Date(r.createdAt).toISOString().slice(0, 10)}</div> |
| 34 | </div>`; |
| 35 | }).join('\n'); |
| 36 | |
| 37 | const joined = new Date(user.createdAt).toISOString().slice(0, 10); |
| 38 | const content = render.fill(render.loadView('user.html'), { |
| 39 | USERNAME: render.escape(user.username), |
| 40 | DISPLAY_NAME: render.escape(user.displayName || user.username), |
| 41 | BIO: render.escape(user.bio || ''), |
| 42 | JOINED: render.escape(joined), |
| 43 | REPOS_HTML: repoCards || '<p>No repositories.</p>', |
| 44 | CREATE_LINK: isSelf ? '<a class="btn" href="/settings/new">+ New repository</a>' : '' |
| 45 | }); |
| 46 | |
| 47 | res.end(render.page({ |
| 48 | title: user.username, |
| 49 | content, |
| 50 | session, |
| 51 | addressUrl: req.url |
| 52 | })); |
| 53 | } |
| 54 | |
| 55 | module.exports = function register(router) { |
| 56 | router.get('/:user', userPage); |
| 57 | }; |
| 58 | |