mentorenwahl/backend/src/backend/runner.cr

71 lines
2.1 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/>.
require "service"
require "log"
require "retriable"
require "clear"
module Backend
# Backend runner
class Runner < Service::Runner
Log = ::Log.for(self)
# Service starters
def starters : Array(Service::Starter)
[
Service::SynchronousStarter.new([
Web::Service.new.as(Service),
Worker::Service.new.as(Service),
] of Service).as(Service::Starter),
]
end
# Run the backend
def run : self
{% if !flag?(:release) %}
Log.warn { "Backend is running in development mode! Do not use this in production!" }
pp Backend.config
{% end %}
Log.info { "Checking if DB schema is up to date..." }
Retriable.retry(backoff: false, base_interval: 10.seconds, multiplier: 1.0) do
ex : Clear::SQL::Error? = nil
if begin
Db.schema_up_to_date?
rescue exc : Clear::SQL::Error
ex = exc
false
end && ex.nil?
Log.info { "Database schema is up to date." }
else
Log.warn { "Database schema is not up to date. Please run `bash scripts/micrate.sh up`." }
if ex
raise ex
else
raise "Database schema is not up to date" unless Backend.config.db.allow_old_schema
end
end
end
Log.info { "Starting services..." }
super
end
end
end