hellokitty-coding-club / LGTM-Backend

Looks good to me (LGTM) 코드 리뷰 매칭 플랫폼 Backend
11 stars 3 forks source link

미션 상태 변경 이벤트 (with Mysql event scheduler) #148

Closed ray-yhc closed 9 months ago

ray-yhc commented 9 months ago

개요

RECRUITING("참가자 모집중"),
MISSION_PROCEEDING("미션 진행중"),
MISSION_FINISHED("미션 종료");

Event Scheduler

RECRUITING to MISSION_PROCEEDING

CREATE EVENT update_mission_from_recruiting_to_proceeding
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP - INTERVAL MINUTE(CURRENT_TIMESTAMP) MINUTE + INTERVAL 1 HOUR
DO
    UPDATE mission
    SET mission_status = "MISSION_PROCEEDING"
    WHERE mission_status = "RECRUITING"
    AND registration_due_date < NOW();

CREATE EVENT update_mission_from_recruiting_to_proceeding

ON SCHEDULE EVERY 1 HOUR ~~ INTERVAL 1 HOUR

Do ...

MISSION_PROCEEDING to MISSION_FINISHED

CREATE EVENT update_mission_from_proceeding_to_finished
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP - INTERVAL MINUTE(CURRENT_TIMESTAMP) MINUTE + INTERVAL 1 HOUR
DO
    UPDATE mission
    SET mission_status = "MISSION_FINISHED"
    WHERE mission_status = "MISSION_PROCEEDING"
    AND mission_id IN (

        SELECT mission_id
        FROM
            (
            SELECT mission.mission_id, max_people_number, COUNT(if(status = 'MISSION_FINISHED' OR status = 'FEEDBACK_REVIEWED', 1, null)) AS count_people_number
            FROM mission
            LEFT JOIN mission_registration mr on mission.mission_id = mr.mission_id
            GROUP BY mission_id
            ) registration_status
        WHERE max_people_number <= count_people_number
    );

CREATE EVENT update_mission_from_proceeding_to_finished

ON SCHEDULE EVERY 1 HOUR ~~ INTERVAL 1 HOUR

Do ... - 1

SELECT mission.mission_id, max_people_number, COUNT(if(status = 'MISSION_FINISHED' OR status = 'FEEDBACK_REVIEWED', 1, null)) AS count_people_number
FROM mission
LEFT JOIN mission_registration mr on mission.mission_id = mr.mission_id
GROUP BY mission_id;
image

Do ... - 2

SELECT mission_id
FROM
    (
        -- ...
    ) registration_status
WHERE max_people_number <= count_people_number;
image

ETC

mysql에서 이벤트 스케줄러 사용하기

SHOW VARIABLES LIKE 'event%';
image

실행중인 이벤트 조회하기

select * from information_schema.events;
image