files.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. "use server";
  2. import { PrismaClient } from "@prisma/client";
  3. import { revalidatePath } from "next/cache";
  4. const prisma = new PrismaClient();
  5. export interface FileData {
  6. id: string;
  7. filename: string;
  8. mimetype: string;
  9. size: number;
  10. userId: string | null;
  11. createdAt: Date;
  12. updatedAt: Date;
  13. }
  14. export async function getFiles(): Promise<FileData[]> {
  15. try {
  16. const files = await prisma.file.findMany({
  17. select: {
  18. id: true,
  19. filename: true,
  20. mimetype: true,
  21. size: true,
  22. userId: true,
  23. createdAt: true,
  24. updatedAt: true,
  25. },
  26. orderBy: {
  27. createdAt: 'desc',
  28. },
  29. });
  30. return files;
  31. } catch (error) {
  32. console.error("Error listing files:", error);
  33. throw new Error("Failed to list files");
  34. } finally {
  35. await prisma.$disconnect();
  36. }
  37. }
  38. export async function getFilesByUserId(userId: string): Promise<FileData[]> {
  39. try {
  40. const files = await prisma.file.findMany({
  41. where: {
  42. userId: userId,
  43. },
  44. select: {
  45. id: true,
  46. filename: true,
  47. mimetype: true,
  48. size: true,
  49. userId: true,
  50. createdAt: true,
  51. updatedAt: true,
  52. },
  53. orderBy: {
  54. createdAt: 'desc',
  55. },
  56. });
  57. return files;
  58. } catch (error) {
  59. console.error("Error listing files by user:", error);
  60. throw new Error("Failed to list files by user");
  61. } finally {
  62. await prisma.$disconnect();
  63. }
  64. }
  65. export async function downloadFile(id: string): Promise<{
  66. data: Uint8Array;
  67. filename: string;
  68. mimetype: string;
  69. size: number;
  70. } | null> {
  71. try {
  72. const file = await prisma.file.findUnique({
  73. where: { id },
  74. });
  75. if (!file) {
  76. return null;
  77. }
  78. return {
  79. data: file.data,
  80. filename: file.filename,
  81. mimetype: file.mimetype,
  82. size: file.size,
  83. };
  84. } catch (error) {
  85. console.error("Error retrieving file:", error);
  86. throw new Error("Failed to retrieve file");
  87. } finally {
  88. await prisma.$disconnect();
  89. }
  90. }
  91. export async function deleteFile(id: string): Promise<boolean> {
  92. try {
  93. const file = await prisma.file.findUnique({
  94. where: { id },
  95. });
  96. if (!file) {
  97. return false;
  98. }
  99. await prisma.file.delete({
  100. where: { id },
  101. });
  102. revalidatePath('/files');
  103. revalidatePath('/dashboard');
  104. return true;
  105. } catch (error) {
  106. console.error("Error deleting file:", error);
  107. throw new Error("Failed to delete file");
  108. } finally {
  109. await prisma.$disconnect();
  110. }
  111. }