note
	description: "[
		API to manage CMS User OAuth authentication.
	]"
	date: "$Date$"
	revision: "$Revision$"

class
	CMS_OAUTH_20_API

inherit
	CMS_MODULE_API

	REFACTORING_HELPER

create {CMS_OAUTH_20_MODULE}
	make_with_storage

feature {NONE} -- Initialization

	make_with_storage (a_api: CMS_API; a_oauth_storage: CMS_OAUTH_20_STORAGE_I)
			-- Create an object with api `a_api' and storage `a_oauth_storage'.
		do
			oauth_20_storage := a_oauth_storage
			make (a_api)
		ensure
			oauht_20_storage_set:  oauth_20_storage = a_oauth_storage
		end

feature {CMS_MODULE} -- Access: User oauth storage.

	oauth_20_storage: CMS_OAUTH_20_STORAGE_I
			-- storage interface.

feature -- Access: User Oauth20

	user_oauth2_by_id (a_uid: like {CMS_USER}.id; a_consumer: READABLE_STRING_GENERAL): detachable CMS_USER
			-- Retrieve a user by id `a_uid' for the consumer `a_consumer', if any.
		do
			Result := oauth_20_storage.user_oauth2_by_id (a_uid, a_consumer)
		end

	user_oauth2_by_token (a_token: READABLE_STRING_GENERAL; a_consumer: READABLE_STRING_GENERAL): detachable CMS_USER
			-- Retrieve a user by token `a_token' for the consumer `a_consumer'.
		do
			Result := oauth_20_storage.user_oauth2_by_token (a_token, a_consumer)
		end

	user_oauth2_without_consumer_by_token (a_token: READABLE_STRING_GENERAL): detachable CMS_USER
			-- Retrieve user by token `a_token' searching in all the registered consumers in the system.
		do
			Result := oauth_20_storage.user_oauth2_without_consumer_by_token (a_token)
		end

feature -- Access: Consumers OAuth20

	oauth2_consumers: LIST [STRING]
			-- List of Oauth_20 consumers, if any, empty in other case.
		do
			Result := oauth_20_storage.oauth2_consumers
		end

	oauth_consumer_by_name (a_name: READABLE_STRING_8): detachable CMS_OAUTH_20_CONSUMER
			-- Retrieve a consumer by name `a_name', if any.
		do
			Result := oauth_20_storage.oauth_consumer_by_name (a_name)
		end

	oauth_consumer_by_callback  (a_callback: READABLE_STRING_8): detachable CMS_OAUTH_20_CONSUMER
			-- Retrieve a consumer by callback `a_callback', if any.
		do
			Result := oauth_20_storage.oauth_consumer_by_callback (a_callback)
		end

feature	-- Change: User OAuth20


	new_user_oauth2 (a_token: READABLE_STRING_GENERAL; a_user_profile: READABLE_STRING_32; a_user: CMS_USER; a_consumer: READABLE_STRING_GENERAL)
			-- Add a new user with oauth20 using the consumer `a_consumer'.
		require
			has_id: a_user.has_id
		do
			oauth_20_storage.new_user_oauth2 (a_token, a_user_profile, a_user, a_consumer)
		end


	update_user_oauth2 (a_token: READABLE_STRING_GENERAL; a_user_profile: READABLE_STRING_32; a_user: CMS_USER; a_consumer_table: READABLE_STRING_GENERAL)
			-- Updaate user `a_user' with oauth2 for the consumer `a_consumer'.
		require
			has_id: a_user.has_id
		do
			oauth_20_storage.update_user_oauth2 (a_token, a_user_profile, a_user, a_consumer_table)
		end

end
