aboutsummaryrefslogtreecommitdiff
path: root/brep/repository-details.cxx
blob: 4302c157d27ca3568a9d69bd0c209d8ca7bc215a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// file      : brep/repository-details.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#include <brep/repository-details>

#include <string>
#include <memory>  // make_shared()

#include <xml/serializer>

#include <odb/database.hxx>
#include <odb/transaction.hxx>

#include <web/xhtml>
#include <web/module>
#include <web/mime-url-encoding>

#include <brep/page>
#include <brep/options>
#include <brep/package>
#include <brep/package-odb>
#include <brep/shared-database>

using namespace std;
using namespace odb::core;

namespace brep
{
  using namespace cli;

  void repository_details::
  init (scanner& s)
  {
    MODULE_DIAG;

    options_ = make_shared<options::repository_details> (
      s, unknown_mode::fail, unknown_mode::fail);

    db_ = shared_database (options_->db_host (), options_->db_port ());
  }

  void repository_details::
  handle (request&, response& rs)
  {
    using namespace web::xhtml;

    MODULE_DIAG;

    // The module options object is not changed after being created once per
    // server process.
    //
    static const dir_path& rt (options_->root ());

    xml::serializer s (rs.content (), "About");
    const string& title (s.output_name ());
    static const path sp ("repository-details.css");

    s << HTML
      <<   HEAD
      <<     TITLE << title << ~TITLE
      <<     CSS_LINKS (sp, rt)
      <<   ~HEAD
      <<   BODY
      <<     DIV_HEADER (rt)
      <<     DIV(ID="content");

    transaction t (db_->begin ());

    using query = query<repository>;
    auto rp (db_->query<repository> (query::internal + "ORDER BY name"));

    for (const auto& r: rp)
    {
      string id (id_attribute (r.name));
      s << H1(ID=id)
        <<   A(HREF="#" + web::mime_url_encode (id)) << r.name << ~A
        << ~H1;

      if (r.email)
        s << A << HREF << "mailto:" << *r.email << ~HREF << *r.email << ~A;

      if (r.summary)
        s << H2 << *r.summary << ~H2;

      if (r.description)
        s << P_DESCRIPTION (*r.description, false);
    }

    t.commit ();

    s <<     ~DIV
      <<   ~BODY
      << ~HTML;
  }
}