mentorenwahl/docker/backend/src/backend/run.cr

59 lines
2 KiB
Crystal

# Mentorenwahl: A fullstack application for assigning mentors to students based on their whishes.
# Copyright (C) 2022 Dominic Grimm
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
module Backend
extend self
# Runs backend services
def run : Nil
{% if flag?(:development) %}
Log.warn { "Backend is running in development mode! Do not use this in production!" }
{% end %}
Log.info { "Checking if DB schema is up to date..." }
retry(backoff: false, base_interval: 10.seconds, multiplier: 1.0) do
case retry(on: DB::ConnectionRefused, backoff: false) do
Db.schema_up_to_date_compare
end
when nil
Log.fatal { "No database schema is applied. Please run `bash scripts/micrate.sh up` urgently!" }
raise Exception.new
when -1
Log.warn { "Database schema is not up to date. Please run `bash scripts/micrate.sh up`." }
when 0
Log.info { "Database schema is up to date." }
else
Log.warn { "Database schema is maybe up to date but not consistent. Please run `bash scripts/micrate.sh up` to be safe." }
end
end
Log.info { "Starting services..." }
channel = Channel(Nil).new(SERVICES.size)
SERVICES.each do |service|
spawn do
service.call
channel.send(nil)
end
end
SERVICES.size.times do
channel.receive
end
Fiber.yield
Log.info { "Backend services started." }
end
end