security-analyzer-slice.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { createSlice } from "@reduxjs/toolkit";
  2. export enum ActionSecurityRisk {
  3. UNKNOWN = -1,
  4. LOW = 0,
  5. MEDIUM = 1,
  6. HIGH = 2,
  7. }
  8. export type SecurityAnalyzerLog = {
  9. id: number;
  10. content: string;
  11. security_risk: ActionSecurityRisk;
  12. confirmation_state?: "awaiting_confirmation" | "confirmed" | "rejected";
  13. confirmed_changed: boolean;
  14. };
  15. const initialLogs: SecurityAnalyzerLog[] = [];
  16. export const securityAnalyzerSlice = createSlice({
  17. name: "securityAnalyzer",
  18. initialState: {
  19. logs: initialLogs,
  20. },
  21. reducers: {
  22. appendSecurityAnalyzerInput: (state, action) => {
  23. const log = {
  24. id: action.payload.id,
  25. content:
  26. action.payload.args.command ||
  27. action.payload.args.code ||
  28. action.payload.args.content ||
  29. action.payload.message,
  30. security_risk: action.payload.args.security_risk as ActionSecurityRisk,
  31. confirmation_state: action.payload.args.confirmation_state,
  32. confirmed_changed: false,
  33. };
  34. const existingLog = state.logs.find(
  35. (stateLog) =>
  36. stateLog.id === log.id ||
  37. (stateLog.confirmation_state === "awaiting_confirmation" &&
  38. stateLog.content === log.content),
  39. );
  40. if (existingLog) {
  41. if (existingLog.confirmation_state !== log.confirmation_state) {
  42. existingLog.confirmation_state = log.confirmation_state;
  43. existingLog.confirmed_changed = true;
  44. }
  45. } else {
  46. state.logs.push(log);
  47. }
  48. },
  49. },
  50. });
  51. export const { appendSecurityAnalyzerInput } = securityAnalyzerSlice.actions;
  52. export default securityAnalyzerSlice.reducer;