summaryrefslogtreecommitdiff
path: root/src/main/java/dev/dnpm/oshelper/security/PersonPoolBasedPermissionEvaluator.java
blob: 666aed9b56503396c1b4afbdf6864eece6fc5c27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 * This file is part of onkostar-plugin-dnpm
 *
 * Copyright (C) 2023-2026 the original author or authors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package dev.dnpm.oshelper.security;

import de.itc.onkostar.api.IOnkostarApi;
import de.itc.onkostar.api.Patient;
import de.itc.onkostar.api.Procedure;
import java.io.Serializable;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

/**
 * Permission-Evaluator zur Auswertung der Berechtigung auf Objekte aufgrund der
 * Personenstammberechtigung
 */
@Component
public class PersonPoolBasedPermissionEvaluator extends AbstractDelegatedPermissionEvaluator {

  public PersonPoolBasedPermissionEvaluator(
      final IOnkostarApi onkostarApi, final SecurityService securityService) {
    super(onkostarApi, securityService);
  }

  /**
   * Auswertung der Zugriffsberechtigung für authentifizierten Benutzer auf Zielobjekt mit
   * angeforderter Berechtigung.
   *
   * @param authentication Das Authentication Objekt
   * @param targetObject Das Zielobjekt
   * @param permissionType Die angeforderte Berechtigung
   * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat
   */
  @Override
  public boolean hasPermission(
      Authentication authentication, Object targetObject, Object permissionType) {
    if (permissionType instanceof PermissionType) {
      if (targetObject instanceof Patient) {
        return this.securityService
            .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType)
            .contains(((Patient) targetObject).getPersonPoolCode());
      } else if (targetObject instanceof Procedure) {
        return this.securityService
            .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType)
            .contains(((Procedure) targetObject).getPatient().getPersonPoolCode());
      }
    }
    return false;
  }

  /**
   * Auswertung anhand der ID und des Namens des Zielobjekts.
   *
   * @param authentication Authentication-Object
   * @param targetId ID des Objekts
   * @param targetType Name der Zielobjektklasse
   * @param permissionType Die angeforderte Berechtigung
   * @return Gibt <code>true</code> zurück, wenn der Benutzer die Berechtigung hat
   */
  @Override
  public boolean hasPermission(
      Authentication authentication,
      Serializable targetId,
      String targetType,
      Object permissionType) {
    if (targetId instanceof Integer && permissionType instanceof PermissionType) {
      var personPoolCode = getPersonPoolCode((int) targetId, targetType);
      if (null != personPoolCode) {
        return this.securityService
            .getPersonPoolIdsForPermission(authentication, (PermissionType) permissionType)
            .contains(personPoolCode);
      }
    }
    return false;
  }

  private String getPersonPoolCode(int id, String type) {
    Patient patient = null;

    if (PATIENT.equals(type)) {
      patient = onkostarApi.getPatient(id);
    } else if (PROCEDURE.equals(type)) {
      var procedure = onkostarApi.getProcedure(id);
      if (null != procedure) {
        patient = procedure.getPatient();
      }
    }

    if (null != patient) {
      return patient.getPersonPoolCode();
    }

    return null;
  }
}