기존에 dataFercherController에 작성했던 코드에 비즈니스 로직이 많이 있었는데

컨트롤러는 요청을 처리하고 모델로부터의 응답을 뷰에 전달하는 역할만을 수행하도록 하기 위해서 비즈니스 로직을 guildPageService.js로 분리했다.

그리고 findNewAndRemovedMembers 함수를 새로 작성해서 기존 DB와 새로 업데이트 된 DB를 비교해서 신규 가입자와 탈퇴자를 조회할 수 있도록 했다.

기존 로직에서는 탈퇴자의 정보 갱신이 되지 않아서 findNewAndRemovedMembers 를 통해 찾은 탈퇴자 목록의 정보 갱신도 추가로 해주도록 수정했다.

// guildPageService.js

const WorldService = require('./worldService.js');
const GuildService = require('./guildService.js');
const CharacterService = require('./characterService.js');

function findNewAndRemovedMembers(preGuildMembers, updatedGuildMembers) {
    const newMembers = updatedGuildMembers.filter(member => !preGuildMembers.includes(member));
    const removedMembers = preGuildMembers.filter(member => !updatedGuildMembers.includes(member));

    return { newMembers, removedMembers };
}

async function createOrUpdateGuildPage(guildName, worldName) {

    const currentDate = new Date();
    currentDate.setHours(0, 0, 0, 0);
    currentDate.setDate(currentDate.getDate() - 1);
    currentDate.setHours(currentDate.getHours() + 9);

    // const worldId = await WorldService.getWorldId(worldName);
    const guildExists = await GuildService.getGuild(guildName, worldName);

    if (!guildExists) {
        const guildMembers = await GuildService.createGuild(guildName, worldName);
        for (const guildMember of guildMembers) {
            await CharacterService.createCharacter(guildName, worldName, guildMember);
        }

    } else if (guildExists.last_updated < currentDate) {
        const preGuildMembers = await CharacterService.getCharactersByGuild(guildName, worldName);
        const preGuildMemberNames = preGuildMembers.map(member => member.name);
        // 길드 정보 업데이트
        const updatedGuildMembers = await GuildService.updateGuild(guildName, worldName);
        // 신규 가입자, 탈퇴자 조회
        const { newMembers, removedMembers } = findNewAndRemovedMembers(preGuildMemberNames, updatedGuildMembers);
        // 업데이트 한 길드원 + 탈퇴자 정보 갱신
        const guildMembers = updatedGuildMembers.concat(removedMembers);

        for(const guildMember of guildMembers) {
            const characterExist = await CharacterService.getCharacter(guildMember);

            if(!characterExist) {
                await CharacterService.createCharacter(guildName, worldName, guildMember);
            } else {
                await CharacterService.updateCharacter(guildMember);
            }
        }
    }
}

module.exports = {
    createOrUpdateGuildPage,
}

그리고 dataFetcherController는 이렇게 수정해주었다.

// dataFetcherController.js

const GuildService = require('../services/guildService.js');
const CharacterService = require('../services/characterService.js');
const GuildPageService = require('../services/guildPageService.js');

async function getGuildController(req, res) {
    const guildName = req.params.guildName;
    const worldName = req.params.worldName;
    try {
        const guild = await GuildService.getGuild(guildName, worldName);

        if (guild) {
            res.json(guild);
        } else {
            res.status(404).json({ error: '존재하지 않는 길드' });
        }
    } catch (error) {
        console.error('에러 발생: ', error);
        res.status(500).send('서버 에러');
    }
}

async function getCharacterController(req, res) {
    const guildName = req.params.guildName;
    const worldName = req.params.worldName;
    try {
        const characters = await CharacterService.getCharactersByGuild(guildName, worldName);

        if (characters) {
            const response = characters.map(record => ({
                ...record.toJSON(),
            }));
            res.json(response);
        } else {
            res.status(404).json({ error: '존재하지 않는 캐릭터' });
        }
    } catch (error) {
        console.error('에러 발생: ', error);
        res.status(500).send('서버 에러');
    }
}

async function dataFetcherController(req, res) {
    const guildName = req.params.guildName;
    const worldName = req.params.worldName;

    try {
        await GuildPageService.createOrUpdateGuildPage(guildName, worldName);
        res.status(200).send('데이터 업데이트 성공');
    } catch (error) {
        console.error('에러 발생:', error);
        res.status(500).send('서버 에러');
    }
}

module.exports = {
    getGuildController,
    getCharacterController,
    dataFetcherController,
}

DB 수정 사항