Слишком много кода. Подозреваю, эту логику можно унести вглубь state или database.