TopicSource.java 4.0 KB
// keyword/entity/TopicSource.java
package com.aigeo.keyword.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.LocalDateTime;

/**
 * 主题来源实体类
 * 对应数据库表:ai_topic_sources
 * 
 * 存储主题内容的来源配置信息,包括:
 * - 搜索引擎配置和查询模式
 * - 结果字段映射和最大结果数
 * - 激活状态和时间管理
 * 
 * @author AIGEO Team
 * @since 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ai_topic_sources", indexes = {
    @Index(name = "idx_topic_sources_active", columnList = "is_active"),
    @Index(name = "idx_topic_sources_engine", columnList = "engine")
})
public class TopicSource {
    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    /**
     * 来源名称
     */
    @NotBlank(message = "来源名称不能为空")
    @Column(name = "name", nullable = false, length = 100)
    private String name;

    /**
     * 搜索引擎类型(如:baidu, google等)
     */
    @NotBlank(message = "搜索引擎不能为空")
    @Column(name = "engine", nullable = false, length = 50)
    private String engine;

    /**
     * 查询模式/模板
     */
    @NotBlank(message = "查询模式不能为空")
    @Column(name = "query_pattern", nullable = false, length = 500)
    private String queryPattern;

    /**
     * 结果字段映射
     */
    @NotBlank(message = "结果字段不能为空")
    @Column(name = "result_field", nullable = false, length = 200)
    private String resultField;

    /**
     * 最大结果数量
     */
    @Column(name = "max_results")
    @Builder.Default
    private Integer maxResults = 100;

    /**
     * 是否激活
     */
    @Column(name = "is_active")
    @Builder.Default
    private Boolean isActive = true;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_at")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;

    /**
     * 实体创建前的处理
     */
    @PrePersist
    protected void onCreate() {
        if (isActive == null) isActive = true;
        if (maxResults == null) maxResults = 100;
    }

    /**
     * 检查是否为激活状态
     */
    public boolean isActive() {
        return Boolean.TRUE.equals(isActive);
    }

    /**
     * 激活来源
     */
    public void activate() {
        this.isActive = true;
    }

    /**
     * 停用来源
     */
    public void deactivate() {
        this.isActive = false;
    }

    /**
     * 检查是否为百度搜索引擎
     */
    public boolean isBaiduEngine() {
        return "baidu".equalsIgnoreCase(engine);
    }

    /**
     * 检查是否为谷歌搜索引擎
     */
    public boolean isGoogleEngine() {
        return "google".equalsIgnoreCase(engine);
    }

    /**
     * 检查是否配置了最大结果数限制
     */
    public boolean hasMaxResultsLimit() {
        return maxResults != null && maxResults > 0;
    }

    /**
     * 获取有效的最大结果数(如果未设置则返回默认值)
     */
    public int getEffectiveMaxResults() {
        return maxResults != null && maxResults > 0 ? maxResults : 100;
    }

    /**
     * 获取来源的描述信息
     */
    public String getSourceDescription() {
        return String.format("%s (%s引擎)", name, engine);
    }
}