Initial CMS API commmit.

This commit is contained in:
jvelilla
2014-10-01 12:17:39 -03:00
parent 588827b495
commit 27a11f2eea
170 changed files with 12459 additions and 14 deletions

View File

@@ -0,0 +1,60 @@
note
description: "Authentication filter."
author: "Olivier Ligot"
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
revision: "$Revision: 95678 $"
class
AUTHENTICATION_FILTER
inherit
WSF_URI_TEMPLATE_HANDLER
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
create
make
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the filter
local
l_auth: HTTP_AUTHORIZATION
do
log.write_debug (generator + ".execute " )
create l_auth.make (req.http_authorization)
if attached req.raw_header_data as l_raw_data then
log.write_debug (generator + ".execute " + l_raw_data )
end
-- A valid user
if (attached l_auth.type as l_auth_type and then l_auth_type.is_case_insensitive_equal ("basic")) and then
attached l_auth.login as l_auth_login and then attached l_auth.password as l_auth_password then
if api_service.login_valid (l_auth_login, l_auth_password) then
if attached api_service.user_by_name (l_auth_login) as l_user then
req.set_execution_variable ("user", l_user)
execute_next (req, res)
else
-- Internal server error
end
else
log.write_error (generator + ".execute login_valid failed for: " + l_auth_login )
execute_next (req, res)
end
else
log.write_error (generator + ".execute Not valid")
execute_next (req, res)
end
end
note
copyright: "2011-2012, Olivier Ligot, Jocelyn Fiat and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end

View File

@@ -0,0 +1,27 @@
note
description: "CORS filter"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
CORS_FILTER
inherit
WSF_FILTER
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the filter.
local
l_header: HTTP_HEADER
do
create l_header.make
-- l_header.add_header_key_value ("Access-Control-Allow-Origin", "localhost")
l_header.add_header_key_value ("Access-Control-Allow-Headers", "*")
l_header.add_header_key_value ("Access-Control-Allow-Methods", "*")
l_header.add_header_key_value ("Access-Control-Allow-Credentials", "true")
res.put_header_lines (l_header)
execute_next (req, res)
end
end

View File

@@ -0,0 +1,42 @@
note
description: "Error filter"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
ERROR_FILTER
inherit
WSF_URI_TEMPLATE_HANDLER
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
create
make
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the filter
do
if roc_config.is_successful and then roc_config.api_service.successful then
log.write_information (generator + ".execute")
execute_next (req, res)
else
-- send internal server error.
end
end
note
copyright: "2011-2012, Olivier Ligot, Jocelyn Fiat and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end

View File

@@ -0,0 +1,54 @@
note
description: "Logger filter"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
LOGGER_FILTER
inherit
WSF_URI_TEMPLATE_HANDLER
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
create
make
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the filter.
local
s: STRING_8
do
log.write_debug (generator + ".execute")
create s.make (2048)
if attached req.content_type as l_type then
s.append ("[length=")
s.append_natural_64 (req.content_length_value)
s.append_character (']')
s.append_character (' ')
s.append (l_type.debug_output)
s.append_character ('%N')
end
append_iterable_to ("Path parameters", req.path_parameters, s)
append_iterable_to ("Query parameters", req.query_parameters, s)
append_iterable_to ("Form parameters", req.form_parameters, s)
if not s.is_empty then
log.write_debug (generator + ".execute" + s)
end
execute_next (req, res)
end
note
copyright: "2011-2012, Olivier Ligot, Jocelyn Fiat and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end

View File

@@ -0,0 +1,48 @@
note
description: "Abstrat Eiffel Support API Handler."
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
deferred class
APP_ABSTRACT_HANDLER
inherit
WSF_HANDLER
APP_HANDLER
SHARED_CONNEG_HELPER
feature -- Change
set_esa_config (a_esa_config: like roc_config)
-- Set `roc_config' to `a_esa_condig'.
do
roc_config := a_esa_config
ensure
esa_config_set: roc_config = a_esa_config
end
feature -- Access
roc_config: ROC_CONFIG
-- Configuration.
api_service: ROC_API_SERVICE
-- api Service.
do
Result := roc_config.api_service
end
email_service: ROC_EMAIL_SERVICE
-- Email Service.
do
Result := roc_config.email_service
end
is_web: BOOLEAN
do
Result := roc_config.is_web
end
end

View File

@@ -0,0 +1,98 @@
note
description: "Summary description for {ESA_HANDLER}."
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
revision: "$Revision: 95678 $"
class
APP_HANDLER
inherit
SHARED_LOGGER
feature -- User
current_user_name (req: WSF_REQUEST): detachable READABLE_STRING_32
-- Current user name or Void in case of Guest users.
note
EIS: "src=eiffel:?class=AUTHENTICATION_FILTER&feature=execute"
do
if attached {CMS_USER} current_user (req) as l_user then
Result := l_user.name
end
end
current_user (req: WSF_REQUEST): detachable CMS_USER
-- Current user or Void in case of Guest user.
note
EIS: "eiffel:?class=AUTHENTICATION_FILTER&feature=execute"
do
if attached {CMS_USER} req.execution_variable ("user") as l_user then
Result := l_user
end
end
feature -- Media Type
current_media_type (req: WSF_REQUEST): detachable READABLE_STRING_32
-- Current media type or Void if it's not acceptable.
do
if attached {STRING} req.execution_variable ("media_type") as l_type then
Result := l_type
end
end
feature -- Absolute Host
absolute_host (req: WSF_REQUEST; a_path:STRING): STRING
do
Result := req.absolute_script_url (a_path)
if Result.last_index_of ('/', Result.count) = Result.count then
Result.remove_tail (1)
end
log.write_debug (generator + ".absolute_host " + Result )
end
feature -- Compression
current_compression (req: WSF_REQUEST): detachable READABLE_STRING_32
-- Current compression encoding or Void if it's not acceptable.
do
if attached {STRING} req.execution_variable ("compression") as l_encoding then
Result := l_encoding
end
end
feature {NONE} -- Implementations
append_iterable_to (a_title: READABLE_STRING_8; it: detachable ITERABLE [WSF_VALUE]; s: STRING_8)
local
n: INTEGER
do
if it /= Void then
across it as c loop
n := n + 1
end
if n > 0 then
s.append (a_title)
s.append_character (':')
s.append_character ('%N')
across
it as c
loop
s.append (" - ")
s.append (c.item.url_encoded_name)
s.append_character (' ')
s.append_character ('{')
s.append (c.item.generating_type)
s.append_character ('}')
s.append_character ('=')
s.append (c.item.debug_output.as_string_8)
s.append_character ('%N')
end
end
end
end
end

View File

@@ -0,0 +1,57 @@
note
description: "Summary description for {NAVIGATION_HANDLER}."
date: "$Date$"
revision: "$Revision$"
class
NAVIGATION_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "modules/navigation.tpl")
l_page.send_to (res)
end
end

View File

@@ -0,0 +1,190 @@
note
description: "Summary description for {NEW_CONTENT_HANDLER}."
date: "$Date$"
revision: "$Revision$"
class
NODE_CONTENT_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post,
do_put
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
-- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
create l_page.make (req, "modules/node_content.tpl")
l_page.set_value (l_node.content, "content")
l_page.set_value (l_id.value, "id")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
else
do_error (req, res, l_id)
end
else
-- Todo extract method
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res)
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
end
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_put (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
to_implement ("Check if user has permissions")
if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value)
api_service.update_node_content (l_user.id, u_node.id, u_node.content)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
feature -- Error
do_error (req: WSF_REQUEST; res: WSF_RESPONSE; a_id: WSF_STRING)
-- Handling error.
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "master2/error.tpl")
if a_id.is_integer then
-- resource not found
l_page.set_value ("404", "code")
else
-- bad request
l_page.set_value ("400", "code")
end
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to(res)
end
feature -- {NONE} Form data
extract_data_form (req: WSF_REQUEST): CMS_NODE
-- Extract request form data and build a object
-- Node
do
create Result.make ("", "", "")
if attached {WSF_STRING}req.form_parameter ("content") as l_content then
Result.set_content (l_content.value)
end
end
end

View File

@@ -0,0 +1,225 @@
note
description: "Summary description for {NODE_HANDLER}."
date: "$Date$"
revision: "$Revision$"
class
NODE_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post,
do_put,
do_delete
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
-- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
create l_page.make (req, "modules/node.tpl")
l_page.set_value (l_node, "node")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
else
do_error (req, res, l_id)
end
else
-- Factory
new_node (req, res)
end
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
to_implement ("Check user permissions!!!")
if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("DELETE") then
do_delete (req, res)
elseif l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res)
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
end
else
do_error (req, res, l_id)
end
else
-- New node
u_node := extract_data_form (req)
u_node.set_author (l_user)
api_service.new_node (u_node)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_put (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
do
if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value)
api_service.update_node (l_user.id,u_node)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
do_error (req, res, l_id)
end
else
-- Internal server error
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_delete (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
do
if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
api_service.delete_node (l_id.integer_value)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
do_error (req, res, l_id)
end
else
-- Internal server error
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
feature -- Error
do_error (req: WSF_REQUEST; res: WSF_RESPONSE; a_id: WSF_STRING)
-- Handling error.
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "master2/error.tpl")
if a_id.is_integer then
-- resource not found
l_page.set_value ("404", "code")
else
-- bad request
l_page.set_value ("400", "code")
end
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
feature {NONE} -- Node
new_node (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
create l_page.make (req, "modules/node.tpl")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
else
(create {ROC_RESPONSE}.make (req, "")).new_response_unauthorized (req, res)
end
end
feature -- {NONE} Form data
extract_data_form (req: WSF_REQUEST): CMS_NODE
-- Extract request form data and build a object
-- Node
do
create Result.make ("", "", "")
if attached {WSF_STRING} req.form_parameter ("title") as l_title then
Result.set_title (l_title.value)
end
if attached {WSF_STRING} req.form_parameter ("summary") as l_summary then
Result.set_summary (l_summary.value)
end
if attached {WSF_STRING} req.form_parameter ("content") as l_content then
Result.set_content (l_content.value)
end
end
end

View File

@@ -0,0 +1,199 @@
note
description: "Summary description for {NODE_SUMMARY_HANDLER}."
date: "$Date$"
revision: "$Revision$"
class
NODE_SUMMARY_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post,
do_put
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
-- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
create l_page.make (req, "modules/node_summary.tpl")
l_page.set_value (l_node.summary, "summary")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.set_value (l_id.value, "id")
l_page.send_to (res)
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res)
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
end
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_put (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
to_implement ("Check if user has permissions!!!")
if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value)
api_service.update_node_summary (l_user.id,u_node.id, u_node.summary)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
feature -- Error
do_error (req: WSF_REQUEST; res: WSF_RESPONSE; a_id: WSF_STRING)
-- Handling error.
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "master2/error.tpl")
if a_id.is_integer then
-- resource not found
l_page.set_value ("404", "code")
else
-- bad request
l_page.set_value ("400", "code")
end
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to(res)
end
feature {NONE} -- Node
new_node (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "modules/node.tpl")
l_page.send_to (res)
end
feature -- {NONE} Form data
extract_data_form (req: WSF_REQUEST): CMS_NODE
-- Extract request form data and build a object
-- Node
do
create Result.make ("", "", "")
if attached {WSF_STRING}req.form_parameter ("summary") as l_summary then
Result.set_summary (l_summary.value)
end
end
end

View File

@@ -0,0 +1,199 @@
note
description: "Summary description for {NODE_TITLE_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
NODE_TITLE_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post,
do_put
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
if attached current_user_name (req) as l_user then
-- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
create l_page.make (req, "modules/node_title.tpl")
l_page.set_value (l_node.title, "title")
l_page.set_value (l_id.value, "id")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
if attached current_user_name (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res)
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
end
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
do_put (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
to_implement ("Check if user has permissions")
if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id then
if l_id.is_integer and then attached {CMS_NODE} api_service.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value)
api_service.update_node_title (l_user.id,u_node.id, u_node.title)
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
do_error (req, res, l_id)
end
else
create l_page.make (req, "master2/error.tpl")
l_page.set_value ("500", "code")
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
else
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
end
end
feature -- Error
do_error (req: WSF_REQUEST; res: WSF_RESPONSE; a_id: WSF_STRING)
-- Handling error.
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "master2/error.tpl")
if a_id.is_integer then
-- resource not found
l_page.set_value ("404", "code")
else
-- bad request
l_page.set_value ("400", "code")
end
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
feature {NONE} -- Node
new_node (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "modules/node.tpl")
l_page.send_to (res)
end
feature -- {NONE} Form data
extract_data_form (req: WSF_REQUEST): CMS_NODE
-- Extract request form data and build a object
-- Node
do
create Result.make ("", "", "")
if attached {WSF_STRING} req.form_parameter ("title") as l_title then
Result.set_title (l_title.value)
end
end
end

View File

@@ -0,0 +1,62 @@
note
description: "Summary description for {NODES_HANDLER}."
date: "$Date$"
revision: "$Revision$"
class
NODES_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "modules/nodes.tpl")
l_page.set_value (api_service.nodes, "nodes")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
end
end

View File

@@ -0,0 +1,63 @@
note
description: "Handle Login using Basic Authentication"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
ROC_LOGIN_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_FILTER
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler.
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler.
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
do
if attached {STRING_32} current_user_name (req) as l_user then
(create {ROC_RESPONSE}.make(req,"")).new_response_redirect (req, res, req.absolute_script_url(""))
else
(create {ROC_RESPONSE}.make(req,"")).new_response_authenticate (req, res)
end
end
end

View File

@@ -0,0 +1,59 @@
note
description: "Handle Logoff for Basic Authentication"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
ROC_LOGOFF_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler.
do
execute_methods (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler.
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
do
log.write_information(generator + ".do_get Processing logoff")
if attached req.query_parameter ("prompt") as l_prompt then
(create {ROC_RESPONSE}.make(req,"")).new_response_unauthorized (req, res)
else
(create {ROC_RESPONSE}.make(req,"master2/logoff.tpl")).new_response_denied (req, res)
end
end
end

View File

@@ -0,0 +1,63 @@
note
description: "ROOT_HANDLER."
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
ROC_ROOT_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "layout2.tpl")
l_page.set_value (api_service.recent_nodes (0,5), "nodes")
l_page.set_value (is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
end
end

View File

@@ -0,0 +1,163 @@
note
description: "Summary description for {USER_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
USER_HANDLER
inherit
APP_ABSTRACT_HANDLER
rename
set_esa_config as make
end
WSF_FILTER
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post,
do_put,
do_delete
end
REFACTORING_HELPER
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
execute_next (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: ROC_RESPONSE
do
-- Existing node
create l_page.make (req, "modules/register.tpl")
l_page.set_value (roc_config.is_web, "web")
l_page.set_value (roc_config.is_html, "html")
l_page.send_to (res)
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
l_page: ROC_RESPONSE
do
-- New user
api_service.new_user (extract_data_form (req))
if api_service.successful then
(create {ROC_RESPONSE}.make (req, "")).new_response_redirect (req, res, req.absolute_script_url (""))
else
end
end
do_put (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
u_node: CMS_NODE
do
end
do_delete (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
do
end
feature -- Error
do_error (req: WSF_REQUEST; res: WSF_RESPONSE; a_id: WSF_STRING)
-- Handling error.
local
l_page: ROC_RESPONSE
do
create l_page.make (req, "master2/error.tpl")
if a_id.is_integer then
-- resource not found
l_page.set_value ("404", "code")
else
-- bad request
l_page.set_value ("400", "code")
end
l_page.set_value (req.absolute_script_url (req.path_info), "request")
l_page.send_to (res)
end
feature {NONE} -- Node
new_node (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_page: ROC_RESPONSE
do
if attached current_user_name (req) then
create l_page.make (req, "modules/node.tpl")
l_page.send_to (res)
else
(create {ROC_RESPONSE}.make (req, "")).new_response_unauthorized (req, res)
end
end
feature -- {NONE} Form data
extract_data_form (req: WSF_REQUEST): CMS_USER
-- Extract request form data and build a object
-- user
do
create Result.make ("")
if attached {WSF_STRING} req.form_parameter ("username") as l_username then
Result.set_name (l_username)
end
if
attached {WSF_STRING} req.form_parameter ("password") as l_password and then
attached {WSF_STRING} req.form_parameter ("check_password") as l_check_password and then
l_password.value.is_case_insensitive_equal (l_check_password.value)
then
Result.set_password (l_password)
end
if attached {WSF_STRING} req.form_parameter ("email") as l_email then
Result.set_email (l_email)
end
end
end

View File

@@ -0,0 +1,126 @@
note
description: "API Service facade to the underlying business logic"
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
revision: "$Revision: 95678 $"
class
ROC_API_SERVICE
inherit
SHARED_ERROR
REFACTORING_HELPER
create make
feature -- Initialize
make (a_storage: CMS_STORAGE)
-- Create the API service with an storege `a_storage'.
do
storage := a_storage
set_successful
ensure
storage_set: storage = a_storage
end
feature -- Access
login_valid (l_auth_login, l_auth_password: READABLE_STRING_32): BOOLEAN
local
l_security: SECURITY_PROVIDER
do
Result := storage.is_valid_credential (l_auth_login, l_auth_password)
end
feature -- Access: Node
nodes: LIST[CMS_NODE]
-- List of nodes.
do
fixme ("Implementation")
Result := storage.recent_nodes (0, 10)
end
recent_nodes (a_offset, a_rows: INTEGER): LIST[CMS_NODE]
-- List of the `a_rows' most recent nodes starting from `a_offset'.
do
Result := storage.recent_nodes (a_offset, a_rows)
end
node (a_id: INTEGER_64): detachable CMS_NODE
-- Node by ID.
do
fixme ("Check preconditions")
Result := storage.node (a_id)
end
feature -- Change: Node
new_node (a_node: CMS_NODE)
-- Add a new node
do
storage.save_node (a_node)
end
delete_node (a_id: INTEGER_64)
do
storage.delete_node (a_id)
end
update_node (a_id: like {CMS_USER}.id; a_node: CMS_NODE)
do
storage.update_node (a_id,a_node)
end
update_node_title (a_id: like {CMS_USER}.id; a_node_id: like {CMS_NODE}.id; a_title: READABLE_STRING_32)
do
fixme ("Check preconditions")
storage.update_node_title (a_id,a_node_id,a_title)
end
update_node_summary (a_id: like {CMS_USER}.id; a_node_id: like {CMS_NODE}.id; a_summary: READABLE_STRING_32)
do
fixme ("Check preconditions")
storage.update_node_summary (a_id,a_node_id, a_summary)
end
update_node_content (a_id: like {CMS_USER}.id; a_node_id: like {CMS_NODE}.id; a_content: READABLE_STRING_32)
do
fixme ("Check preconditions")
storage.update_node_content (a_id,a_node_id, a_content)
end
feature -- Access: User
user_by_name (a_username: READABLE_STRING_32): detachable CMS_USER
do
Result := storage.user_by_name (a_username)
end
feature -- Change User
new_user (a_user: CMS_USER)
-- Add a new user `a_user'.
do
if
attached a_user.password as l_password and then
attached a_user.email as l_email
then
storage.save_user (a_user)
else
fixme ("Add error")
end
end
feature {NONE} -- Implemenataion
storage: CMS_STORAGE
-- Persistence storage
end

View File

@@ -0,0 +1,127 @@
note
description: "Provides email access"
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
revision: "$Revision: 95678 $"
class
ROC_EMAIL_SERVICE
inherit
SHARED_ERROR
create
make
feature {NONE} -- Initialization
make (a_smtp_server: READABLE_STRING_32)
-- Create an instance of {ESA_EMAIL_SERVICE} with an smtp_server `a_smtp_server'.
-- Using "noreplies@eiffel.com" as admin email.
local
l_address_factory: INET_ADDRESS_FACTORY
do
-- Get local host name needed in creation of SMTP_PROTOCOL.
create l_address_factory
create smtp_protocol.make (a_smtp_server, l_address_factory.create_localhost.host_name)
set_successful
end
admin_email: IMMUTABLE_STRING_8
-- Administrator email.
once
Result := "noreplies@eiffel.com"
end
webmaster_email: IMMUTABLE_STRING_8
-- Webmaster email.
once
Result := "webmaster@eiffel.com"
end
smtp_protocol: SMTP_PROTOCOL
-- SMTP protocol.
feature -- Basic Operations
send_template_email (a_to, a_token, a_host: STRING)
-- Send successful registration message containing activation code `a_token' to `a_to'.
require
attached_to: a_to /= Void
attached_token: a_token /= Void
attached_host: a_host /= Void
local
l_content: STRING
l_url: URL_ENCODER
l_path: PATH
l_html: HTML_ENCODER
l_email: EMAIL
do
if successful then
log.write_information (generator + ".send_post_registration_email to [" + a_to + "]" )
create l_path.make_current
create l_url
create l_html
create l_content.make (1024)
l_content.append ("Thank you for registering at CMS.%N%NTo complete your registration, please click on this link to activate your account:%N%N")
l_content.append (a_host)
l_content.append ("/activation?code=")
l_content.append (l_url.encoded_string (a_token))
l_content.append ("&email=")
l_content.append (l_url.encoded_string (a_to))
l_content.append ("%N%NOnce there, please enter the following information and then click the Activate Account, button.%N%N")
l_content.append ("Your e-mail: ")
l_content.append (l_html.encoded_string (a_to))
l_content.append ("%N%NYour activation code: ")
l_content.append (l_html.encoded_string(a_token))
l_content.append ("%N%NThank you for joining us.%N%N CMS team.")
l_content.append (Disclaimer)
-- Create our message.
create l_email.make_with_entry (admin_email, a_to)
l_email.set_message (l_content)
l_email.add_header_entry ({EMAIL_CONSTANTS}.H_subject, "CMS Site: Account Activation")
send_email (l_email)
end
end
send_shutdown_email (a_message: READABLE_STRING_GENERAL)
-- Send email shutdown cause by an unexpected condition.
local
l_email: EMAIL
l_content: STRING
do
create l_email.make_with_entry (admin_email, webmaster_email)
create l_content.make (2048)
l_content.append (a_message.as_string_32)
l_email.set_message (l_content)
l_email.add_header_entry ({EMAIL_CONSTANTS}.H_subject, "ROC API exception")
send_email (l_email)
end
feature {NONE} -- Implementation
send_email (a_email: EMAIL)
-- Send the email represented by `a_email'.
local
l_retried: BOOLEAN
do
if not l_retried then
log.write_information (generator + ".send_email Process send email.")
smtp_protocol.initiate_protocol
smtp_protocol.transfer (a_email)
smtp_protocol.close_protocol
log.write_information (generator + ".send_email Email sent.")
set_successful
else
log.write_error (generator + ".send_email Email not send" + last_error_message )
end
rescue
set_last_error_from_exception (generator + ".send_email")
l_retried := True
retry
end
Disclaimer: STRING = "This email is generated automatically, and the address is not monitored for responses. If you try contacting us by using %"reply%", you will not receive an answer."
-- Email not monitored disclaimer.
end

View File

@@ -0,0 +1,185 @@
note
description: "[
REST API configuration
We manage URI and Uri templates using Routers. They are used to delegate calls (to the corresponing handlers) based on a URI template.
We define a Rooter and attach handlers to it.
]"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
ROC_REST_API
inherit
ROC_ABSTRACT_API
create
make
feature -- Initialization
setup_router
-- Setup `router'.
local
fhdl: WSF_FILE_SYSTEM_HANDLER
do
configure_api_root
configure_api_node
configure_api_navigation
configure_api_login
configure_api_nodes
configure_api_node_title
configure_api_node_summary
configure_api_node_content
configure_api_logoff
configure_api_register
create fhdl.make_hidden_with_path (layout.www_path)
fhdl.disable_index
fhdl.set_not_found_handler (agent (ia_uri: READABLE_STRING_8; ia_req: WSF_REQUEST; ia_res: WSF_RESPONSE)
do
execute_default (ia_req, ia_res)
end)
router.handle_with_request_methods ("/", fhdl, router.methods_GET)
end
feature -- Configure Resources Routes
configure_api_root
local
l_root_handler:ROC_ROOT_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_root_handler.make (roc_config)
create l_methods
l_methods.enable_get
router.handle_with_request_methods ("/", l_root_handler, l_methods)
end
configure_api_node
local
l_report_handler: NODE_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
router.handle_with_request_methods ("/node", l_report_handler, l_methods)
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
l_methods.enable_delete
router.handle_with_request_methods ("/node/{id}", l_report_handler, l_methods)
end
configure_api_navigation
local
l_report_handler: NAVIGATION_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
router.handle_with_request_methods ("/navigation", l_report_handler, l_methods)
end
configure_api_login
local
l_report_handler: ROC_LOGIN_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
router.handle_with_request_methods ("/login", l_report_handler, l_methods)
end
configure_api_logoff
local
l_report_handler: ROC_LOGOFF_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
router.handle_with_request_methods ("/logoff", l_report_handler, l_methods)
end
configure_api_nodes
local
l_report_handler: NODES_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
router.handle_with_request_methods ("/nodes", l_report_handler, l_methods)
end
configure_api_node_summary
local
l_report_handler: NODE_SUMMARY_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
router.handle_with_request_methods ("/node/{id}/summary", l_report_handler, l_methods)
end
configure_api_node_title
local
l_report_handler: NODE_TITLE_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
router.handle_with_request_methods ("/node/{id}/title", l_report_handler, l_methods)
end
configure_api_node_content
local
l_report_handler: NODE_CONTENT_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
router.handle_with_request_methods ("/node/{id}/content", l_report_handler, l_methods)
end
configure_api_register
local
l_report_handler: USER_HANDLER
l_methods: WSF_REQUEST_METHODS
do
create l_report_handler.make (roc_config)
create l_methods
l_methods.enable_get
l_methods.enable_post
l_methods.enable_put
router.handle_with_request_methods ("/user", l_report_handler, l_methods)
end
end

View File

@@ -0,0 +1,48 @@
note
description: "Conneg Helper"
date: "$Date: 2014-08-08 16:02:11 -0300 (vi., 08 ago. 2014) $"
revision: "$Revision: 95593 $"
class
SHARED_CONNEG_HELPER
feature -- Access
conneg (req: WSF_REQUEST): SERVER_CONTENT_NEGOTIATION
-- Content negotiatior for all requests.
once
create Result.make ({HTTP_MIME_TYPES}.text_html, "en", "UTF-8", "identity")
end
mime_types_supported (req: WSF_REQUEST): LIST [STRING]
-- All values for Accept header that `Current' can serve.
do
create {ARRAYED_LIST [STRING]} Result.make_from_array (<<{HTTP_MIME_TYPES}.text_html, "application/vnd.collection+json">>)
Result.compare_objects
ensure
mime_types_supported_includes_default: Result.has (conneg (req).default_media_type)
end
media_type_variants (req: WSF_REQUEST): HTTP_ACCEPT_MEDIA_TYPE_VARIANTS
-- Media type negotiation.
do
Result := conneg (req).media_type_preference (mime_types_supported (req), req.http_accept)
end
compression_supported (req: WSF_REQUEST): LIST [STRING]
-- All values for Accept-Encofing header that `Current' can serve.
do
create {ARRAYED_LIST [STRING]} Result.make_from_array (<<"identity","deflate">>)
Result.compare_objects
ensure
compression_supported_includes_default: Result.has (conneg (req).default_encoding)
end
compression_variants (req: WSF_REQUEST): HTTP_ACCEPT_ENCODING_VARIANTS
-- Compression negotiation.
do
Result := conneg (req).encoding_preference (compression_supported (req), req.http_accept_encoding)
end
end