From a56fe253c96abdff7d9909a3cca3c1d0a6a8e3d2 Mon Sep 17 00:00:00 2001
From: jasonjayr <jasonjayr@4979c152-3d1c-0410-bac9-87ea11338e46>
Date: Thu, 4 Jan 2007 02:43:30 +0000
Subject: The start of a new REST API, these modules only provide read-only
 access for now.

git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/trunk@750 4979c152-3d1c-0410-bac9-87ea11338e46
---
 LedgerSMB/RESTXML/Document/Base.pm            | 63 +++++++++++++++++++++++++++
 LedgerSMB/RESTXML/Document/Customer.pm        | 23 ++++++++++
 LedgerSMB/RESTXML/Document/Customer_Search.pm | 46 +++++++++++++++++++
 LedgerSMB/RESTXML/Document/Part.pm            | 23 ++++++++++
 LedgerSMB/RESTXML/Document/Part_Search.pm     | 45 +++++++++++++++++++
 LedgerSMB/RESTXML/Document/SalesOrder.pm      | 17 ++++++++
 LedgerSMB/RESTXML/Document/Session.pm         | 33 ++++++++++++++
 7 files changed, 250 insertions(+)
 create mode 100644 LedgerSMB/RESTXML/Document/Base.pm
 create mode 100644 LedgerSMB/RESTXML/Document/Customer.pm
 create mode 100644 LedgerSMB/RESTXML/Document/Customer_Search.pm
 create mode 100644 LedgerSMB/RESTXML/Document/Part.pm
 create mode 100644 LedgerSMB/RESTXML/Document/Part_Search.pm
 create mode 100644 LedgerSMB/RESTXML/Document/SalesOrder.pm
 create mode 100644 LedgerSMB/RESTXML/Document/Session.pm

(limited to 'LedgerSMB/RESTXML/Document')

diff --git a/LedgerSMB/RESTXML/Document/Base.pm b/LedgerSMB/RESTXML/Document/Base.pm
new file mode 100644
index 00000000..e8feaa96
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Base.pm
@@ -0,0 +1,63 @@
+package LedgerSMB::RESTXML::Document::Base;
+use strict;
+use warnings;
+use XML::Twig;
+use LedgerSMB::Log;
+use Carp;
+
+sub handle_post { 
+	my ($self, $args) = @_;
+
+	return $args->{handler}->unsupported('the POST method is not implemented.');
+}
+
+sub handle_put { 
+	my ($self, $args) = @_;
+	return $self->{handler}->unsupported('the PUT method is not implemented.');
+}
+
+sub handle_delete {
+	my ($self, $args) = @_;
+	return $self->{handler}->unsupported('the DELETE method is not implemented.');
+}
+
+sub handle_get {
+	my ($self, $args) = @_;
+
+	return $self->{handler}->unsupported('the GET method is not implemented.');
+}
+
+=head3 hash_to_twig
+
+Convinenve function to convert a hashref to a XML::Twig structure.
+
+passed a hashref, required arguments:
+
+hash - the hash to convert
+
+name - the name of the root element.
+
+optional arguments:
+
+sort - by default, on set to 0 to disable.  toggles whether or not hash keys are sorted
+in the resulting xml node created.  Disabling this may save some performance if converting a lot of
+nodes at once.
+
+=cut
+
+sub hash_to_twig { 
+	my ($self, $args) = @_;
+
+	my $hash = $args->{hash} || croak "Need a hash to convert to use hash_to_twig";
+	my $name = $args->{name} || croak "Need a root element name to use hash_to_twig";
+	my @keyorder = keys %$hash;	
+	
+	@keyorder = sort @keyorder unless defined($args->{sort}) and $args->{sort} == 0;
+
+	return XML::Twig::Elt->new($name,$args->{root_attr}||{}, map  {
+		XML::Twig::Elt->new($_, {'#CDATA'=>1}, $hash->{$_})
+	} @keyorder );
+}
+
+1;
+
diff --git a/LedgerSMB/RESTXML/Document/Customer.pm b/LedgerSMB/RESTXML/Document/Customer.pm
new file mode 100644
index 00000000..3a494965
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Customer.pm
@@ -0,0 +1,23 @@
+package LedgerSMB::RESTXML::Document::Customer;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+	my $user = $args->{user};
+	my $dbh = $args->{dbh};
+	my $handler = $args->{handler};
+
+	my $res = $dbh->selectrow_hashref(q{SELECT * from customer where id = ?}, undef, $args->{args}[0]);
+
+	if(!$res) { 
+		$handler->not_found("No customer with the id $args->{args}[0] found");
+	} else { 
+		$handler->respond($self->hash_to_twig({name=>'Customer',hash=>$res}));
+	}
+}
+
+
+1;
diff --git a/LedgerSMB/RESTXML/Document/Customer_Search.pm b/LedgerSMB/RESTXML/Document/Customer_Search.pm
new file mode 100644
index 00000000..7456f9d3
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Customer_Search.pm
@@ -0,0 +1,46 @@
+package LedgerSMB::RESTXML::Document::Customer_Search;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+use LedgerSMB::Log;
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+	my $user = $args->{user};
+	my $dbh = $args->{dbh};
+	my $handler = $args->{handler};
+	
+	my $query = $handler->read_query();
+
+	my %terms;
+
+	for my $field ($query->param()) { 
+		# TODO: BIG GAPING HOLE HERE.
+		$terms{$field} = $query->param($field);	
+	}
+
+	if($terms{_keyword}) { 
+		%terms = (
+				name=>$terms{_keyword},
+				customernumber=>$terms{_keyword},
+				contact=>$terms{_keyword}
+		);
+	}
+	my $sql = 'SELECT id,name,phone,customernumber FROM customer WHERE '.join(' OR ',map { "$_ like ?" } sort keys %terms);
+	
+		
+	my $res = $dbh->prepare($sql);
+
+	$res->execute(map { "$terms{$_}\%" } sort keys %terms) or return $handler->error($dbh->errstr);
+
+	my @rows;
+	my $row;
+	push @rows, $row while $row = $res->fetchrow_hashref();
+	
+	$res->finish();
+	
+	$handler->respond(XML::Twig::Elt->new('Customer_Search_Response',{'xmlns:xlink'=>"http://www.w3.org/1999/xlink"},map {  
+			$self->hash_to_twig({name=>'Customer',root_attr=>{'xlink:href'=>"Customer/$_->{id}"}, hash=>$_});			
+		} @rows));
+}
+1;
diff --git a/LedgerSMB/RESTXML/Document/Part.pm b/LedgerSMB/RESTXML/Document/Part.pm
new file mode 100644
index 00000000..072f9b80
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Part.pm
@@ -0,0 +1,23 @@
+package LedgerSMB::RESTXML::Document::Part;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+	my $user = $args->{user};
+	my $dbh = $args->{dbh};
+	my $handler = $args->{handler};
+
+	my $res = $dbh->selectrow_hashref(q{SELECT * from part where id = ?}, undef, $args->{args}[0]);
+
+	if(!$res) { 
+		$handler->not_found("No part with the id $args->{args}[0] found");
+	} else { 
+		$handler->respond($self->hash_to_twig({name=>'Customer',hash=>$res}));
+	}
+}
+
+
+1;
diff --git a/LedgerSMB/RESTXML/Document/Part_Search.pm b/LedgerSMB/RESTXML/Document/Part_Search.pm
new file mode 100644
index 00000000..927c67c0
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Part_Search.pm
@@ -0,0 +1,45 @@
+package LedgerSMB::RESTXML::Document::Part_Search;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+use LedgerSMB::Log;
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+	my $user = $args->{user};
+	my $dbh = $args->{dbh};
+	my $handler = $args->{handler};
+	
+	my $query = $handler->read_query();
+
+	my %terms;
+
+	for my $field ($query->param()) { 
+		# TODO: BIG GAPING HOLE HERE.
+		$terms{$field} = $query->param($field);	
+	}
+
+	if($terms{_keyword}) { 
+		%terms = (
+				description=>$terms{_keyword},
+				partnumber=>$terms{_keyword},
+		);
+	}
+	my $sql = 'SELECT id,description,partnumber FROM parts WHERE '.join(' OR ',map { "$_ like ?" } sort keys %terms);
+	
+		
+	my $res = $dbh->prepare($sql);
+
+	$res->execute(map { "$terms{$_}\%" } sort keys %terms) or return $handler->error($dbh->errstr);
+
+	my @rows;
+	my $row;
+	push @rows, $row while $row = $res->fetchrow_hashref();
+	
+	$res->finish();
+	
+	$handler->respond(XML::Twig::Elt->new('Part_Search_Response',{'xmlns:xlink'=>"http://www.w3.org/1999/xlink"},map {  
+			$self->hash_to_twig({name=>'Part',root_attr=>{'xlink:href'=>"Part/$_->{id}"}, hash=>$_});			
+		} @rows));
+}
+1;
diff --git a/LedgerSMB/RESTXML/Document/SalesOrder.pm b/LedgerSMB/RESTXML/Document/SalesOrder.pm
new file mode 100644
index 00000000..acb4d5aa
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/SalesOrder.pm
@@ -0,0 +1,17 @@
+package LedgerSMB::RESTXML::Document::SalesOrder;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+
+
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+	
+	print "Content-type: text/html\n\n";
+	print "It still works";
+
+}
+
+
+1;
diff --git a/LedgerSMB/RESTXML/Document/Session.pm b/LedgerSMB/RESTXML/Document/Session.pm
new file mode 100644
index 00000000..1db36502
--- /dev/null
+++ b/LedgerSMB/RESTXML/Document/Session.pm
@@ -0,0 +1,33 @@
+
+=head1 NAME
+
+LedgerSMB::RESTXML::Document::Session
+
+=head1 SYNOPSIS
+
+This sets up an authentication session for iterativly accessing documents in LedgerSMB.  A user should
+post a login document to /Session/userid, and upon success, they will recieve a cookie which they can use to further
+access other resources.
+
+=cut
+
+package LedgerSMB::RESTXML::Document::Session;
+use strict;
+use warnings;
+use base qw(LedgerSMB::RESTXML::Document::Base);
+
+
+sub handle_get { 
+	my ($self, $args) = @_;	
+
+
+}
+
+sub handle_post { 
+	my ($self, $args) = @_;
+	print "Content-type: text/html\n\nhi";
+	
+}
+
+
+1;
-- 
cgit v1.2.3