20136b7ac8
* add base controller for public api * add dossiers controller with basic checks * create the dossier * ensure content-type is json * prefill dossier with given values * mark a dossier as prefilled When a dossier is prefilled, it's allowed not to have a user. Plus, we add a secure token to the dossier, which we will need later to set a user after sign in / sign up. * set user as owner of an orphan prefilled dossier When a visitor comes from the dossier_url answered by the public api, the dossier is orphan: - when the user is already authenticated: they become the owner - when the user is not authenticated: they can sign in / sign up / france_connect and then they become the owner So here is the procedure: - allow to sign in / sign up / france connect when user is unauthenticated - set dossier ownership when the dossier is orphan - check dossier ownership when the dossier is not - redirect to brouillon path when user is signed in and owner * mark the dossier as prefilled when it's prefilled (even with a GET request, because it will be useful later on, for exmample in order to cleanup the unused prefilled dossiers) * system spec: prefilling dossier with post request
48 lines
1.2 KiB
Ruby
48 lines
1.2 KiB
Ruby
module ProcedureContextConcern
|
|
extend ActiveSupport::Concern
|
|
|
|
include Devise::Controllers::StoreLocation
|
|
include Devise::StoreLocationExtension
|
|
|
|
def restore_procedure_context
|
|
return unless has_stored_procedure_path?
|
|
|
|
@procedure = find_procedure_in_context
|
|
|
|
if @procedure.blank?
|
|
invalid_procedure_context
|
|
else
|
|
@prefill_token = find_prefill_token_in_context
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def has_stored_procedure_path?
|
|
get_stored_location_for(:user)&.start_with?('/commencer/')
|
|
end
|
|
|
|
def find_procedure_in_context
|
|
uri = URI(get_stored_location_for(:user))
|
|
path_components = uri.path.split('/')
|
|
|
|
if uri.path.start_with?('/commencer/test/')
|
|
Procedure.brouillon.find_by(path: path_components[3])
|
|
elsif uri.path.start_with?('/commencer/')
|
|
Procedure.publiee.find_by(path: path_components[2])
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def find_prefill_token_in_context
|
|
uri = URI(get_stored_location_for(:user))
|
|
CGI.parse(uri.query).dig("prefill_token")&.first if uri.query
|
|
end
|
|
|
|
def invalid_procedure_context
|
|
clear_stored_location_for(:user)
|
|
flash.alert = t('errors.messages.procedure_not_found')
|
|
redirect_to root_path
|
|
end
|
|
end
|