Add initial setup step if the database is empty

This commit is contained in:
Hugo Peixoto 2023-07-11 00:36:05 +01:00
parent f3a1def396
commit ae4a3c62e4
7 changed files with 92 additions and 0 deletions

View File

@ -81,3 +81,38 @@ Funcionalidades que gostaríamos de implementar mas ainda não tivemos tempo:
- "Multitenancy", onde uma única instalação do `saucy` permite servir várias - "Multitenancy", onde uma única instalação do `saucy` permite servir várias
instituições; instituições;
- Melhorias genéricas ao estilo da plataforma. - Melhorias genéricas ao estilo da plataforma.
## Requisitos técnicos
Para o projecto funcionar a 100%, precisa de algumas dependências externas:
- Uma base de dados postgresql, onde são armazenados todos os dados;
- Configuração de SMTP, para enviar lembretes de pagamentos de quotas e
mensagens de recuperação de senha para a administração;
- Configuração [ifthenpay](https://www.ifthenpay.com), para suportar pagamentos
multibanco/mbway.
Todas estas coisas são configuráveis via variáveis de ambiente. A lista de
variáveis está disponível no ficheiro `env.example`.
## Pôr isto a dar
Para simplificar a instalação, disponibilizamos uma imagem `docker`:
```
docker pull git.ansol.org/ansol/saucy:latest
```
A imagem está configurada para lançar o servidor web no porto 3000. É
recomendado configurar um reverse-proxy, como o nginx ou o apache, à frente
deste serviço que trate de fazer o TLS.
Quando se acede à plataforma pela primeira vez, é-nos pedido um endereço de
email para criar a primeira conta de administração. Este endereço precisa de
conseguir receber mensagens para o processo de recuperação de senha funcionar.
Depois deste processo terminado, é possível gerir até 5 contas de
administração. Atenção que qualquer uma delas consegue apagar as restantes (e
até a si própria).

View File

@ -1,4 +1,14 @@
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
include Clearance::Controller include Clearance::Controller
before_action :set_paper_trail_whodunnit before_action :set_paper_trail_whodunnit
before_action :initial_setup_redirect
def initial_setup_redirect
redirect_to '/initial_setup' if requires_initial_setup?
end
def requires_initial_setup?
User.count.zero? && Member.unscoped.count.zero?
end
end end

View File

@ -0,0 +1,15 @@
class InitialSetupsController < ApplicationController
skip_before_action :initial_setup_redirect
before_action do
redirect_to("/") if !requires_initial_setup?
end
def show
end
def create
if User.count.zero?
@user = User.create!(email: params[:email], password: SecureRandom.hex(32))
end
end
end

View File

@ -0,0 +1,8 @@
<h1>Conta de administração criada!</h1>
<p>
Agora que o processo de criação de conta está terminado, basta usar o mecanismo
de recuperação de senha para definir uma senha nova:
</p>
<p style="text-align: center;"><%= link_to t('passwords.new.title'), new_password_path %></p>

View File

@ -0,0 +1,20 @@
<h1>Configurar o saucy</h1>
<p>
Esta instalação do ainda não foi configurada. Para terminar o processo de
configuração, é preciso criar uma conta de administração.
</p>
<p>
Depois deste processo terminado, é possível gerir até 5 contas de
administração. Atenção que qualquer uma delas consegue apagar as restantes (e
até a si própria).
</p>
<%= form_with(url: initial_setup_path) do |form| %>
<p><strong>Qual o endereço de correio electrónico que deve ser usado para criar a conta de administração?</strong></p>
<p>O endereço especificado tem de conseguir receber mensagens para o mecanismo de recuperação de senha funcionar.</p>
<%= form.email_field :email %>
<%= form.submit "Configurar" %>
<% end %>

View File

@ -84,3 +84,5 @@
</tr> </tr>
<% end %> <% end %>
</table> </table>
<%= link_to "Enviar email de confirmação de inscrição", new_member_message_path(@member, type: :welcome) %>

View File

@ -31,4 +31,6 @@ Rails.application.routes.draw do
resource :board, only: [:edit, :update] resource :board, only: [:edit, :update]
resource :letters, only: [:create] resource :letters, only: [:create]
resource :initial_setup, only: [:create, :show]
end end