92 lines
2.7 KiB
Go
92 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/cloudprint/cloudprint-backend/internal/repository"
|
|
pb "github.com/cloudprint/cloudprint-backend/proto/generated"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
type LibraryServiceServer struct {
|
|
pb.UnimplementedLibraryServiceServer
|
|
libraryRepo *repository.LibraryRepository
|
|
fileRepo *repository.FileRepository
|
|
}
|
|
|
|
func NewLibraryServiceServer(libraryRepo *repository.LibraryRepository, fileRepo *repository.FileRepository) *LibraryServiceServer {
|
|
return &LibraryServiceServer{
|
|
libraryRepo: libraryRepo,
|
|
fileRepo: fileRepo,
|
|
}
|
|
}
|
|
|
|
func (s *LibraryServiceServer) GetCategories(ctx context.Context, req *pb.GetCategoriesRequest) (*pb.CategoryListResponse, error) {
|
|
categories, err := s.libraryRepo.GetAllCategories(ctx)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "get categories failed: %v", err)
|
|
}
|
|
|
|
pbCategories := make([]*pb.LibraryCategory, 0, len(categories))
|
|
for _, cat := range categories {
|
|
pbCategories = append(pbCategories, &pb.LibraryCategory{
|
|
Id: cat.ID,
|
|
Name: cat.Name,
|
|
Icon: cat.Icon,
|
|
SortOrder: int32(cat.SortOrder),
|
|
})
|
|
}
|
|
|
|
return &pb.CategoryListResponse{Categories: pbCategories}, nil
|
|
}
|
|
|
|
func (s *LibraryServiceServer) GetFiles(ctx context.Context, req *pb.GetLibraryFilesRequest) (*pb.LibraryFileListResponse, error) {
|
|
files, total, err := s.libraryRepo.GetFilesByCategory(ctx, req.CategoryId, int(req.Page), int(req.PageSize))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "get files failed: %v", err)
|
|
}
|
|
|
|
pbFiles := make([]*pb.LibraryFile, 0, len(files))
|
|
for _, file := range files {
|
|
pbFile := &pb.LibraryFile{
|
|
Id: file.ID,
|
|
CategoryId: file.CategoryID,
|
|
FileId: file.FileID,
|
|
Title: file.Title,
|
|
Description: file.Description,
|
|
PageCount: int32(file.PageCount),
|
|
DownloadCount: int32(file.DownloadCount),
|
|
}
|
|
if file.File != nil {
|
|
pbFile.File = &pb.FileInfo{
|
|
Id: file.File.ID,
|
|
FileName: file.File.FileName,
|
|
FilePath: file.File.FilePath,
|
|
FileType: file.File.FileType,
|
|
FileSize: file.File.FileSize,
|
|
}
|
|
}
|
|
pbFiles = append(pbFiles, pbFile)
|
|
}
|
|
|
|
return &pb.LibraryFileListResponse{
|
|
Files: pbFiles,
|
|
Total: int32(total),
|
|
}, nil
|
|
}
|
|
|
|
func (s *LibraryServiceServer) UploadFile(stream pb.LibraryService_UploadFileServer) error {
|
|
// Placeholder for streaming upload
|
|
return status.Errorf(codes.Unimplemented, "streaming upload not implemented")
|
|
}
|
|
|
|
func (s *LibraryServiceServer) DeleteFile(ctx context.Context, req *pb.DeleteLibraryFileRequest) (*pb.Empty, error) {
|
|
err := s.libraryRepo.DeleteFile(ctx, req.LibraryFileId)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "delete file failed: %v", err)
|
|
}
|
|
|
|
return &pb.Empty{}, nil
|
|
}
|