root/trunk/hotstuff/ocs/HotstuffOCS.pm

Revision 537, 4.3 KB (checked in by josef, 3 years ago)

- initial code for eventual implementation of the content part of the OCS API
- cleanup of old TODO lists
- update of changelog in anticipation of a new release

Line 
1#!/usr/bin/env perl
2#
3# Open Collaboration Services interface to the Hotstuff database
4# Copyright (C) 2009 Josef Spillner <josef@kstuff.org>
5# Published under 'GNU AGPLv3 or later' conditions
6
7package HotstuffOCS;
8
9use base qw/CGI::Application/;
10
11use strict;
12use warnings;
13
14use CGI::Application::Plugin::Routes;
15use XML::Writer;
16
17sub setup {
18        my $self = shift;
19        $self->routes_root('/:site/v1/content');
20        $self->routes([
21                '' => 'home' ,
22                '/categories'  => 'categories',
23                '/data'  => 'list'
24        ]);
25        $self->start_mode('home');
26}
27
28sub database {
29        # FIXME: encapsulate and share with hotstuff-stuff
30        my $site = shift;
31
32        my $opt_config = "/etc/hotstuff.d/$site.conf";
33
34        use vars qw($dbhost $dbport $dbname $dbuser $dbpass);
35        eval{require $opt_config};
36        if($@){
37                return 0;
38        }
39        if(!$dbport){
40                $dbport = 5432;
41        }
42
43        my $conn = DBI->connect("DBI:Pg:host=$dbhost;port=$dbport;dbname=$dbname;user=$dbuser;password=$dbpass");
44        # FIXME: Bareword "DBI::errstr" not allowed while "strict subs" in use at HotstuffOCS.pm
45        #$conn || die DBI::errstr;
46        $conn->{pg_enable_utf8} = 1;
47        return $conn;
48}
49
50sub list {
51        my $self = shift;
52        $self->header_add(-content_type => "text/xml");
53
54        # FIXME: categories := 'XxYxZ'
55        # FIXME: sortmode := (new|alpha|high|down)
56
57        my $q = $self->query();
58        my $site = $q->param('site');
59        my $categories = $q->param('categories');
60        my $search = $q->param('search');
61        my $user = $q->param('user');
62        my $sortmode = $q->param('sortmode');
63        my $page = $q->param('page');
64        my $pagesize = $q->param('pagesize');
65
66        my $conn = database($site);
67
68        my $out;
69        my $writer = new XML::Writer(DATA_MODE => 1, OUTPUT => \$out);
70        $writer->xmlDecl("UTF-8");
71        $writer->startTag("ocs");
72        $writer->startTag("meta");
73        $writer->dataElement("status", "ok");
74        $writer->dataElement("statuscode", "100");
75        $writer->dataElement("message", "");
76        $writer->dataElement("totalitems", "???");
77        $writer->dataElement("itemsperpage", "???");
78        $writer->endTag("meta");
79        $writer->startTag("data");
80        $writer->startTag("content", "details" => "summary");
81        $writer->dataElement("id", "???");
82        $writer->dataElement("name", "???");
83        $writer->dataElement("version", "???");
84        $writer->dataElement("changed", "???");
85        $writer->dataElement("created", "???");
86        $writer->dataElement("typeid", "???");
87        $writer->dataElement("typename", "???");
88        $writer->dataElement("language", "???");
89        $writer->dataElement("personid", "???");
90        $writer->dataElement("downloads", "???");
91        $writer->dataElement("score", "???");
92        $writer->dataElement("comments", "???");
93        $writer->dataElement("detailpage", "???");
94        $writer->dataElement("preview1", "???");
95        $writer->dataElement("previewpic1", "???");
96        $writer->endTag("content");
97        $writer->endTag("data");
98        $writer->endTag("ocs");
99
100        # FIXME: download-type/price/link/name/size
101
102        return $out;
103}
104
105sub categories {
106        my $self = shift;
107        $self->header_add(-content_type => "text/xml");
108
109        my $q = $self->query();
110        my $site = $q->param('site');
111
112        my $conn = database($site);
113
114        my $category;
115        my @categories = ();
116
117        # FIXME: available repositories could be maintained in a database as well
118        my $query = "SELECT DISTINCT category FROM directory";
119        my $res = $conn->prepare($query);
120        $res->execute();
121        $res->bind_columns(\$category);
122        while($res->fetch()){
123                push @categories, $category;
124        }
125        $res->finish();
126
127        my $out;
128        my $writer = new XML::Writer(DATA_MODE => 1, OUTPUT => \$out);
129        $writer->xmlDecl("UTF-8");
130        $writer->startTag("ocs");
131        $writer->startTag("meta");
132        $writer->dataElement("status", "ok");
133        $writer->dataElement("statuscode", "100");
134        $writer->dataElement("message", "");
135        $writer->dataElement("totalitems", "???");
136        $writer->endTag("meta");
137        $writer->startTag("data");
138        foreach my $category(@categories){
139                # FIXME: unique ids
140                my $id = 0;
141                $writer->startTag("category");
142                $writer->dataElement("id", $id);
143                $writer->dataElement("name", $category);
144                $writer->endTag("category");
145        }
146        $writer->endTag("data");
147        $writer->endTag("ocs");
148
149        return $out;
150}
151
152sub home {
153        my $self = shift;
154        $self->header_add(-content_type => "text/plain");
155
156        my $s = "Hotstuff OCS Implementation\n\n";
157        $s .= "This script implements the Content part of the Open Collaboration Services (OCS).\n";
158        # FIXME: here or rather in hotstuff-provider?
159        #$s .= "It also creates the provider meta-information on request.\n";
160        $s .= "Please refer to the specification to find out about its methods.\n";
161
162        return $s;
163}
164
1651;
Note: See TracBrowser for help on using the browser.