75 Commits

Author SHA1 Message Date
6b09987f75 Update dependency react-router-dom to ^7.6.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-06-20 00:18:58 +00:00
9f25e39cca Update Rust crate diesel to 2.2.11
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-19 00:19:09 +00:00
0c178daf55 Update Rust crate lettre to 0.11.17
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-18 00:20:26 +00:00
8dbc5c452e Update dependency react-qr-code to ^2.0.16
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-17 00:20:04 +00:00
e5ee0b4d77 Update Rust crate futures-util to 0.3.31
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-16 00:20:26 +00:00
bc3bfe08c6 Update Rust crate clap to 4.5.40
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-15 00:20:37 +00:00
f2d391a430 Update dependency react-easy-crop to ^5.4.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-14 00:20:51 +00:00
764a7d94e3 Update dependency @mui/x-date-pickers to ^7.29.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-13 00:20:53 +00:00
aea6a64896 Update dependency @mui/x-data-grid to ^7.29.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-12 00:21:10 +00:00
9c728f312b Update dependency @mui/lab to ^7.0.0-beta.13
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-11 00:20:57 +00:00
c7d4056dc3 Update dependency @fontsource/roboto to ^5.2.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-10 00:21:11 +00:00
555e72ef22 Update dependency @eslint/js to ^9.28.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-09 00:21:09 +00:00
f35926dfb6 Update dependency eslint to ^9.28.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-07 00:20:32 +00:00
067ac5181b Fix cargo clippy issues
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-06 06:03:38 +00:00
b83314f540 Update dependency @vitejs/plugin-react to ^4.4.1
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-05-15 00:14:57 +00:00
3203d12aac Update dependency @mui/x-tree-view to ^7.29.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-14 00:15:14 +00:00
fae4e144f4 Update Rust crate lettre to 0.11.16
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-13 00:15:54 +00:00
8179c7a6d6 Update Rust crate clap to 4.5.38
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-12 00:15:32 +00:00
a42b887a74 Update dependency @mui/x-date-pickers to ^7.29.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-11 00:14:59 +00:00
84ed2c6754 Update dependency @mui/x-data-grid to ^7.29.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-10 00:14:49 +00:00
126920b41f Update dependency @eslint/js to ^9.26.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-09 00:14:51 +00:00
24fa207005 Update Rust crate sha2 to 0.10.9
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-08 00:23:47 +00:00
40901c55db Update dependency @mui/lab to ^7.0.0-beta.12
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-07 00:23:14 +00:00
fd870317dd Update Rust crate rand to 0.9.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-06 00:23:48 +00:00
4f6d4abb43 Update Rust crate diesel to 2.2.10
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-05 00:23:51 +00:00
94da037d55 Update Rust crate clap to 4.5.37
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-04 00:23:47 +00:00
88e8c9bf05 Update Rust crate chrono to 0.4.41
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-03 00:23:49 +00:00
40bbfd9adf Update Rust crate anyhow to 1.0.98
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-02 00:18:54 +00:00
c803ccb212 Update materialui to ^7.0.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-01 00:18:52 +00:00
db98ff4ed2 Update fullcalendar to ^6.1.17
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-30 00:18:51 +00:00
44c54112b6 Update dependency typescript to ^5.8.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-29 00:18:20 +00:00
cdcb86913f Update dependency react-qr-code to ^2.0.15
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-28 00:18:14 +00:00
fcfe457514 Update dependency eslint-plugin-react-refresh to ^0.4.20
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-27 00:18:08 +00:00
55745f5845 Update dependency eslint-plugin-react-hooks to ^5.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-26 00:18:21 +00:00
2ee8bc337f Update dependency eslint to ^9.25.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-25 00:18:28 +00:00
e441480bf7 Update dependency @mui/lab to ^7.0.0-beta.11
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-24 00:18:50 +00:00
c84817d190 Update dependency @mdi/js to ^7.4.47
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-23 00:18:05 +00:00
f615291950 Update dependency @eslint/js to ^9.25.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-22 00:25:59 +00:00
b95aa90836 Update dependency @emotion/styled to ^11.14.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-21 00:26:36 +00:00
22d2bbfc41 Update dependency @emotion/react to ^11.14.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-20 00:25:55 +00:00
069ca185cc Remove temporary fix
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-19 10:43:04 +02:00
9b8f2bd3cf Remove temporary fix
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-19 10:42:39 +02:00
6c9a0db8d5 Update mui-color-input to v7.0.0
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-19 10:38:16 +02:00
877b0c56b3 Update Rust crate redis to 0.29.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-08 00:26:32 +00:00
25cae9b006 Perform more proper sign out operation
All checks were successful
continuous-integration/drone/push Build is passing
2025-04-07 22:00:37 +02:00
fdd11e7eae Update Rust crate env_logger to 0.11.8
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-06 00:32:41 +00:00
9bb93b72cc Update Rust crate diesel to 2.2.9
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-05 00:32:38 +00:00
f82a788bb0 Update Rust crate clap to 4.5.35
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-04 00:33:17 +00:00
2e52958e64 Update Rust crate serde_with to 3.12.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-03 00:32:55 +00:00
18cf96d22c Update Rust crate rust_iso3166 to 0.1.14
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-02 00:32:58 +00:00
fc63a2935f Update Rust crate lazy-regex to 3.4.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-01 02:03:32 +00:00
c48807bf4b Update Rust crate diesel_migrations to 2.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-31 20:49:05 +00:00
c896b2cc51 Update Rust crate clap to 4.5.34
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-31 00:33:10 +00:00
5a0e720952 Update Rust crate anyhow to 1.0.97
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-30 02:19:14 +00:00
8e2cd9824d Update Rust crate actix-multipart to 0.7.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 22:55:15 +00:00
aabec5f0b8 Update Rust crate actix-cors to 0.7.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 18:13:56 +00:00
a763568f6e Update renovate.json
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-29 17:30:24 +00:00
8cbf1c5d5d Merge pull request 'Update dependency globals to v16' (#445) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #445
2025-03-29 15:55:30 +00:00
79c3d669e4 Merge pull request 'Update node Docker tag to v23' (#446) from renovate/node-23.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #446
2025-03-29 15:55:06 +00:00
b68c6f9ee5 Update node Docker tag to v23
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-29 14:12:26 +00:00
7bf50a8971 Update dependency globals to v16
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-29 14:12:24 +00:00
769baa49f1 Update renovate.json
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-29 12:57:49 +00:00
1a706ee6a3 Upgrade vite & ts configuration
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 15:39:39 +01:00
0e79202c77 Fix issue with login page
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 15:34:49 +01:00
4f75833414 Updated frontend dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 15:31:28 +01:00
ca6b5d398b Update Rust to edition 2024
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 15:09:21 +01:00
c6e53d5790 Update backend dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 15:06:16 +01:00
646bf2c0aa Merge pull request 'Update Rust crate anyhow to v1.0.97' (#443) from renovate/anyhow-1.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #443
2025-03-28 13:55:03 +00:00
ff95904360 Update Rust crate anyhow to v1.0.97
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-03-19 00:31:54 +00:00
46eb2c9534 Merge pull request 'Update Rust crate actix-cors to v0.7.1' (#442) from renovate/actix-cors-0.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #442
2025-03-18 21:00:19 +00:00
74efe64282 Update Rust crate actix-cors to v0.7.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-12 00:18:46 +00:00
2fbbe5a7b4 Merge pull request 'Update Rust crate serde_with to v3.12.0' (#359) from renovate/serde_with-3.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #359
2025-03-11 13:16:13 +00:00
7429105374 Merge pull request 'Update Rust crate tempfile to v3.16.0' (#441) from renovate/tempfile-3.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #441
2025-02-04 07:05:02 +00:00
dc9bde7ca0 Update Rust crate tempfile to v3.16.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-01-30 00:23:32 +00:00
8b567f9b22 Update dependency @mui/x-tree-view to v7.24.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-25 00:23:23 +00:00
45 changed files with 2942 additions and 2173 deletions

View File

@ -14,7 +14,7 @@ steps:
- cargo test - cargo test
- name: app_deploy - name: app_deploy
image: node:22 image: node:23
environment: environment:
AWS_ACCESS_KEY_ID: AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID from_secret: AWS_ACCESS_KEY_ID
@ -24,7 +24,7 @@ steps:
commands: commands:
# Build website # Build website
- cd geneit_app - cd geneit_app
- npm install - npm install
- GENERATE_SOURCEMAP=false npm run build - GENERATE_SOURCEMAP=false npm run build
# Install AWS # Install AWS
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

View File

@ -0,0 +1,28 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)

File diff suppressed because it is too large Load Diff

View File

@ -3,70 +3,54 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": { "dependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@emotion/react": "^11.14.0",
"@emotion/react": "^11.13.3", "@emotion/styled": "^11.14.0",
"@emotion/styled": "^11.13.0", "@fontsource/roboto": "^5.2.6",
"@fontsource/roboto": "^5.1.0", "@fullcalendar/core": "^6.1.17",
"@fullcalendar/core": "^6.1.15", "@fullcalendar/daygrid": "^6.1.17",
"@fullcalendar/daygrid": "^6.1.15", "@fullcalendar/interaction": "^6.1.17",
"@fullcalendar/interaction": "^6.1.15", "@fullcalendar/list": "^6.1.17",
"@fullcalendar/list": "^6.1.15", "@fullcalendar/react": "^6.1.17",
"@fullcalendar/react": "^6.1.15", "@mdi/js": "^7.4.47",
"@mdi/js": "^7.2.96",
"@mdi/react": "^1.6.1", "@mdi/react": "^1.6.1",
"@mui/icons-material": "^6.1.2", "@mui/icons-material": "^7.0.2",
"@mui/lab": "^6.0.0-beta.10", "@mui/lab": "^7.0.0-beta.13",
"@mui/material": "^6.1.2", "@mui/material": "^7.0.2",
"@mui/x-data-grid": "^7.18.0", "@mui/x-data-grid": "^7.29.6",
"@mui/x-date-pickers": "^7.18.0", "@mui/x-date-pickers": "^7.29.4",
"@mui/x-tree-view": "^7.18.0", "@mui/x-tree-view": "^7.29.1",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.0.0",
"@types/jest": "^29.5.13",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.3.2",
"date-and-time": "^3.6.0", "date-and-time": "^3.6.0",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"email-validator": "^2.0.4", "email-validator": "^2.0.4",
"filesize": "^10.1.6", "filesize": "^10.1.6",
"jspdf": "^2.5.2", "jspdf": "^3.0.1",
"mui-color-input": "^5.0.0", "mui-color-input": "^7.0.0",
"react": "^18.3.1", "react": "^19.0.0",
"react-dom": "^18.3.1", "react-dom": "^19.0.0",
"react-easy-crop": "^5.0.8", "react-easy-crop": "^5.4.2",
"react-qr-code": "^2.0.14", "react-qr-code": "^2.0.16",
"react-router-dom": "^7.0.0", "react-router-dom": "^7.6.2",
"react-zoom-pan-pinch": "^3.4.4", "react-zoom-pan-pinch": "^3.7.0",
"svg2pdf.js": "^2.2.3", "svg2pdf.js": "^2.5.0"
"typescript": "^5.6.2",
"vite": "^6.0.0",
"vite-tsconfig-paths": "^5.0.1",
"web-vitals": "^3.5.2"
}, },
"scripts": { "devDependencies": {
"start": "vite", "@eslint/js": "^9.28.0",
"build": "tsc && vite build", "@types/react": "^19.0.12",
"preview": "vite preview" "@types/react-dom": "^19.0.4",
}, "@vitejs/plugin-react": "^4.4.1",
"eslintConfig": { "eslint": "^9.28.0",
"extends": [ "eslint-plugin-react-hooks": "^5.2.0",
"react-app", "eslint-plugin-react-refresh": "^0.4.20",
"react-app/jest" "globals": "^16.0.0",
] "typescript": "^5.8.3",
}, "typescript-eslint": "^8.24.1",
"browserslist": { "vite": "^6.2.3"
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
} }
} }

View File

@ -59,7 +59,10 @@ export function App(): React.ReactElement {
const context: AuthContext = { const context: AuthContext = {
signedIn: signedIn, signedIn: signedIn,
setSignedIn: (s) => setSignedIn(s), setSignedIn: (s) => {
location.reload();
setSignedIn(s);
},
}; };
const router = createBrowserRouter( const router = createBrowserRouter(

View File

@ -3,7 +3,6 @@ import ReactDOM from "react-dom/client";
import { App } from "./App"; import { App } from "./App";
import { ServerApi } from "./api/ServerApi"; import { ServerApi } from "./api/ServerApi";
import "./index.css"; import "./index.css";
import reportWebVitals from "./reportWebVitals";
// Roboto font // Roboto font
import "@fontsource/roboto/300.css"; import "@fontsource/roboto/300.css";
@ -61,8 +60,3 @@ async function init() {
} }
init(); init();
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

View File

@ -1,15 +0,0 @@
import { ReportHandler } from 'web-vitals';
const reportWebVitals = (onPerfEntry?: ReportHandler) => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;

View File

@ -1,4 +1,5 @@
import { Visibility, VisibilityOff } from "@mui/icons-material"; import VisibilityIcon from "@mui/icons-material/Visibility";
import VisibilityOffIcon from "@mui/icons-material/VisibilityOff";
import { import {
Alert, Alert,
CircularProgress, CircularProgress,
@ -11,7 +12,7 @@ import {
} from "@mui/material"; } from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import Grid from "@mui/material/Grid2"; import Grid from "@mui/material/Grid";
import TextField from "@mui/material/TextField"; import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import * as React from "react"; import * as React from "react";
@ -148,7 +149,7 @@ export function LoginRoute(): React.ReactElement {
onMouseDown={handleMouseDownPassword} onMouseDown={handleMouseDownPassword}
edge="end" edge="end"
> >
{showPassword ? <VisibilityOff /> : <Visibility />} {showPassword ? <VisibilityOffIcon /> : <VisibilityIcon />}
</IconButton> </IconButton>
</Tooltip> </Tooltip>
</InputAdornment> </InputAdornment>

View File

@ -4,7 +4,7 @@ import EditIcon from "@mui/icons-material/Edit";
import FileDownloadIcon from "@mui/icons-material/FileDownload"; import FileDownloadIcon from "@mui/icons-material/FileDownload";
import SaveIcon from "@mui/icons-material/Save"; import SaveIcon from "@mui/icons-material/Save";
import { Button, Stack } from "@mui/material"; import { Button, Stack } from "@mui/material";
import Grid from "@mui/material/Grid2"; import Grid from "@mui/material/Grid";
import React from "react"; import React from "react";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
import { ServerApi } from "../../../api/ServerApi"; import { ServerApi } from "../../../api/ServerApi";

View File

@ -1,4 +1,3 @@
import { useFamily } from "../../../widgets/BaseFamilyRoute";
import { FamilyPageTitle } from "../../../widgets/FamilyPageTitle"; import { FamilyPageTitle } from "../../../widgets/FamilyPageTitle";
export function FamilyHomeRoute(): React.ReactElement { export function FamilyHomeRoute(): React.ReactElement {

View File

@ -12,7 +12,7 @@ import {
ListItemText, ListItemText,
Stack, Stack,
} from "@mui/material"; } from "@mui/material";
import Grid from "@mui/material/Grid2"; import Grid from "@mui/material/Grid";
import * as EmailValidator from "email-validator"; import * as EmailValidator from "email-validator";
import React from "react"; import React from "react";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";

View File

@ -1,5 +0,0 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

View File

@ -43,9 +43,13 @@ export function BaseAuthenticatedPage(): React.ReactElement {
setAnchorEl(null); setAnchorEl(null);
}; };
const signOut = () => { const signOut = async () => {
handleCloseMenu(); handleCloseMenu();
AuthApi.SignOut(); try {
await AuthApi.SignOut();
} catch (e) {
console.error(e);
}
navigate("/"); navigate("/");
auth.setSignedIn(false); auth.setSignedIn(false);
}; };

View File

@ -54,7 +54,7 @@ export function BaseFamilyRoute(): React.ReactElement {
const loadKey = React.useRef(1); const loadKey = React.useRef(1);
const loadPromise = React.useRef<() => void>(); const loadPromise = React.useRef<() => void>(null);
const load = async () => { const load = async () => {
const familyID = Number(familyId); const familyID = Number(familyId);
@ -104,7 +104,7 @@ export function BaseFamilyRoute(): React.ReactElement {
build={() => { build={() => {
if (loadPromise.current != null) { if (loadPromise.current != null) {
loadPromise.current?.(); loadPromise.current?.();
loadPromise.current = undefined; loadPromise.current = null;
} }
return ( return (

View File

@ -3,10 +3,9 @@ import Icon from "@mdi/react";
import Avatar from "@mui/material/Avatar"; import Avatar from "@mui/material/Avatar";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import CssBaseline from "@mui/material/CssBaseline"; import CssBaseline from "@mui/material/CssBaseline";
import Grid from "@mui/material/Grid2"; import Grid from "@mui/material/Grid";
import Paper from "@mui/material/Paper"; import Paper from "@mui/material/Paper";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import * as React from "react";
import { Link, Outlet } from "react-router-dom"; import { Link, Outlet } from "react-router-dom";
import { DarkThemeButton } from "./DarkThemeButton"; import { DarkThemeButton } from "./DarkThemeButton";

View File

@ -1,4 +1,5 @@
import { Visibility, VisibilityOff } from "@mui/icons-material"; import VisibilityIcon from "@mui/icons-material/Visibility";
import VisibilityOffIcon from "@mui/icons-material/VisibilityOff";
import { import {
FormControl, FormControl,
FormHelperText, FormHelperText,
@ -50,7 +51,7 @@ export function PasswordInput(p: {
onMouseDown={handleMouseDownPassword} onMouseDown={handleMouseDownPassword}
edge="end" edge="end"
> >
{showPassword ? <VisibilityOff /> : <Visibility />} {showPassword ? <VisibilityOffIcon /> : <VisibilityIcon />}
</IconButton> </IconButton>
</InputAdornment> </InputAdornment>
} }

View File

@ -27,7 +27,7 @@ export function BaseAccommodationsRoute(): React.ReactElement {
const loadKey = React.useRef(1); const loadKey = React.useRef(1);
const loadPromise = React.useRef<() => void>(); const loadPromise = React.useRef<() => void>(null);
const load = async () => { const load = async () => {
setAccommodations( setAccommodations(
@ -53,7 +53,7 @@ export function BaseAccommodationsRoute(): React.ReactElement {
build={() => { build={() => {
if (loadPromise.current != null) { if (loadPromise.current != null) {
loadPromise.current?.(); loadPromise.current?.();
loadPromise.current = undefined; loadPromise.current = null;
} }
return ( return (

View File

@ -22,7 +22,7 @@ export function BaseGenealogyRoute(): React.ReactElement {
const loadKey = React.useRef(1); const loadKey = React.useRef(1);
const loadPromise = React.useRef<() => void>(); const loadPromise = React.useRef<() => void>(null);
const load = async () => { const load = async () => {
setMembers(await MemberApi.GetEntireList(family.familyId)); setMembers(await MemberApi.GetEntireList(family.familyId));
@ -48,7 +48,7 @@ export function BaseGenealogyRoute(): React.ReactElement {
build={() => { build={() => {
if (loadPromise.current != null) { if (loadPromise.current != null) {
loadPromise.current?.(); loadPromise.current?.();
loadPromise.current = undefined; loadPromise.current = null;
} }
return ( return (

View File

@ -0,0 +1,26 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"]
}

View File

@ -1,21 +1,7 @@
{ {
"compilerOptions": { "files": [],
"target": "ESNext", "references": [
"lib": ["dom", "dom.iterable", "esnext"], { "path": "./tsconfig.app.json" },
"types": ["vite/client"], { "path": "./tsconfig.node.json" }
"allowJs": true, ]
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["src"]
} }

View File

@ -0,0 +1,24 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

View File

@ -1,15 +1,7 @@
import { defineConfig } from "vite"; import { defineConfig } from 'vite'
import react from "@vitejs/plugin-react"; import react from '@vitejs/plugin-react'
import viteTsconfigPaths from "vite-tsconfig-paths";
// https://vite.dev/config/
export default defineConfig({ export default defineConfig({
// depending on your application, base can also be "/" plugins: [react()],
base: "/", })
plugins: [react(), viteTsconfigPaths()],
server: {
// this ensures that the browser opens upon server start
open: true,
// this sets a default port to 3000
port: 3000,
},
});

1362
geneit_backend/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +1,43 @@
[package] [package]
name = "geneit_backend" name = "geneit_backend"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
log = "0.4.21" log = "0.4.27"
env_logger = "0.11.5" env_logger = "0.11.8"
clap = { version = "4.5.17", features = ["derive", "env"] } clap = { version = "4.5.40", features = ["derive", "env"] }
lazy_static = "1.5.0" lazy_static = "1.5.0"
lazy-regex = "3.3.0" lazy-regex = "3.4.1"
anyhow = "1.0.87" anyhow = "1.0.98"
actix-web = "4.9.0" actix-web = "4.10.2"
actix-cors = "0.7.0" actix-cors = "0.7.1"
actix-multipart = "0.7.0" actix-multipart = "0.7.2"
actix-remote-ip = "0.1.0" actix-remote-ip = "0.1.0"
futures-util = "0.3.30" futures-util = "0.3.31"
diesel = { version = "2.2.4", features = ["postgres"] } diesel = { version = "2.2.11", features = ["postgres"] }
diesel_migrations = "2.1.0" diesel_migrations = "2.2.0"
serde = { version = "1.0.210", features = ["derive"] } serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.128" serde_json = "1.0.140"
mailchecker = "6.0.8" mailchecker = "6.0.17"
redis = "0.27.0" redis = "0.29.5"
lettre = "0.11.8" lettre = "0.11.17"
rand = "0.8.5" rand = "0.9.1"
bcrypt = "0.16.0" bcrypt = "0.17.0"
light-openid = "1.0.2" light-openid = "1.0.4"
thiserror = "1.0.60" thiserror = "2.0.12"
serde_with = "3.8.1" serde_with = "3.12.0"
rust_iso3166 = "0.1.12" rust_iso3166 = "0.1.14"
rust-s3 = "0.35.1" rust-s3 = "0.35.1"
sha2 = "0.10.8" sha2 = "0.10.9"
image = "0.25.1" image = "0.25.6"
uuid = { version = "1.8.0", features = ["v4"] } uuid = { version = "1.16.0", features = ["v4"] }
httpdate = "1.0.3" httpdate = "1.0.3"
zip = "2.2.0" zip = "2.5.0"
mime_guess = "2.0.4" mime_guess = "2.0.5"
tempfile = "3.12.0" tempfile = "3.19.1"
base64 = "0.22.0" base64 = "0.22.1"
ical = { version = "0.11.0", features = ["generator", "ical", "vcard"] } ical = { version = "0.11.0", features = ["generator", "ical", "vcard"] }
chrono = "0.4.38" chrono = "0.4.41"

View File

@ -3,7 +3,7 @@
use crate::app_config::AppConfig; use crate::app_config::AppConfig;
use diesel::result::{DatabaseErrorKind, Error}; use diesel::result::{DatabaseErrorKind, Error};
use diesel::{Connection, PgConnection}; use diesel::{Connection, PgConnection};
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations};
use std::cell::RefCell; use std::cell::RefCell;
const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); const MIGRATIONS: EmbeddedMigrations = embed_migrations!();

View File

@ -4,7 +4,7 @@ use crate::extractors::accommodation_extractor::FamilyAndAccommodationInPath;
use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership}; use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership};
use crate::models::Accommodation; use crate::models::Accommodation;
use crate::services::accommodations_list_service; use crate::services::accommodations_list_service;
use actix_web::{web, HttpResponse}; use actix_web::{HttpResponse, web};
#[derive(thiserror::Error, Debug)] #[derive(thiserror::Error, Debug)]
enum AccommodationListControllerErr { enum AccommodationListControllerErr {

View File

@ -1,6 +1,6 @@
use ical::{generator::*, *}; use ical::{generator::*, *};
use actix_web::{web, HttpResponse}; use actix_web::{HttpResponse, web};
use chrono::DateTime; use chrono::DateTime;
use crate::constants::StaticConstraints; use crate::constants::StaticConstraints;

View File

@ -5,7 +5,7 @@ use crate::extractors::family_extractor::FamilyInPath;
use crate::models::{Accommodation, AccommodationReservationID, NewAccommodationReservation}; use crate::models::{Accommodation, AccommodationReservationID, NewAccommodationReservation};
use crate::services::accommodations_reservations_service; use crate::services::accommodations_reservations_service;
use crate::utils::time_utils::time; use crate::utils::time_utils::time;
use actix_web::{web, HttpResponse}; use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)] #[derive(serde::Deserialize)]
pub struct UpdateReservationQuery { pub struct UpdateReservationQuery {

View File

@ -5,7 +5,7 @@ use crate::services::login_token_service::LoginTokenValue;
use crate::services::rate_limiter_service::RatedAction; use crate::services::rate_limiter_service::RatedAction;
use crate::services::{login_token_service, openid_service, rate_limiter_service, users_service}; use crate::services::{login_token_service, openid_service, rate_limiter_service, users_service};
use actix_remote_ip::RemoteIP; use actix_remote_ip::RemoteIP;
use actix_web::{web, HttpResponse}; use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)] #[derive(serde::Deserialize)]
pub struct CreateAccountBody { pub struct CreateAccountBody {

View File

@ -1,12 +1,12 @@
use crate::controllers::members_controller::RequestDate;
use crate::controllers::HttpResult; use crate::controllers::HttpResult;
use crate::controllers::members_controller::RequestDate;
use crate::extractors::couple_extractor::FamilyAndCoupleInPath; use crate::extractors::couple_extractor::FamilyAndCoupleInPath;
use crate::extractors::family_extractor::FamilyInPath; use crate::extractors::family_extractor::FamilyInPath;
use crate::models::{Couple, CoupleState, MemberID, PhotoID}; use crate::models::{Couple, CoupleState, MemberID, PhotoID};
use crate::services::{couples_service, members_service, photos_service}; use crate::services::{couples_service, members_service, photos_service};
use actix_multipart::form::tempfile::TempFile;
use actix_multipart::form::MultipartForm; use actix_multipart::form::MultipartForm;
use actix_web::{web, HttpResponse}; use actix_multipart::form::tempfile::TempFile;
use actix_web::{HttpResponse, web};
serde_with::with_prefix!(prefix_wedding "wedding_"); serde_with::with_prefix!(prefix_wedding "wedding_");
serde_with::with_prefix!(prefix_divorce "divorce_"); serde_with::with_prefix!(prefix_divorce "divorce_");

View File

@ -1,14 +1,14 @@
use crate::connections::s3_connection; use crate::connections::s3_connection;
use crate::constants; use crate::constants;
use crate::controllers::HttpResult;
use crate::controllers::couples_controller::CoupleRequest; use crate::controllers::couples_controller::CoupleRequest;
use crate::controllers::members_controller::MemberRequest; use crate::controllers::members_controller::MemberRequest;
use crate::controllers::HttpResult;
use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership}; use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership};
use crate::models::{CoupleID, MemberID, PhotoID}; use crate::models::{CoupleID, MemberID, PhotoID};
use crate::services::photos_service::UploadedFile; use crate::services::photos_service::UploadedFile;
use crate::services::{couples_service, members_service, photos_service}; use crate::services::{couples_service, members_service, photos_service};
use actix_multipart::form::tempfile::TempFile;
use actix_multipart::form::MultipartForm; use actix_multipart::form::MultipartForm;
use actix_multipart::form::tempfile::TempFile;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use mime_guess::Mime; use mime_guess::Mime;
use std::collections::HashMap; use std::collections::HashMap;

View File

@ -1,4 +1,4 @@
use crate::constants::{StaticConstraints, FAMILY_INVITATION_CODE_LEN}; use crate::constants::{FAMILY_INVITATION_CODE_LEN, StaticConstraints};
use crate::controllers::HttpResult; use crate::controllers::HttpResult;
use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership}; use crate::extractors::family_extractor::{FamilyInPath, FamilyInPathWithAdminMembership};
use crate::models::{FamilyMembership, UserID}; use crate::models::{FamilyMembership, UserID};
@ -7,7 +7,7 @@ use crate::services::rate_limiter_service::RatedAction;
use crate::services::{families_service, rate_limiter_service}; use crate::services::{families_service, rate_limiter_service};
use crate::utils::string_utils::rand_str; use crate::utils::string_utils::rand_str;
use actix_remote_ip::RemoteIP; use actix_remote_ip::RemoteIP;
use actix_web::{web, HttpResponse}; use actix_web::{HttpResponse, web};
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize)]
pub struct CreateFamilyReq { pub struct CreateFamilyReq {

View File

@ -5,9 +5,9 @@ use crate::extractors::member_extractor::FamilyAndMemberInPath;
use crate::models::{Member, MemberID, PhotoID, Sex}; use crate::models::{Member, MemberID, PhotoID, Sex};
use crate::services::{members_service, photos_service}; use crate::services::{members_service, photos_service};
use crate::utils::countries_utils; use crate::utils::countries_utils;
use actix_multipart::form::tempfile::TempFile;
use actix_multipart::form::MultipartForm; use actix_multipart::form::MultipartForm;
use actix_web::{web, HttpResponse}; use actix_multipart::form::tempfile::TempFile;
use actix_web::{HttpResponse, web};
serde_with::with_prefix!(prefix_birth "birth_"); serde_with::with_prefix!(prefix_birth "birth_");
serde_with::with_prefix!(prefix_death "death_"); serde_with::with_prefix!(prefix_death "death_");

View File

@ -1,7 +1,7 @@
//! # API controller //! # API controller
use actix_web::body::BoxBody;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use actix_web::body::BoxBody;
use std::fmt::{Debug, Display, Formatter}; use std::fmt::{Debug, Display, Formatter};
use zip::result::ZipError; use zip::result::ZipError;

View File

@ -3,7 +3,7 @@ use crate::controllers::HttpResult;
use crate::models::PhotoID; use crate::models::PhotoID;
use crate::services::photos_service; use crate::services::photos_service;
use actix_web::http::header; use actix_web::http::header;
use actix_web::{web, HttpRequest, HttpResponse}; use actix_web::{HttpRequest, HttpResponse, web};
use std::ops::Add; use std::ops::Add;
use std::time::{Duration, UNIX_EPOCH}; use std::time::{Duration, UNIX_EPOCH};

View File

@ -9,8 +9,8 @@ use crate::services::login_token_service::LoginToken;
use crate::services::rate_limiter_service::RatedAction; use crate::services::rate_limiter_service::RatedAction;
use crate::services::{rate_limiter_service, users_service}; use crate::services::{rate_limiter_service, users_service};
use actix_remote_ip::RemoteIP; use actix_remote_ip::RemoteIP;
use actix_web::web::Json;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use actix_web::web::Json;
#[derive(serde::Serialize)] #[derive(serde::Serialize)]
struct UserAPI<'a> { struct UserAPI<'a> {

View File

@ -2,7 +2,7 @@ use actix_cors::Cors;
use actix_multipart::form::tempfile::TempFileConfig; use actix_multipart::form::tempfile::TempFileConfig;
use actix_remote_ip::RemoteIPConfig; use actix_remote_ip::RemoteIPConfig;
use actix_web::middleware::Logger; use actix_web::middleware::Logger;
use actix_web::{web, App, HttpServer}; use actix_web::{App, HttpServer, web};
use geneit_backend::app_config::AppConfig; use geneit_backend::app_config::AppConfig;
use geneit_backend::connections::{db_connection, s3_connection}; use geneit_backend::connections::{db_connection, s3_connection};
use geneit_backend::controllers::{ use geneit_backend::controllers::{

View File

@ -9,7 +9,7 @@ use crate::utils::string_utils::rand_str;
use crate::utils::time_utils::time; use crate::utils::time_utils::time;
use actix_web::dev::Payload; use actix_web::dev::Payload;
use actix_web::{FromRequest, HttpRequest}; use actix_web::{FromRequest, HttpRequest};
use std::future::{ready, Ready}; use std::future::{Ready, ready};
#[derive(thiserror::Error, Debug)] #[derive(thiserror::Error, Debug)]
enum LoginTokenServiceError { enum LoginTokenServiceError {

View File

@ -3,8 +3,8 @@ use crate::models::{FamilyID, Member, MemberID, NewMember};
use crate::schema::members; use crate::schema::members;
use crate::services::{couples_service, photos_service}; use crate::services::{couples_service, photos_service};
use crate::utils::time_utils::time; use crate::utils::time_utils::time;
use diesel::prelude::*;
use diesel::RunQueryDsl; use diesel::RunQueryDsl;
use diesel::prelude::*;
/// Create a new family member /// Create a new family member
pub async fn create(family_id: FamilyID) -> anyhow::Result<Member> { pub async fn create(family_id: FamilyID) -> anyhow::Result<Member> {
@ -188,7 +188,10 @@ pub mod loop_detection {
let member = match members.get(&curr_stack.curr) { let member = match members.get(&curr_stack.curr) {
Some(m) => m, Some(m) => m,
None => { None => {
log::warn!("Member {:?} not found in the tree for loop detection, this should never happen!", curr_stack.curr); log::warn!(
"Member {:?} not found in the tree for loop detection, this should never happen!",
curr_stack.curr
);
return false; return false;
} }
}; };

View File

@ -6,8 +6,8 @@ use crate::utils::crypt_utils::sha512;
use crate::utils::time_utils::time; use crate::utils::time_utils::time;
use actix_multipart::form::tempfile::TempFile; use actix_multipart::form::tempfile::TempFile;
use diesel::prelude::*; use diesel::prelude::*;
use image::imageops::FilterType;
use image::ImageFormat; use image::ImageFormat;
use image::imageops::FilterType;
use mime_guess::Mime; use mime_guess::Mime;
use std::fs::File; use std::fs::File;
use std::io::{Cursor, Read, Seek, Write}; use std::io::{Cursor, Read, Seek, Write};

View File

@ -10,7 +10,6 @@ use crate::utils::string_utils::rand_str;
use crate::utils::time_utils::time; use crate::utils::time_utils::time;
use bcrypt::DEFAULT_COST; use bcrypt::DEFAULT_COST;
use diesel::prelude::*; use diesel::prelude::*;
use std::io::ErrorKind;
/// Get the information of a user, by its id /// Get the information of a user, by its id
pub async fn get_by_id(id: UserID) -> anyhow::Result<User> { pub async fn get_by_id(id: UserID) -> anyhow::Result<User> {
@ -25,8 +24,7 @@ pub async fn get_by_mail(mail: &str) -> anyhow::Result<User> {
/// Get the information of a user, by its password reset token /// Get the information of a user, by its password reset token
pub async fn get_by_pwd_reset_token(token: &str) -> anyhow::Result<User> { pub async fn get_by_pwd_reset_token(token: &str) -> anyhow::Result<User> {
if token.is_empty() { if token.is_empty() {
return Err(anyhow::Error::from(std::io::Error::new( return Err(anyhow::Error::from(std::io::Error::other(
ErrorKind::Other,
"Token is empty!", "Token is empty!",
))); )));
} }
@ -46,8 +44,7 @@ pub async fn get_by_pwd_reset_token(token: &str) -> anyhow::Result<User> {
/// Get the information of a user, by its account deletion token /// Get the information of a user, by its account deletion token
pub async fn get_by_account_delete_token(token: &str) -> anyhow::Result<User> { pub async fn get_by_account_delete_token(token: &str) -> anyhow::Result<User> {
if token.is_empty() { if token.is_empty() {
return Err(anyhow::Error::from(std::io::Error::new( return Err(anyhow::Error::from(std::io::Error::other(
ErrorKind::Other,
"Token is empty!", "Token is empty!",
))); )));
} }

View File

@ -1,4 +1,4 @@
use base64::{engine::general_purpose, Engine as _}; use base64::{Engine as _, engine::general_purpose};
/// Encode a base64 string /// Encode a base64 string
pub fn base64_enc<T: AsRef<[u8]>>(b: T) -> String { pub fn base64_enc<T: AsRef<[u8]>>(b: T) -> String {

View File

@ -1,11 +1,6 @@
use rand::distributions::Alphanumeric; use rand::distr::{Alphanumeric, SampleString};
use rand::Rng;
/// Generate a random string of a given size /// Generate a random string of a given length
pub fn rand_str(len: usize) -> String { pub fn rand_str(len: usize) -> String {
rand::thread_rng() Alphanumeric.sample_string(&mut rand::rng(), len)
.sample_iter(&Alphanumeric)
.map(char::from)
.take(len)
.collect()
} }

View File

@ -1,9 +1,3 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["local>renovate/presets"]
"packageRules": [ }
{
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
]
}