1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-07-24 15:49:42 +02:00

feat(frontend): Fix scheduler, forgot password flow, and minor bug fixes (#725)

* feat(frontend): 💄 add recipe title

* fix(frontend): 🐛 fixes #722 side-bar issue

* feat(frontend):  Add page titles to all pages

* minor cleanup

* refactor(backend): ♻️ rewrite scheduler to be more modulare and work

* feat(frontend):  start password reset functionality

* refactor(backend): ♻️ refactor application settings to facilitate dependency injection

* refactor(backend): 🔥 remove RECIPE_SETTINGS env variables in favor of group settings

* formatting

* refactor(backend): ♻️ align naming convention

* feat(backend):  password reset

* test(backend):  password reset

* feat(frontend):  self-service password reset

* purge password schedule

* update user creation for tests

Co-authored-by: Hayden <hay-kot@pm.me>
This commit is contained in:
Hayden 2021-10-07 09:39:47 -08:00 committed by GitHub
parent d1f0441252
commit 2e9026f9ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
121 changed files with 1461 additions and 679 deletions

View file

@ -2,20 +2,17 @@ import { BaseAPI } from "./_base";
const routes = {
base: "/api/admin/email",
forgotPassword: "/api/users/forgot-password",
invitation: "/api/groups/invitations/email",
};
export interface CheckEmailResponse {
ready: boolean;
}
export interface TestEmailResponse {
export interface EmailResponse {
success: boolean;
error: string;
}
export interface TestEmailPayload {
export interface EmailPayload {
email: string;
}
@ -24,21 +21,16 @@ export interface InvitationEmail {
token: string;
}
export interface InvitationEmailResponse {
success: boolean;
error: string;
}
export class EmailAPI extends BaseAPI {
check() {
return this.requests.get<CheckEmailResponse>(routes.base);
}
test(payload: TestEmailPayload) {
return this.requests.post<TestEmailResponse>(routes.base, payload);
test(payload: EmailPayload) {
return this.requests.post<EmailResponse>(routes.base, payload);
}
sendInvitation(payload: InvitationEmail) {
return this.requests.post<InvitationEmailResponse>(routes.invitation, payload);
return this.requests.post<EmailResponse>(routes.invitation, payload);
}
sendForgotPassword(payload: EmailPayload) {
return this.requests.post<EmailResponse>(routes.forgotPassword, payload);
}
}

View file

@ -16,12 +16,20 @@ interface ResponseToken {
token: string;
}
interface PasswordResetPayload {
token: string;
email: string;
password: string;
passwordConfirm: string;
}
// Code
const prefix = "/api";
const routes = {
usersSelf: `${prefix}/users/self`,
passwordReset: `${prefix}/users/reset-password`,
users: `${prefix}/users`,
usersIdImage: (id: string) => `${prefix}/users/${id}/image`,
@ -55,10 +63,6 @@ export class UserApi extends BaseCRUDAPI<UserOut, UserIn> {
return await this.requests.put(routes.usersIdPassword(id), changePassword);
}
async resetPassword(id: string) {
return await this.requests.post(routes.usersIdResetPassword(id), {});
}
async createAPIToken(tokenName: CreateAPIToken) {
return await this.requests.post<ResponseToken>(routes.usersApiTokens, tokenName);
}
@ -71,4 +75,8 @@ export class UserApi extends BaseCRUDAPI<UserOut, UserIn> {
if (!id || id === undefined) return;
return `/api/users/${id}/image`;
}
async resetPassword(payload: PasswordResetPayload) {
return await this.requests.post(routes.passwordReset, payload);
}
}