# GlossaryApplicationService.java

    package com.yumu.noveltranslator.application.service;

    import com.yumu.noveltranslator.port.dto.common.PageResponse;
    import com.yumu.noveltranslator.port.dto.translation.GlossaryItemRequest;
    import com.yumu.noveltranslator.port.dto.translation.GlossaryResponse;
    import com.yumu.noveltranslator.port.in.GlossaryPort;
    import com.yumu.noveltranslator.port.out.CacheVersionPort;
    import com.yumu.noveltranslator.port.out.TranslationCacheAdminPort;
    import com.yumu.noveltranslator.port.in.UserPort;
    import lombok.RequiredArgsConstructor;
    import org.springframework.stereotype.Service;

    import java.util.List;

    @Service
    @RequiredArgsConstructor
    public class GlossaryApplicationService implements GlossaryPort {

        private final UserPort userPort;
        private final TranslationCacheAdminPort translationCacheAdminPort;
        private final CacheVersionPort cacheVersionPort;

        @Override
        public GlossaryResponse createGlossaryItem(Long userId, GlossaryItemRequest request) {
            GlossaryResponse response = userPort.createGlossaryItem(userId, request);
            translationCacheAdminPort.invalidateKeysForTerm(request.getSourceWord());
            return response;
        }

        @Override
        public GlossaryResponse updateGlossaryItem(Long userId, Long glossaryId, GlossaryItemRequest request) {
            GlossaryResponse response = userPort.updateGlossaryItem(userId, glossaryId, request);
            if (response != null) {
                translationCacheAdminPort.invalidateKeysForTerm(request.getSourceWord());
            }
            return response;
        }

        @Override
        public boolean deleteGlossaryItem(Long userId, Long glossaryId) {
            boolean success = userPort.deleteGlossaryItem(userId, glossaryId);
            if (success) {
                cacheVersionPort.bumpAllVersions();
            }
            return success;
        }

        @Override
        public PageResponse<GlossaryResponse> listGlossaries(Long userId, int page, int pageSize, String search) {
            return userPort.getGlossaryList(userId, page, pageSize, search);
        }

        @Override
        public GlossaryResponse getGlossaryDetail(Long userId, Long glossaryId) {
            return userPort.getGlossaryDetail(userId, glossaryId);
        }

        @Override
        public List<GlossaryResponse> getAllGlossaryTerms(Long userId) {
            return userPort.getGlossaryTerms(userId);
        }

        @Override
        public int importGlossaryCsv(Long userId, List<GlossaryItemRequest> items) {
            int imported = userPort.batchImportGlossaryItems(userId, items);
            for (GlossaryItemRequest item : items) {
                if (item.getSourceWord() != null && !item.getSourceWord().isEmpty()) {
                    translationCacheAdminPort.invalidateKeysForTerm(item.getSourceWord());
                }
            }
            return imported;
        }
    }