diff --git a/.dockerignore b/.dockerignore
index 8568a5bc..1f9167d0 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,8 +1,8 @@
backend/dist/
backend/node_modules/
+backend/data
frontend/node_modules/
frontend/.next/
-frontend/dist/
**/.git/
diff --git a/README.md b/README.md
index e0f91863..f3d48d1d 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ The website is now listening available on `http://localhost:3000`, have fun with
### Upgrade to a new version
-Just updated the docker container by running `docker-compose pull && docker-compose up -d`
+Just update the docker container by running `docker compose pull && docker compose up -d`
> Note: If you installed Pingvin Share before it used Sqlite, you unfortunately have to set up the project from scratch again, sorry for that.
@@ -65,3 +65,7 @@ Contact me, create an issue or directly create a pull request.
5. Start the frontend with `npm run dev`
You're all set!
+
+### Testing
+
+At the moment we only have system tests for the backend. To run these tests, run `npm run test:system` in the backend folder.
diff --git a/backend/src/share/share.service.ts b/backend/src/share/share.service.ts
index e417fd93..602e82e0 100644
--- a/backend/src/share/share.service.ts
+++ b/backend/src/share/share.service.ts
@@ -99,12 +99,19 @@ export class ShareService {
async getSharesByUser(userId: string) {
return await this.prisma.share.findMany({
- where: { creator: { id: userId }, expiration: { gt: new Date() } },
+ where: {
+ creator: { id: userId },
+ expiration: { gt: new Date() },
+ uploadLocked: true,
+ },
+ orderBy: {
+ expiration: "desc",
+ },
});
}
async get(id: string) {
- const share : any = await this.prisma.share.findUnique({
+ const share: any = await this.prisma.share.findUnique({
where: { id },
include: {
files: true,
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 33b29589..96737ac9 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -26,7 +26,7 @@
"next-pwa": "^5.6.0",
"react": "18.0.0",
"react-dom": "18.0.0",
- "tabler-icons-react": "^1.44.0",
+ "react-icons": "^4.4.0",
"yup": "^0.32.11"
},
"devDependencies": {
@@ -6381,6 +6381,14 @@
"react": ">= 16.8 || 18.0.0"
}
},
+ "node_modules/react-icons": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz",
+ "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -6971,14 +6979,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/tabler-icons-react": {
- "version": "1.44.0",
- "resolved": "https://registry.npmjs.org/tabler-icons-react/-/tabler-icons-react-1.44.0.tgz",
- "integrity": "sha512-AYQQGl55yVe1KHZl+zyDAAwDOcPknKZNC7vgwmjyvpmz4P5Gjb7DtpsOPa1nB0qMYW5Orsrt+1e4qnRoCKgo6A==",
- "peerDependencies": {
- "react": ">= 16.8.0"
- }
- },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -12479,6 +12479,12 @@
"prop-types": "^15.8.1"
}
},
+ "react-icons": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz",
+ "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==",
+ "requires": {}
+ },
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -12910,12 +12916,6 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
- "tabler-icons-react": {
- "version": "1.44.0",
- "resolved": "https://registry.npmjs.org/tabler-icons-react/-/tabler-icons-react-1.44.0.tgz",
- "integrity": "sha512-AYQQGl55yVe1KHZl+zyDAAwDOcPknKZNC7vgwmjyvpmz4P5Gjb7DtpsOPa1nB0qMYW5Orsrt+1e4qnRoCKgo6A==",
- "requires": {}
- },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 1e4c45b9..75cf76c7 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -27,7 +27,7 @@
"next-pwa": "^5.6.0",
"react": "18.0.0",
"react-dom": "18.0.0",
- "tabler-icons-react": "^1.44.0",
+ "react-icons": "^4.4.0",
"yup": "^0.32.11"
},
"devDependencies": {
diff --git a/frontend/src/components/Logo.tsx b/frontend/src/components/Logo.tsx
new file mode 100644
index 00000000..7fea40e3
--- /dev/null
+++ b/frontend/src/components/Logo.tsx
@@ -0,0 +1,34 @@
+const Logo = ({ height, width }: { height: number; width: number }) => {
+ return (
+
+ );
+};
+export default Logo;
diff --git a/frontend/src/components/navBar/ActionAvatar.tsx b/frontend/src/components/navBar/ActionAvatar.tsx
index 121fc957..867029c9 100644
--- a/frontend/src/components/navBar/ActionAvatar.tsx
+++ b/frontend/src/components/navBar/ActionAvatar.tsx
@@ -1,6 +1,6 @@
import { ActionIcon, Avatar, Menu } from "@mantine/core";
import { NextLink } from "@mantine/next";
-import { DoorExit, Link } from "tabler-icons-react";
+import { TbDoorExit, TbLink } from "react-icons/tb";;
import authService from "../../services/auth.service";
const ActionAvatar = () => {
@@ -15,7 +15,7 @@ const ActionAvatar = () => {
}
+ icon={}
>
My shares
@@ -23,7 +23,7 @@ const ActionAvatar = () => {
onClick={async () => {
authService.signOut();
}}
- icon={}
+ icon={}
>
Sign out
diff --git a/frontend/src/components/navBar/NavBar.tsx b/frontend/src/components/navBar/NavBar.tsx
index a732e952..044f2a3d 100644
--- a/frontend/src/components/navBar/NavBar.tsx
+++ b/frontend/src/components/navBar/NavBar.tsx
@@ -5,7 +5,6 @@ import {
createStyles,
Group,
Header,
- Image,
Paper,
Stack,
Text,
@@ -16,6 +15,7 @@ import { NextLink } from "@mantine/next";
import getConfig from "next/config";
import { ReactNode, useEffect, useState } from "react";
import useUser from "../../hooks/user.hook";
+import Logo from "../Logo";
import ActionAvatar from "./ActionAvatar";
const { publicRuntimeConfig } = getConfig();
@@ -180,12 +180,7 @@ const NavBar = () => {
-
+
Pingvin Share
diff --git a/frontend/src/components/share/DownloadAllButton.tsx b/frontend/src/components/share/DownloadAllButton.tsx
index 44497976..1bb0a140 100644
--- a/frontend/src/components/share/DownloadAllButton.tsx
+++ b/frontend/src/components/share/DownloadAllButton.tsx
@@ -1,6 +1,7 @@
-import { Button, Tooltip } from "@mantine/core";
+import { Button } from "@mantine/core";
import { useEffect, useState } from "react";
import shareService from "../../services/share.service";
+import toast from "../../utils/toast.util";
const DownloadAllButton = ({ shareId }: { shareId: string }) => {
const [isZipReady, setIsZipReady] = useState(false);
@@ -32,21 +33,18 @@ const DownloadAllButton = ({ shareId }: { shareId: string }) => {
};
}, []);
- if (!isZipReady)
- return (
-
-
-
- );
return (
-