diff --git a/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java new file mode 100644 index 0000000..2820eb1 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java @@ -0,0 +1,42 @@ +package fr.titionfire.ffsaf.net2.packet; + +import fr.titionfire.ffsaf.ws.FileSocket; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +import java.util.HashMap; +import java.util.UUID; + +@ApplicationScoped +public class RFile { + private static final Logger LOGGER = Logger.getLogger(RFile.class); + + final IAction requestSend = (client_Thread, message) -> { + try { + switch (message.data().get("type").asText()) { + case "match": + String code = UUID.randomUUID() + "-" + UUID.randomUUID(); + + FileSocket.FileRecv fileRecv = new FileSocket.FileRecv(null, message.data().get("name").asText(), null, null, + System.currentTimeMillis()); + FileSocket.sessions.put(code, fileRecv); + + client_Thread.sendRepTo(code, message); + break; + default: + client_Thread.sendErrTo("", message); + break; + + } + } catch (Throwable e) { + LOGGER.error(e.getMessage(), e); + client_Thread.sendErrTo(e.getMessage(), message); + } + }; + + public static void register(HashMap iMap) { + RFile rFile = new RFile(); + + iMap.put("requestSend", rFile.requestSend); + } +} diff --git a/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java b/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java index bc7fe66..3078ab9 100644 --- a/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java +++ b/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java @@ -9,5 +9,6 @@ public class RegisterAction { RComb.register(iMap); RClub.register(iMap); + RFile.register(iMap); } } diff --git a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java index be5e725..0d7b3e2 100644 --- a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java +++ b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java @@ -1,84 +1,141 @@ package fr.titionfire.ffsaf.ws; import io.quarkus.runtime.annotations.RegisterForReflection; +import io.quarkus.scheduler.Scheduled; import jakarta.enterprise.context.ApplicationScoped; import jakarta.websocket.*; import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; import lombok.AllArgsConstructor; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -@ServerEndpoint("/api/ws/file/{id}") +@ServerEndpoint("/api/ws/file/{code}") @ApplicationScoped public class FileSocket { - Map sessions = new ConcurrentHashMap<>(); + private static final Logger logger = Logger.getLogger(FileSocket.class); + public static Map sessions = new ConcurrentHashMap<>(); + + @ConfigProperty(name = "upload_dir") + String media; + + @Scheduled(every = "10s") + void increment() { + sessions.forEach((key, value) -> { + if (System.currentTimeMillis() - value.time > 60000) { + closeAndDelete(value); + if (value.session != null && value.session.isOpen()) { + try { + value.session.close(new CloseReason(CloseReason.CloseCodes.VIOLATED_POLICY, "Timeout")); + } catch (IOException e) { + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); + } + } + sessions.remove(key); + } + }); + } @OnOpen - public void onOpen(Session session, @PathParam("id") String id) { + public void onOpen(Session session, @PathParam("code") String code) { try { - File file = File.createTempFile("safca-", ".tmp"); - FileRecv fileRecv = new FileRecv(file, new FileOutputStream(file, true), System.currentTimeMillis(), - session); - System.out.println("File created: " + file.getAbsolutePath()); - sessions.put(id, fileRecv); + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); + fileRecv.file = new File(media, "record/" + fileRecv.name); + fileRecv.fos = new FileOutputStream(fileRecv.file, false); + logger.info("Start reception of file: " + fileRecv.file.getAbsolutePath()); + } else { + session.close(new CloseReason(CloseReason.CloseCodes.VIOLATED_POLICY, "File not found")); + } } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } @OnClose - public void onClose(Session session, @PathParam("id") String id) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); + public void onClose(Session session, @PathParam("code") String code) { + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); if (fileRecv.fos != null) { try { fileRecv.fos.close(); } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } + logger.info("File received: " + fileRecv.file.getAbsolutePath()); + sessions.remove(code); } - sessions.remove(id); } @OnError - public void onError(Session session, @PathParam("id") String id, Throwable throwable) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); - if (fileRecv.fos != null) { - try { - fileRecv.fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } + public void onError(Session session, @PathParam("code") String code, Throwable throwable) { + if (sessions.containsKey(code)) { + closeAndDelete(sessions.get(code)); + sessions.remove(code); + } + logger.error("Error on file reception: " + throwable.getMessage()); + } + + + @OnMessage + public void onMessage(String message, @PathParam("code") String code) { + if (message.equals("cancel")) { + if (sessions.containsKey(code)) { + closeAndDelete(sessions.get(code)); + sessions.remove(code); + } + logger.error("Error file " + code + " are cancel by the client"); + } + } + + private void closeAndDelete(FileRecv fileRecv) { + if (fileRecv.fos != null) { + try { + fileRecv.fos.close(); + } catch (IOException e) { + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } - sessions.remove(id); + if (fileRecv.file.exists()) { + //noinspection ResultOfMethodCallIgnored + fileRecv.file.delete(); + } } @OnMessage - public void onMessage(String message, @PathParam("id") String id) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); + public void onMessage(byte[] data, @PathParam("code") String code) { + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); try { - fileRecv.fos.write(message.getBytes()); + fileRecv.fos.write(data); } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } } @AllArgsConstructor @RegisterForReflection - class FileRecv { + public static class FileRecv { + Session session; + String name; File file; FileOutputStream fos; long time; - Session session; } } diff --git a/src/main/webapp/src/pages/club/member/NewMemberPage.jsx b/src/main/webapp/src/pages/club/member/NewMemberPage.jsx index aaddd9b..b3d588f 100644 --- a/src/main/webapp/src/pages/club/member/NewMemberPage.jsx +++ b/src/main/webapp/src/pages/club/member/NewMemberPage.jsx @@ -3,7 +3,6 @@ import {useLoadingSwitcher} from "../../../hooks/useLoading.jsx"; import {apiAxios} from "../../../utils/Tools.js"; import {toast} from "react-toastify"; import {BirthDayField, OptionField, TextField} from "../../../components/MemberCustomFiels.jsx"; -import {ClubSelect} from "../../../components/ClubSelect.jsx"; import {addPhoto} from "../../admin/member/InformationForm.jsx"; export function NewMemberPage() {