mirror of
https://github.com/Paris-est-Ludique/intranet.git
synced 2025-09-11 05:46:28 +02:00
Securized volunteerListGet API
This commit is contained in:
@@ -21,7 +21,7 @@ export const useTeamAssign = (): [any, any] => {
|
|||||||
volunteer: volunteer.id,
|
volunteer: volunteer.id,
|
||||||
team: volunteer.team === teamId ? 0 : teamId,
|
team: volunteer.team === teamId ? 0 : teamId,
|
||||||
})
|
})
|
||||||
refreshVolunteers()
|
refreshVolunteers(jwtToken)
|
||||||
},
|
},
|
||||||
[save, refreshVolunteers, jwtToken]
|
[save, refreshVolunteers, jwtToken]
|
||||||
)
|
)
|
||||||
|
@@ -23,7 +23,12 @@ const expressAccessor = new ExpressAccessors<VolunteerWithoutId, Volunteer>(
|
|||||||
translationVolunteer
|
translationVolunteer
|
||||||
)
|
)
|
||||||
|
|
||||||
export const volunteerListGet = expressAccessor.listGet()
|
export const volunteerListGet = expressAccessor.get(async (list, _body, id) => {
|
||||||
|
if (id <= 0) {
|
||||||
|
throw Error(`L'accès est réservé aux utilisateurs identifiés`)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
})
|
||||||
export const volunteerSet = expressAccessor.set()
|
export const volunteerSet = expressAccessor.set()
|
||||||
|
|
||||||
export const volunteerDiscordId = expressAccessor.get(async (list, body, id) => {
|
export const volunteerDiscordId = expressAccessor.get(async (list, body, id) => {
|
||||||
@@ -174,8 +179,8 @@ async function sendForgetEmail(email: string, password: string): Promise<void> {
|
|||||||
to: email,
|
to: email,
|
||||||
from: "contact@parisestludique.fr",
|
from: "contact@parisestludique.fr",
|
||||||
subject: "Nouveau mot de passe pour le site bénévole de Paris est Ludique",
|
subject: "Nouveau mot de passe pour le site bénévole de Paris est Ludique",
|
||||||
text: `Voici le nouveau mot de passe : ${password}\nL'ancien fonctionne encore, si tu t'en rappelles.`,
|
text: `Voici le nouveau mot de passe : ${password}\nPour te connecter à https://fo.parisestludique.fr`,
|
||||||
html: `Voici le nouveau mot de passe : <strong>${password}</strong><br />L'ancien fonctionne encore, si tu t'en rappelles.`,
|
html: `Voici le nouveau mot de passe : <strong>${password}</strong>\nPour te connecter à <a href="https://fo.parisestludique.fr">https://fo.parisestludique.fr</a>`,
|
||||||
}
|
}
|
||||||
await sgMail.send(msg)
|
await sgMail.send(msg)
|
||||||
}
|
}
|
||||||
|
@@ -90,7 +90,7 @@ app.post("/PostulantAdd", postulantAdd)
|
|||||||
app.post("/VolunteerPartialAdd", volunteerPartialAdd)
|
app.post("/VolunteerPartialAdd", volunteerPartialAdd)
|
||||||
app.post("/VolunteerLogin", volunteerLogin)
|
app.post("/VolunteerLogin", volunteerLogin)
|
||||||
app.post("/VolunteerForgot", volunteerForgot)
|
app.post("/VolunteerForgot", volunteerForgot)
|
||||||
app.get("/VolunteerListGet", volunteerListGet)
|
app.get("/VolunteerListGet", secure as RequestHandler, volunteerListGet)
|
||||||
|
|
||||||
// Secured APIs
|
// Secured APIs
|
||||||
app.get("/AnnouncementListGet", secure as RequestHandler, announcementListGet)
|
app.get("/AnnouncementListGet", secure as RequestHandler, announcementListGet)
|
||||||
|
@@ -12,7 +12,7 @@ import {
|
|||||||
|
|
||||||
const serviceAccessors = new ServiceAccessors<VolunteerWithoutId, Volunteer>(elementName)
|
const serviceAccessors = new ServiceAccessors<VolunteerWithoutId, Volunteer>(elementName)
|
||||||
|
|
||||||
export const volunteerListGet = serviceAccessors.listGet()
|
export const volunteerListGet = serviceAccessors.securedListGet()
|
||||||
export const volunteerDiscordIdGet = serviceAccessors.securedCustomGet<[number]>("DiscordId")
|
export const volunteerDiscordIdGet = serviceAccessors.securedCustomGet<[number]>("DiscordId")
|
||||||
export const volunteerPartialAdd = serviceAccessors.customPost<[Partial<Volunteer>]>("PartialAdd")
|
export const volunteerPartialAdd = serviceAccessors.customPost<[Partial<Volunteer>]>("PartialAdd")
|
||||||
export const volunteerSet = serviceAccessors.set()
|
export const volunteerSet = serviceAccessors.set()
|
||||||
|
@@ -1,79 +0,0 @@
|
|||||||
import axios from "axios"
|
|
||||||
import _ from "lodash"
|
|
||||||
|
|
||||||
import mockStore from "../../utils/mockStore"
|
|
||||||
import volunteerList, {
|
|
||||||
initialState,
|
|
||||||
getRequesting,
|
|
||||||
getSuccess,
|
|
||||||
getFailure,
|
|
||||||
fetchVolunteerList,
|
|
||||||
} from "../volunteerList"
|
|
||||||
import { Volunteer, volunteerExample } from "../../services/volunteers"
|
|
||||||
|
|
||||||
jest.mock("axios")
|
|
||||||
|
|
||||||
const mockData: Volunteer[] = [volunteerExample]
|
|
||||||
const mockError = "Oops! Something went wrong."
|
|
||||||
|
|
||||||
describe("volunteerList reducer", () => {
|
|
||||||
it("should handle initial state", () => {
|
|
||||||
// @ts-expect-error
|
|
||||||
expect(volunteerList(undefined, {})).toEqual(initialState)
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should handle requesting correctly", () => {
|
|
||||||
expect(volunteerList(undefined, { type: getRequesting.type })).toEqual({
|
|
||||||
readyStatus: "request",
|
|
||||||
ids: [],
|
|
||||||
entities: {},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should handle success correctly", () => {
|
|
||||||
expect(volunteerList(undefined, { type: getSuccess.type, payload: mockData })).toEqual({
|
|
||||||
...initialState,
|
|
||||||
readyStatus: "success",
|
|
||||||
ids: _.map(mockData, "id"),
|
|
||||||
entities: _.keyBy(mockData, "id"),
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it("should handle failure correctly", () => {
|
|
||||||
expect(volunteerList(undefined, { type: getFailure.type, payload: mockError })).toEqual({
|
|
||||||
...initialState,
|
|
||||||
readyStatus: "failure",
|
|
||||||
error: mockError,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("volunteerList action", () => {
|
|
||||||
it("fetches volunteer list successful", async () => {
|
|
||||||
const { dispatch, getActions } = mockStore()
|
|
||||||
const expectedActions = [
|
|
||||||
{ type: getRequesting.type, payload: undefined },
|
|
||||||
{ type: getSuccess.type, payload: mockData },
|
|
||||||
]
|
|
||||||
|
|
||||||
// @ts-expect-error
|
|
||||||
axios.get.mockResolvedValue({ data: mockData })
|
|
||||||
|
|
||||||
await dispatch(fetchVolunteerList())
|
|
||||||
expect(getActions()).toEqual(expectedActions)
|
|
||||||
})
|
|
||||||
|
|
||||||
it("fetches volunteer list failed", async () => {
|
|
||||||
const { dispatch, getActions } = mockStore()
|
|
||||||
const expectedActions = [
|
|
||||||
{ type: getRequesting.type },
|
|
||||||
{ type: getFailure.type, payload: mockError },
|
|
||||||
]
|
|
||||||
|
|
||||||
// @ts-expect-error
|
|
||||||
axios.get.mockRejectedValue({ message: mockError })
|
|
||||||
|
|
||||||
await dispatch(fetchVolunteerList())
|
|
||||||
expect(getActions()).toEqual(expectedActions)
|
|
||||||
})
|
|
||||||
})
|
|
@@ -42,13 +42,23 @@ export const fetchVolunteerList = elementListFetch(
|
|||||||
|
|
||||||
const shouldFetchVolunteerList = (state: AppState) => state.volunteerList.readyStatus !== "success"
|
const shouldFetchVolunteerList = (state: AppState) => state.volunteerList.readyStatus !== "success"
|
||||||
|
|
||||||
export const fetchVolunteerListIfNeed = (): AppThunk => (dispatch, getState) => {
|
export const fetchVolunteerListIfNeed =
|
||||||
if (shouldFetchVolunteerList(getState())) return dispatch(fetchVolunteerList())
|
(id = 0): AppThunk =>
|
||||||
|
(dispatch, getState) => {
|
||||||
|
let jwt = ""
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
;({ jwt, id } = getState().auth)
|
||||||
|
}
|
||||||
|
if (shouldFetchVolunteerList(getState())) return dispatch(fetchVolunteerList(jwt))
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
export const refreshVolunteerList = (): AppThunk => (dispatch) => dispatch(fetchVolunteerList())
|
export const refreshVolunteerList =
|
||||||
|
(jwt: string): AppThunk =>
|
||||||
|
(dispatch) =>
|
||||||
|
dispatch(fetchVolunteerList(jwt))
|
||||||
|
|
||||||
export const selectVolunteerListState = (state: AppState): EntitiesRequest<Volunteer> =>
|
export const selectVolunteerListState = (state: AppState): EntitiesRequest<Volunteer> =>
|
||||||
state.volunteerList
|
state.volunteerList
|
||||||
|
Reference in New Issue
Block a user