Renamed CMS_API_SERVICE as CMS_API .

Reversed the design, and break dependency CMS_SETUP => CMS_API .
Now CMS_API has attribute setup: CMS_SETUP .
Moved error_handler from CMS_SETUP to CMS_API.
The instance of CMS_SETUP is used when instanciating modules.
The instance of CMS_API is used when instanciating CMS_REPONSE and Handlers/Filters.
The instance of CMS_API is passed as argument to build the CMS_MODULE.router and filter.
This commit is contained in:
2014-11-10 14:59:17 +01:00
parent 730f6d42a4
commit 241b003542
21 changed files with 195 additions and 194 deletions

View File

@@ -17,7 +17,6 @@ feature {NONE} -- Initialization
make (a_layout: CMS_LAYOUT) make (a_layout: CMS_LAYOUT)
do do
create error_handler.make
layout := a_layout layout := a_layout
create configuration.make (layout) create configuration.make (layout)
initialize initialize
@@ -27,7 +26,6 @@ feature {NONE} -- Initialization
do do
configure configure
create modules.make (3) create modules.make (3)
build_api_service
build_mailer build_mailer
initialize_modules initialize_modules
end end
@@ -85,49 +83,6 @@ feature -- Access
end end
build_api_service
local
l_database: DATABASE_CONNECTION
l_retry: BOOLEAN
l_message: STRING
do
if not l_retry then
to_implement ("Refactor database setup")
if attached (create {JSON_CONFIGURATION}).new_database_configuration (layout.application_config_path) as l_database_config then
create {DATABASE_CONNECTION_MYSQL} l_database.login_with_connection_string (l_database_config.connection_string)
create api_service.make (create {CMS_STORAGE_MYSQL}.make (l_database))
else
create {DATABASE_CONNECTION_NULL} l_database.make_common
create api_service.make (create {CMS_STORAGE_NULL})
end
else
to_implement ("Workaround code, persistence layer does not implement yet this kind of error handling.")
-- error hanling.
create {DATABASE_CONNECTION_NULL} l_database.make_common
create api_service.make (create {CMS_STORAGE_NULL})
create l_message.make (1024)
if attached ((create {EXCEPTION_MANAGER}).last_exception) as l_exception then
if attached l_exception.description as l_description then
l_message.append (l_description.as_string_32)
l_message.append ("%N%N")
elseif attached l_exception.trace as l_trace then
l_message.append (l_trace)
l_message.append ("%N%N")
else
l_message.append (l_exception.out)
l_message.append ("%N%N")
end
else
l_message.append ("The application crash without available information")
l_message.append ("%N%N")
end
error_handler.add_custom_error (0, " Database Connection ", l_message)
end
rescue
l_retry := True
retry
end
build_auth_engine build_auth_engine
do do
to_implement ("Not implemented authentication") to_implement ("Not implemented authentication")

View File

@@ -14,9 +14,6 @@ feature -- Access
layout: CMS_LAYOUT layout: CMS_LAYOUT
-- CMS layout. -- CMS layout.
api_service: CMS_API_SERVICE
-- cms api service.
is_html: BOOLEAN is_html: BOOLEAN
-- api with progressive enhancements css and js, server side rendering. -- api with progressive enhancements css and js, server side rendering.
deferred deferred
@@ -32,12 +29,6 @@ feature -- Access
deferred deferred
end end
feature -- Status Report
error_handler: ERROR_HANDLER
-- Error handler.
feature -- Access: Site feature -- Access: Site
site_id: READABLE_STRING_8 site_id: READABLE_STRING_8

View File

@@ -18,63 +18,58 @@ create
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_config: CMS_SETUP) make
do do
name := "basic auth" name := "basic auth"
version := "1.0" version := "1.0"
description := "Service to manage basic authentication" description := "Service to manage basic authentication"
package := "core" package := "core"
config := a_config
end end
config: CMS_SETUP
-- Node configuration.
feature -- Access: router feature -- Access: router
router: WSF_ROUTER router (a_api: CMS_API): WSF_ROUTER
-- Node router. -- Node router.
do do
create Result.make (2) create Result.make (2)
configure_api_login (Result) configure_api_login (a_api, Result)
configure_api_logoff (Result) configure_api_logoff (a_api, Result)
end end
feature -- Access: filter feature -- Access: filter
filters: detachable LIST [WSF_FILTER] filters (a_api: CMS_API): detachable LIST [WSF_FILTER]
-- Possibly list of Filter's module. -- Possibly list of Filter's module.
do do
create {ARRAYED_LIST [WSF_FILTER]} Result.make (2) create {ARRAYED_LIST [WSF_FILTER]} Result.make (2)
Result.extend (create {CORS_FILTER}) Result.extend (create {CORS_FILTER})
Result.extend (create {BASIC_AUTH_FILTER}.make (config)) Result.extend (create {BASIC_AUTH_FILTER}.make (a_api))
end end
feature {NONE} -- Implementation: routes feature {NONE} -- Implementation: routes
configure_api_login (a_router: WSF_ROUTER) configure_api_login (api: CMS_API; a_router: WSF_ROUTER)
local local
l_bal_handler: BASIC_AUTH_LOGIN_HANDLER l_bal_handler: BASIC_AUTH_LOGIN_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_bal_handler.make (config) create l_bal_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
a_router.handle_with_request_methods ("/basic_auth_login", l_bal_handler, l_methods) a_router.handle_with_request_methods ("/basic_auth_login", l_bal_handler, l_methods)
end end
configure_api_logoff (a_router: WSF_ROUTER) configure_api_logoff (api: CMS_API; a_router: WSF_ROUTER)
local local
l_bal_handler: BASIC_AUTH_LOGOFF_HANDLER l_bal_handler: BASIC_AUTH_LOGOFF_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_bal_handler.make (config) create l_bal_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
a_router.handle_with_request_methods ("/basic_auth_logoff", l_bal_handler, l_methods) a_router.handle_with_request_methods ("/basic_auth_logoff", l_bal_handler, l_methods)
end end
feature -- Hooks feature -- Hooks
register_hooks (a_response: CMS_RESPONSE) register_hooks (a_response: CMS_RESPONSE)

View File

@@ -31,8 +31,8 @@ feature -- Basic operations
-- A valid user -- A valid user
if (attached l_auth.type as l_auth_type and then l_auth_type.is_case_insensitive_equal_general ("basic")) and then if (attached l_auth.type as l_auth_type and then l_auth_type.is_case_insensitive_equal_general ("basic")) and then
attached l_auth.login as l_auth_login and then attached l_auth.password as l_auth_password then attached l_auth.login as l_auth_login and then attached l_auth.password as l_auth_password then
if api_service.is_valid_credential (l_auth_login, l_auth_password) then if api.is_valid_credential (l_auth_login, l_auth_password) then
if attached api_service.user_by_name (l_auth_login) as l_user then if attached api.user_by_name (l_auth_login) as l_user then
req.set_execution_variable ("user", l_user) req.set_execution_variable ("user", l_user)
execute_next (req, res) execute_next (req, res)
else else

View File

@@ -50,7 +50,7 @@ feature -- HTTP Methods
if attached req.query_parameter ("prompt") as l_prompt then if attached req.query_parameter ("prompt") as l_prompt then
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
else else
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.set_status_code ({HTTP_STATUS_CODE}.unauthorized) l_page.set_status_code ({HTTP_STATUS_CODE}.unauthorized)
l_page.execute l_page.execute
end end

View File

@@ -20,15 +20,13 @@ feature -- Access
feature -- Router feature -- Router
router: WSF_ROUTER router (a_api: CMS_API): WSF_ROUTER
-- Router configuration. -- Router configuration.
require require
is_enabled: is_enabled is_enabled: is_enabled
deferred deferred
end end
feature -- Hooks configuration feature -- Hooks configuration
register_hooks (a_response: CMS_RESPONSE) register_hooks (a_response: CMS_RESPONSE)
@@ -40,7 +38,7 @@ feature -- Hooks configuration
feature -- Filter feature -- Filter
filters: detachable LIST [WSF_FILTER] filters (a_api: CMS_API): detachable LIST [WSF_FILTER]
-- Optional list of filter for Current module. -- Optional list of filter for Current module.
require require
is_enabled: is_enabled is_enabled: is_enabled

View File

@@ -69,8 +69,8 @@ feature -- HTTP Methods
if attached current_user_name (req) then if attached current_user_name (req) then
-- Existing node -- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (l_node.content, "node_content") l_page.add_variable (l_node.content, "node_content")
l_page.add_variable (l_id.value, "id") l_page.add_variable (l_id.value, "id")
l_page.execute l_page.execute
@@ -78,7 +78,7 @@ feature -- HTTP Methods
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -91,19 +91,19 @@ feature -- HTTP Methods
do do
if attached current_user_name (req) then if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res) do_put (req, res)
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
end end
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -118,16 +118,16 @@ feature -- HTTP Methods
to_implement ("Check if user has permissions") to_implement ("Check if user has permissions")
if attached current_user (req) as l_user then if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req) u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value) u_node.set_id (l_id.integer_value)
api_service.update_node_content (l_user.id, u_node.id, u_node.content) api.update_node_content (l_user.id, u_node.id, u_node.content)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -140,7 +140,7 @@ feature -- Error
local local
l_page: CMS_RESPONSE l_page: CMS_RESPONSE
do do
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (req.absolute_script_url (req.path_info), "request") l_page.add_variable (req.absolute_script_url (req.path_info), "request")
if a_id.is_integer then if a_id.is_integer then
-- resource not found -- resource not found

View File

@@ -68,8 +68,8 @@ feature -- HTTP Methods
do do
-- Existing node -- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (l_node, "node") l_page.add_variable (l_node, "node")
l_page.execute l_page.execute
else else
@@ -89,14 +89,14 @@ feature -- HTTP Methods
to_implement ("Check user permissions!!!") to_implement ("Check user permissions!!!")
if attached current_user (req) as l_user then if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("DELETE") then if l_method.is_case_insensitive_equal ("DELETE") then
do_delete (req, res) do_delete (req, res)
elseif l_method.is_case_insensitive_equal ("PUT") then elseif l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res) do_put (req, res)
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
end end
else else
@@ -106,7 +106,7 @@ feature -- HTTP Methods
-- New node -- New node
u_node := extract_data_form (req) u_node := extract_data_form (req)
u_node.set_author (l_user) u_node.set_author (l_user)
api_service.new_node (u_node) api.new_node (u_node)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
end end
else else
@@ -122,16 +122,16 @@ feature -- HTTP Methods
if attached current_user (req) as l_user then if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req) u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value) u_node.set_id (l_id.integer_value)
api_service.update_node (l_user.id,u_node) api.update_node (l_user.id,u_node)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -144,14 +144,14 @@ feature -- HTTP Methods
do do
if attached current_user_name (req) then if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
api_service.delete_node (l_id.integer_value) api.delete_node (l_id.integer_value)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -165,7 +165,7 @@ feature -- Error
local local
l_page: CMS_RESPONSE l_page: CMS_RESPONSE
do do
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (req.absolute_script_url (req.path_info), "request") l_page.add_variable (req.absolute_script_url (req.path_info), "request")
if a_id.is_integer then if a_id.is_integer then
-- resource not found -- resource not found
@@ -186,7 +186,7 @@ feature {NONE} -- Node
l_page: CMS_RESPONSE l_page: CMS_RESPONSE
do do
if attached current_user_name (req) then if attached current_user_name (req) then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (setup.is_html, "html") l_page.add_variable (setup.is_html, "html")
l_page.add_variable (setup.is_web, "web") l_page.add_variable (setup.is_web, "web")
l_page.execute l_page.execute

View File

@@ -68,8 +68,8 @@ feature -- HTTP Methods
if attached current_user_name (req) then if attached current_user_name (req) then
-- Existing node -- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (l_id.value, "id") l_page.add_variable (l_id.value, "id")
l_page.add_variable (l_node.summary, "node_summary") l_page.add_variable (l_node.summary, "node_summary")
l_page.execute l_page.execute
@@ -77,7 +77,7 @@ feature -- HTTP Methods
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -90,19 +90,19 @@ feature -- HTTP Methods
do do
if attached current_user_name (req) then if attached current_user_name (req) then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res) do_put (req, res)
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
end end
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -116,16 +116,16 @@ feature -- HTTP Methods
do do
if attached current_user (req) as l_user then if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req) u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value) u_node.set_id (l_id.integer_value)
api_service.update_node_summary (l_user.id,u_node.id, u_node.summary) api.update_node_summary (l_user.id,u_node.id, u_node.summary)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -140,7 +140,7 @@ feature -- Error
local local
l_page: CMS_RESPONSE l_page: CMS_RESPONSE
do do
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (req.absolute_script_url (req.path_info), "request") l_page.add_variable (req.absolute_script_url (req.path_info), "request")
if a_id.is_integer then if a_id.is_integer then
-- resource not found -- resource not found

View File

@@ -68,8 +68,8 @@ feature -- HTTP Methods
if attached current_user_name (req) as l_user then if attached current_user_name (req) as l_user then
-- Existing node -- Existing node
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (l_node.title, "node_title") l_page.add_variable (l_node.title, "node_title")
l_page.add_variable (l_id.value, "id") l_page.add_variable (l_id.value, "id")
l_page.execute l_page.execute
@@ -77,7 +77,7 @@ feature -- HTTP Methods
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -89,19 +89,19 @@ feature -- HTTP Methods
do do
if attached current_user_name (req) as l_user then if attached current_user_name (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
if attached {WSF_STRING} req.form_parameter ("method") as l_method then if attached {WSF_STRING} req.form_parameter ("method") as l_method then
if l_method.is_case_insensitive_equal ("PUT") then if l_method.is_case_insensitive_equal ("PUT") then
do_put (req, res) do_put (req, res)
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
end end
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -116,16 +116,16 @@ feature -- HTTP Methods
to_implement ("Check if user has permissions") to_implement ("Check if user has permissions")
if attached current_user (req) as l_user then if attached current_user (req) as l_user then
if attached {WSF_STRING} req.path_parameter ("id") as l_id 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 l_id.is_integer and then attached {CMS_NODE} api.node (l_id.integer_value) as l_node then
u_node := extract_data_form (req) u_node := extract_data_form (req)
u_node.set_id (l_id.integer_value) u_node.set_id (l_id.integer_value)
api_service.update_node_title (l_user.id,u_node.id, u_node.title) api.update_node_title (l_user.id,u_node.id, u_node.title)
(create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url (""))
else else
do_error (req, res, l_id) do_error (req, res, l_id)
end end
else else
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
end end
else else
(create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res)
@@ -139,7 +139,7 @@ feature -- Error
local local
l_page: CMS_RESPONSE l_page: CMS_RESPONSE
do do
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (req.absolute_script_url (req.path_info), "request") l_page.add_variable (req.absolute_script_url (req.path_info), "request")
if a_id.is_integer then if a_id.is_integer then
-- resource not found -- resource not found

View File

@@ -52,8 +52,8 @@ feature -- HTTP Methods
-- At the moment the template is hardcoded, but we can -- At the moment the template is hardcoded, but we can
-- get them from the configuration file and load them into -- get them from the configuration file and load them into
-- the setup class. -- the setup class.
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, setup) create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.add_variable (api_service.nodes, "nodes") l_page.add_variable (api.nodes, "nodes")
l_page.execute l_page.execute
end end
end end

View File

@@ -20,47 +20,48 @@ create
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_config: CMS_SETUP) make (a_setup: CMS_SETUP)
-- Create Current module, disabled by default. -- Create Current module, disabled by default.
do do
name := "node" name := "node"
version := "1.0" version := "1.0"
description := "Service to manage content based on 'node'" description := "Service to manage content based on 'node'"
package := "core" package := "core"
config := a_config config := a_setup
end end
config: CMS_SETUP config: CMS_SETUP
-- Node configuration. -- Node configuration.
feature -- Access: router feature -- Access: router
router: WSF_ROUTER router (a_api: CMS_API): WSF_ROUTER
-- Node router. -- Node router.
do do
create Result.make (5) create Result.make (5)
configure_api_node (Result) configure_api_node (a_api, Result)
configure_api_nodes (Result) configure_api_nodes (a_api, Result)
configure_api_node_title (Result) configure_api_node_title (a_api, Result)
configure_api_node_summary (Result) configure_api_node_summary (a_api, Result)
configure_api_node_content (Result) configure_api_node_content (a_api, Result)
end end
feature {NONE} -- Implementation: routes feature {NONE} -- Implementation: routes
configure_api_node (a_router: WSF_ROUTER) configure_api_node (api: CMS_API; a_router: WSF_ROUTER)
local local
l_node_handler: NODE_HANDLER l_node_handler: NODE_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_node_handler.make (config) create l_node_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
l_methods.enable_post l_methods.enable_post
l_methods.enable_put l_methods.enable_put
a_router.handle_with_request_methods ("/node", l_node_handler, l_methods) a_router.handle_with_request_methods ("/node", l_node_handler, l_methods)
create l_node_handler.make (config) create l_node_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
l_methods.enable_post l_methods.enable_post
@@ -69,23 +70,23 @@ feature {NONE} -- Implementation: routes
a_router.handle_with_request_methods ("/node/{id}", l_node_handler, l_methods) a_router.handle_with_request_methods ("/node/{id}", l_node_handler, l_methods)
end end
configure_api_nodes (a_router: WSF_ROUTER) configure_api_nodes (api: CMS_API; a_router: WSF_ROUTER)
local local
l_nodes_handler: NODES_HANDLER l_nodes_handler: NODES_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_nodes_handler.make (config) create l_nodes_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
a_router.handle_with_request_methods ("/nodes", l_nodes_handler, l_methods) a_router.handle_with_request_methods ("/nodes", l_nodes_handler, l_methods)
end end
configure_api_node_summary (a_router: WSF_ROUTER) configure_api_node_summary (api: CMS_API; a_router: WSF_ROUTER)
local local
l_report_handler: NODE_SUMMARY_HANDLER l_report_handler: NODE_SUMMARY_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_report_handler.make (config) create l_report_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
l_methods.enable_post l_methods.enable_post
@@ -94,12 +95,12 @@ feature {NONE} -- Implementation: routes
end end
configure_api_node_title (a_router: WSF_ROUTER) configure_api_node_title (api: CMS_API; a_router: WSF_ROUTER)
local local
l_report_handler: NODE_TITLE_HANDLER l_report_handler: NODE_TITLE_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_report_handler.make (config) create l_report_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
l_methods.enable_post l_methods.enable_post
@@ -107,12 +108,12 @@ feature {NONE} -- Implementation: routes
a_router.handle_with_request_methods ("/node/{id}/title", l_report_handler, l_methods) a_router.handle_with_request_methods ("/node/{id}/title", l_report_handler, l_methods)
end end
configure_api_node_content (a_router: WSF_ROUTER) configure_api_node_content (api: CMS_API; a_router: WSF_ROUTER)
local local
l_report_handler: NODE_CONTENT_HANDLER l_report_handler: NODE_CONTENT_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
create l_report_handler.make (config) create l_report_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
l_methods.enable_post l_methods.enable_post
@@ -120,7 +121,6 @@ feature {NONE} -- Implementation: routes
a_router.handle_with_request_methods ("/node/{id}/content", l_report_handler, l_methods) a_router.handle_with_request_methods ("/node/{id}/content", l_report_handler, l_methods)
end end
feature -- Hooks feature -- Hooks
register_hooks (a_response: CMS_RESPONSE) register_hooks (a_response: CMS_RESPONSE)
@@ -150,7 +150,7 @@ feature -- Hooks
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE) menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE)
local local
lnk: CMS_LOCAL_LINK lnk: CMS_LOCAL_LINK
perms: detachable ARRAYED_LIST [READABLE_STRING_8] -- perms: detachable ARRAYED_LIST [READABLE_STRING_8]
do do
create lnk.make ("List of nodes", "/nodes") create lnk.make ("List of nodes", "/nodes")
a_menu_system.main_menu.extend (lnk) a_menu_system.main_menu.extend (lnk)

View File

@@ -1,33 +1,86 @@
note note
description: "Summary description for {CMS_API_SERVICE}." description: "Summary description for {CMS_API}."
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
CMS_API_SERVICE CMS_API
inherit inherit
SHARED_ERROR SHARED_ERROR
REFACTORING_HELPER
REFACTORING_HELPER
create create
make make
feature -- Initialize feature -- Initialize
make (a_storage: CMS_STORAGE) make (a_setup: CMS_SETUP)
-- Create the API service with an storege `a_storage'. -- Create the API service with an storege `a_storage'.
do do
storage := a_storage setup := a_setup
create error_handler.make
initialize
set_successful set_successful
ensure ensure
storage_set: storage = a_storage -- storage_set: storage = a_storage
end
setup: CMS_SETUP
-- CMS setup.
initialize
local
l_database: DATABASE_CONNECTION
retried: BOOLEAN
l_message: STRING
do
if not retried then
to_implement ("Refactor database setup")
if attached (create {JSON_CONFIGURATION}).new_database_configuration (setup.layout.application_config_path) as l_database_config then
create {DATABASE_CONNECTION_MYSQL} l_database.login_with_connection_string (l_database_config.connection_string)
create {CMS_STORAGE_MYSQL} storage.make (l_database)
else
create {DATABASE_CONNECTION_NULL} l_database.make_common
create {CMS_STORAGE_NULL} storage
end
else
to_implement ("Workaround code, persistence layer does not implement yet this kind of error handling.")
-- error hanling.
create {DATABASE_CONNECTION_NULL} l_database.make_common
create {CMS_STORAGE_NULL} storage
create l_message.make (1024)
if attached ((create {EXCEPTION_MANAGER}).last_exception) as l_exception then
if attached l_exception.description as l_description then
l_message.append (l_description.as_string_32)
l_message.append ("%N%N")
elseif attached l_exception.trace as l_trace then
l_message.append (l_trace)
l_message.append ("%N%N")
else
l_message.append (l_exception.out)
l_message.append ("%N%N")
end
else
l_message.append ("The application crash without available information")
l_message.append ("%N%N")
end
error_handler.add_custom_error (0, " Database Connection ", l_message)
end
rescue
retried := True
retry
end end
feature -- Access feature -- Access
error_handler: ERROR_HANDLER
-- Error handler.
feature -- Status Report
is_valid_credential (l_auth_login, l_auth_password: READABLE_STRING_32): BOOLEAN is_valid_credential (l_auth_login, l_auth_password: READABLE_STRING_32): BOOLEAN
do do
Result := storage.is_valid_credential (l_auth_login, l_auth_password) Result := storage.is_valid_credential (l_auth_login, l_auth_password)

View File

@@ -41,11 +41,11 @@ create
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_setup: CMS_SETUP) make (a_api: CMS_API)
-- Build a CMS service with `a_setup' configuration. -- Build a CMS service with `a_setup' configuration.
do do
setup := a_setup api := a_api
configuration := a_setup.configuration configuration := a_api.setup.configuration
initialize initialize
end end
@@ -103,36 +103,41 @@ feature -- Settings: router
-- <Precursor> -- <Precursor>
local local
l_module: CMS_MODULE l_module: CMS_MODULE
l_api: like api
l_router: like router
do do
log.write_debug (generator + ".setup_router") log.write_debug (generator + ".setup_router")
-- Configure root of api handler. -- Configure root of api handler.
configure_api_root
l_router := router
configure_api_root (l_router)
-- Include routes from modules. -- Include routes from modules.
l_api := api
across across
modules as ic modules as ic
loop loop
l_module := ic.item l_module := ic.item
router.import (l_module.router) l_router.import (l_module.router (l_api))
end end
-- Configure files handler. -- Configure files handler.
configure_api_file_handler configure_api_file_handler (l_router)
end end
configure_api_root configure_api_root (a_router: WSF_ROUTER)
local local
l_root_handler: CMS_ROOT_HANDLER l_root_handler: CMS_ROOT_HANDLER
l_methods: WSF_REQUEST_METHODS l_methods: WSF_REQUEST_METHODS
do do
log.write_debug (generator + ".configure_api_root") log.write_debug (generator + ".configure_api_root")
create l_root_handler.make (setup) create l_root_handler.make (api)
create l_methods create l_methods
l_methods.enable_get l_methods.enable_get
router.handle_with_request_methods ("/", l_root_handler, l_methods) a_router.handle_with_request_methods ("/", l_root_handler, l_methods)
router.handle_with_request_methods ("", l_root_handler, l_methods) a_router.handle_with_request_methods ("", l_root_handler, l_methods)
end end
configure_api_file_handler configure_api_file_handler (a_router: WSF_ROUTER)
local local
fhdl: WSF_FILE_SYSTEM_HANDLER fhdl: WSF_FILE_SYSTEM_HANDLER
do do
@@ -143,7 +148,7 @@ feature -- Settings: router
do do
execute_default (ia_req, ia_res) execute_default (ia_req, ia_res)
end) end)
router.handle_with_request_methods ("/", fhdl, router.methods_GET) a_router.handle_with_request_methods ("/", fhdl, router.methods_GET)
end end
feature -- Execute Filter feature -- Execute Filter
@@ -162,6 +167,7 @@ feature -- Filters
local local
f, l_filter: detachable WSF_FILTER f, l_filter: detachable WSF_FILTER
l_module: CMS_MODULE l_module: CMS_MODULE
l_api: like api
do do
log.write_debug (generator + ".create_filter") log.write_debug (generator + ".create_filter")
l_filter := Void l_filter := Void
@@ -172,18 +178,19 @@ feature -- Filters
l_filter := f l_filter := f
-- Error Filter -- Error Filter
create {CMS_ERROR_FILTER} f.make (setup) create {CMS_ERROR_FILTER} f.make (api)
f.set_next (l_filter) f.set_next (l_filter)
l_filter := f l_filter := f
-- Include filters from modules -- Include filters from modules
l_api := api
across across
modules as ic modules as ic
loop loop
l_module := ic.item l_module := ic.item
if if
l_module.is_enabled and then l_module.is_enabled and then
attached l_module.filters as l_m_filters attached l_module.filters (l_api) as l_m_filters
then then
across l_m_filters as f_ic loop across l_m_filters as f_ic loop
f := f_ic.item f := f_ic.item
@@ -213,11 +220,16 @@ feature -- Filters
f.set_next (Current) f.set_next (Current)
end end
feature -- Access feature -- Access
api: CMS_API
-- API service.
setup: CMS_SETUP setup: CMS_SETUP
-- CMS setup. -- CMS setup.
do
Result := api.setup
end
configuration: CMS_CONFIGURATION configuration: CMS_CONFIGURATION
-- CMS configuration. -- CMS configuration.

View File

@@ -20,13 +20,13 @@ feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE) execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the filter -- Execute the filter
do do
if not setup.error_handler.has_error then if not api.error_handler.has_error then
log.write_information (generator + ".execute") log.write_information (generator + ".execute")
execute_next (req, res) execute_next (req, res)
else else
log.write_critical (generator + ".execute" + setup.error_handler.as_string_representation ) log.write_critical (generator + ".execute" + api.error_handler.as_string_representation )
(create {ERROR_500_CMS_RESPONSE}.make (req, res, setup)).execute (create {ERROR_500_CMS_RESPONSE}.make (req, res, api)).execute
setup.error_handler.reset api.error_handler.reset
end end
end end

View File

@@ -19,20 +19,20 @@ inherit
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_setup: CMS_SETUP) make (a_api: CMS_API)
do do
setup := a_setup api := a_api
end end
feature -- Setup feature -- Setup
setup: CMS_SETUP setup: CMS_SETUP
do
Result := api.setup
end
feature -- API Service feature -- API Service
api_service: CMS_API_SERVICE api: CMS_API
do
Result := setup.api_service
end
end end

View File

@@ -48,7 +48,7 @@ feature -- HTTP Methods
do_get (req: WSF_REQUEST; res: WSF_RESPONSE) do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor> -- <Precursor>
do do
(create {HOME_CMS_RESPONSE}.make (req, res, setup)).execute (create {HOME_CMS_RESPONSE}.make (req, res, api)).execute
end end
end end

View File

@@ -15,10 +15,10 @@ inherit
feature {NONE} -- Initialization feature {NONE} -- Initialization
make(req: WSF_REQUEST; res: WSF_RESPONSE; a_setup: like setup) make(req: WSF_REQUEST; res: WSF_RESPONSE; a_api: like api)
do do
status_code := {HTTP_STATUS_CODE}.ok status_code := {HTTP_STATUS_CODE}.ok
setup := a_setup api := a_api
request := req request := req
response := res response := res
create header.make create header.make
@@ -56,8 +56,14 @@ feature -- Access
response: WSF_RESPONSE response: WSF_RESPONSE
api: CMS_API
-- Current CMS API.
setup: CMS_SETUP setup: CMS_SETUP
-- Current setup -- Current setup
do
Result := api.setup
end
status_code: INTEGER status_code: INTEGER
@@ -222,8 +228,6 @@ feature -- Menu
primary_tabs: CMS_MENU primary_tabs: CMS_MENU
do do
Result := menu_system.primary_tabs Result := menu_system.primary_tabs
debug
end
end end
feature -- Blocks initialization feature -- Blocks initialization
@@ -378,8 +382,6 @@ feature -- Blocks
header_block: CMS_CONTENT_BLOCK header_block: CMS_CONTENT_BLOCK
local local
s: STRING s: STRING
tpl: SMARTY_CMS_PAGE_TEMPLATE
l_page: CMS_HTML_PAGE
l_hb: STRING l_hb: STRING
do do
create s.make_from_string (theme.menu_html (main_menu, True)) create s.make_from_string (theme.menu_html (main_menu, True))

View File

@@ -21,7 +21,7 @@ feature -- Generation
custom_prepare (page: CMS_HTML_PAGE) custom_prepare (page: CMS_HTML_PAGE)
do do
Precursor (page) Precursor (page)
page.register_variable (setup.api_service.recent_nodes (0, 5), "nodes") page.register_variable (api.recent_nodes (0, 5), "nodes")
end end
feature -- Execution feature -- Execution

View File

@@ -15,21 +15,17 @@ create
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_config: CMS_SETUP) make
do do
name := "Demo module" name := "Demo module"
version := "1.0" version := "1.0"
description := "Service to demonstrate and test cms system" description := "Service to demonstrate and test cms system"
package := "demo" package := "demo"
config := a_config
end end
config: CMS_SETUP
-- Node configuration.
feature -- Access: router feature -- Access: router
router: WSF_ROUTER router (a_api: CMS_API): WSF_ROUTER
-- Node router. -- Node router.
do do
create Result.make (2) create Result.make (2)

View File

@@ -117,12 +117,12 @@ feature -- CMS Initialization
initialize_cms (a_setup: CMS_SETUP) initialize_cms (a_setup: CMS_SETUP)
local local
cms: CMS_SERVICE cms: CMS_SERVICE
api: CMS_API
do do
log.write_debug (generator + ".initialize_cms") log.write_debug (generator + ".initialize_cms")
setup_modules (a_setup) setup_modules (a_setup)
create api.make (a_setup)
create cms.make (a_setup) create cms.make (api)
cms_service := cms cms_service := cms
end end
@@ -133,14 +133,13 @@ feature -- CMS setup
local local
m: CMS_MODULE m: CMS_MODULE
do do
create {BASIC_AUTH_MODULE} m.make (a_setup) create {BASIC_AUTH_MODULE} m.make
m.enable m.enable
a_setup.modules.extend (m) a_setup.modules.extend (m)
create {CMS_DEMO_MODULE} m.make (a_setup) create {CMS_DEMO_MODULE} m.make
m.enable m.enable
a_setup.modules.extend (m) a_setup.modules.extend (m)
end end
setup_storage (a_setup: CMS_SETUP) setup_storage (a_setup: CMS_SETUP)