class DNSManager::Request
	IPC::JSON.message Login, 0 do
		property token : String

		def initialize(@token)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event)
			response = dnsmanagerd.decode_token token
			case response
			when AuthD::Response::User
				dnsmanagerd.logged_users[event.fd] = response.user
				# In case we want to log their last connection.
				#dnsmanagerd.auth.edit_profile_content user.uid, {
				#	"dnsmanager-last-connection" => JSON::Any.new Time.utc.to_s
				#}
				user_id = response.user.uid

				accepted_domains = dnsmanagerd.configuration.accepted_domains.not_nil!

				# Limit the number of domains in this message.
				# Pagination will be required beyond a hundred domains.
				user_domains = dnsmanagerd.storage.user_domains(user_id).[0..100]
				is_admin = dnsmanagerd.is_admin? user_id

				Response::Logged.new is_admin, accepted_domains, user_domains
			when AuthD::Response::ErrorUserNotFound
				Baguette::Log.error "Trying to authenticate an unknown user."
				Response::ErrorInvalidToken.new
			else
				Response::ErrorInvalidToken.new
			end
		rescue e
			# FIXME: Should those be logged?
			Baguette::Log.error "Error: #{e}"
			Response::Error.new "unauthorized"
		end
	end
	DNSManager.requests << Login

	IPC::JSON.message DeleteUser, 1 do
		property user_id : UserDataID? = nil

		def initialize(@user_id = nil)
		end

		def to_s(io : IO)
			super io
			io << " (user_id: #{@user_id})"
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event)
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user

			dnsmanagerd.storage.delete_user_data user.uid, user_id
		end
	end
	DNSManager.requests << DeleteUser
end