JobData/app/api/v1/job/job.py

252 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import APIRouter, BackgroundTasks, Depends
from typing import Dict, Any
from app.services.job import create_data_router_service, PlatformType, DataType
from app.core.clickhouse import clickhouse_manager
from app.controllers.job import (
UniversalDataController,
UniversalDataRequest,
BatchDataRequest,
create_universal_data_controller
)
router = APIRouter(tags=["通用数据接口"])
async def get_universal_data_controller() -> UniversalDataController:
"""获取通用数据控制器实例"""
clickhouse_client = await clickhouse_manager.get_client()
data_router_service = create_data_router_service(clickhouse_client)
return create_universal_data_controller(data_router_service)
@router.post("/data/store", summary="存储单条数据")
async def store_single_data(
request: UniversalDataRequest,
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
通用数据存储接口 - 存储单条数据
支持的平台:
- boss: Boss直聘
- qcwy: 前程无忧
- zhilian: 智联招聘
支持的数据类型:
- job: 职位数据
- company: 公司数据
示例请求:
```json
{
"data": {
"jobBaseInfoVO": {
"encryptJobId": "abc123",
"positionName": "Python开发工程师",
"locationName": "北京"
},
"brandComInfoVO": {
"brandName": "某科技公司",
"industryName": "互联网"
}
},
"data_type": "job",
"platform": "boss",
"check_duplicate": true,
"duplicate_key": "encrypt_job_id"
}
```
"""
return await controller.store_single_data(request)
@router.post("/data/batch-store", summary="批量存储数据")
async def store_batch_data(
request: BatchDataRequest,
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
通用数据存储接口 - 批量存储数据
示例请求:
```json
{
"data_list": [
{
"jobBaseInfoVO": {
"encryptJobId": "abc123",
"positionName": "Python开发工程师"
}
},
{
"jobBaseInfoVO": {
"encryptJobId": "def456",
"positionName": "Java开发工程师"
}
}
],
"data_type": "job",
"platform": "boss",
"check_duplicate": true
}
```
"""
return await controller.store_batch_data(request)
@router.post("/data/store-async", summary="异步存储单条数据")
async def store_single_data_async(
request: UniversalDataRequest,
background_tasks: BackgroundTasks,
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
通用数据存储接口 - 异步存储单条数据
适用于大量数据或不需要立即返回结果的场景
"""
return await controller.store_single_data_async(background_tasks, request)
@router.post("/data/batch-store-async", summary="异步批量存储数据")
async def store_batch_data_async(
request: BatchDataRequest,
background_tasks: BackgroundTasks,
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
通用数据存储接口 - 异步批量存储数据
适用于大批量数据处理场景
"""
return await controller.store_batch_data_async(background_tasks, request)
@router.get("/data", summary="查询数据")
async def query_data(
platform: str,
data_type: str,
page: int = 1,
page_size: int = 20,
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
通用数据查询接口
参数:
- platform: 平台类型 (boss/qcwy/zhilian)
- data_type: 数据类型 (job/company)
- page: 页码默认1
- page_size: 每页大小默认20
"""
# 转换字符串参数为枚举类型
platform_enum = PlatformType(platform)
data_type_enum = DataType(data_type)
return await controller.query_data(platform_enum, data_type_enum, page, page_size)
@router.get("/platforms", summary="获取支持的平台和数据类型")
async def get_supported_platforms(
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""
获取支持的平台和数据类型信息
返回:
- 支持的平台列表
- 支持的数据类型列表
- 各平台的默认重复检查字段
"""
return await controller.get_supported_platforms()
# 为了兼容性,提供平台特定的路由别名
@router.post("/boss/job", summary="Boss直聘职位数据存储")
async def store_boss_job_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""Boss直聘职位数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="job",
platform="boss",
check_duplicate=True,
)
return await controller.store_single_data(request)
@router.post("/boss/company", summary="Boss直聘公司数据存储")
async def store_boss_company_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""Boss直聘公司数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="company",
platform="boss",
check_duplicate=True,
)
return await controller.store_single_data(request)
@router.post("/qcwy/job", summary="前程无忧职位数据存储")
async def store_qcwy_job_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""前程无忧职位数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="job",
platform="qcwy",
check_duplicate=True,
)
return await controller.store_single_data(request)
@router.post("/qcwy/company", summary="前程无忧公司数据存储")
async def store_qcwy_company_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""前程无忧公司数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="company",
platform="qcwy",
check_duplicate=True,
)
return await controller.store_single_data(request)
@router.post("/zhilian/job", summary="智联招聘职位数据存储")
async def store_zhilian_job_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""智联招聘职位数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="job",
platform="zhilian",
check_duplicate=True,
)
return await controller.store_single_data(request)
@router.post("/zhilian/company", summary="智联招聘公司数据存储")
async def store_zhilian_company_data(
data: Dict[str, Any],
controller: UniversalDataController = Depends(get_universal_data_controller)
) -> Dict[str, Any]:
"""智联招聘公司数据存储的便捷接口"""
request = UniversalDataRequest(
data=data,
data_type="company",
platform="zhilian",
check_duplicate=True,
)
return await controller.store_single_data(request)