76 lines
2.1 KiB
Python
76 lines
2.1 KiB
Python
from sqlalchemy import select, func
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy.orm import selectinload
|
|
|
|
from app.db.models import Resource, User
|
|
from app.schemas.resource import ResourceCreate
|
|
|
|
|
|
async def create_resource(
|
|
db: AsyncSession,
|
|
class_id: int,
|
|
uploader_id: int,
|
|
data: ResourceCreate,
|
|
file_url: str,
|
|
file_type: str,
|
|
file_size: int,
|
|
) -> Resource:
|
|
resource = Resource(
|
|
class_id=class_id,
|
|
uploader_id=uploader_id,
|
|
title=data.title,
|
|
description=data.description,
|
|
file_url=file_url,
|
|
file_type=file_type,
|
|
file_size=file_size,
|
|
category=data.category,
|
|
)
|
|
db.add(resource)
|
|
await db.commit()
|
|
await db.refresh(resource)
|
|
return resource
|
|
|
|
|
|
async def list_resources(
|
|
db: AsyncSession, class_id: int, category: str | None = None, page: int = 1, page_size: int = 20
|
|
) -> tuple[list[Resource], int]:
|
|
query = select(Resource).where(Resource.class_id == class_id)
|
|
count_query = select(func.count(Resource.id)).where(Resource.class_id == class_id)
|
|
|
|
if category:
|
|
query = query.where(Resource.category == category)
|
|
count_query = count_query.where(Resource.category == category)
|
|
|
|
total_result = await db.execute(count_query)
|
|
total = total_result.scalar() or 0
|
|
|
|
result = await db.execute(
|
|
query.options(selectinload(Resource.uploader))
|
|
.order_by(Resource.created_at.desc())
|
|
.offset((page - 1) * page_size)
|
|
.limit(page_size)
|
|
)
|
|
resources = list(result.scalars().all())
|
|
return resources, total
|
|
|
|
|
|
async def get_resource_by_id(db: AsyncSession, resource_id: int) -> Resource | None:
|
|
result = await db.execute(
|
|
select(Resource)
|
|
.options(selectinload(Resource.uploader))
|
|
.where(Resource.id == resource_id)
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
async def increment_download_count(db: AsyncSession, resource: Resource) -> Resource:
|
|
resource.download_count += 1
|
|
await db.commit()
|
|
await db.refresh(resource)
|
|
return resource
|
|
|
|
|
|
async def delete_resource(db: AsyncSession, resource: Resource):
|
|
await db.delete(resource)
|
|
await db.commit()
|