]> WPIA git - gigi.git/blob - src/club/wpia/gigi/dbObjects/CATS.java
upd: precise SQL statements for verification
[gigi.git] / src / club / wpia / gigi / dbObjects / CATS.java
1 package club.wpia.gigi.dbObjects;
2
3 import java.sql.Timestamp;
4 import java.util.Date;
5 import java.util.HashMap;
6
7 import club.wpia.gigi.database.GigiPreparedStatement;
8 import club.wpia.gigi.database.GigiResultSet;
9 import club.wpia.gigi.util.TimeConditions;
10
11 public class CATS {
12
13     public enum CATSType {
14         AGENT_CHALLENGE("Agent Qualifying Challenge"),
15
16         ORG_AGENT_CHALLENGE("Organisation Agent Qualifying Challenge"),
17
18         TTP_AGENT_CHALLENGE("TTP Agent Qualifying Challenge"),
19
20         TTP_TOPUP_AGENT_CHALLENGE_NAME("TTP TOPUP Agent Qualifying Challenge"),
21
22         CODE_SIGNING_CHALLENGE_NAME("Code Signing Challenge"),
23
24         ORG_ADMIN_DP_CHALLENGE_NAME("Organisation Administrator Data Protection Challenge"),
25
26         SUPPORT_DP_CHALLENGE_NAME("Support Data Protection Challenge");
27
28         private final String displayName;
29
30         private final int id;
31
32         private CATSType(String displayName) {
33             this.displayName = displayName;
34             id = getID(displayName);
35         }
36
37         public String getDisplayName() {
38             return displayName;
39         }
40
41         public int getId() {
42             return id;
43         }
44     }
45
46     /**
47      * The maximal number of months a passed test is considered "recent".
48      */
49     public static final int TEST_MONTHS = TimeConditions.getInstance().getTestMonths();
50
51     private static HashMap<String, Integer> names = new HashMap<>();
52
53     private CATS() {
54
55     }
56
57     static {
58         try (GigiPreparedStatement st = new GigiPreparedStatement("SELECT `id`, `type_text` FROM `cats_type`")) {
59             GigiResultSet res = st.executeQuery();
60             while (res.next()) {
61                 names.put(res.getString(2), res.getInt(1));
62             }
63         }
64     }
65
66     public static synchronized int getID(String name) {
67         Integer i = names.get(name);
68         if (i == null) {
69             try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `cats_type` SET `type_text`=?")) {
70                 ps.setString(1, name);
71                 ps.execute();
72                 i = ps.lastInsertId();
73             }
74             names.put(name, i);
75         }
76         return i;
77     }
78
79     public static void enterResult(User user, CATSType testType, Date passDate, String language, String version) {
80         enterResult(user, testType.id, passDate, language, version);
81     }
82
83     public static void enterResult(User user, String testType, Date passDate, String language, String version) {
84         enterResult(user, getID(testType), passDate, language, version);
85     }
86
87     private static void enterResult(User user, int testTypeId, Date passDate, String language, String version) {
88
89         try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `cats_passed` SET `user_id`=?, `variant_id`=?, `pass_date`=?, `language`=?, `version`=?")) {
90             ps.setInt(1, user.getId());
91             ps.setInt(2, testTypeId);
92             ps.setTimestamp(3, new Timestamp(passDate.getTime()));
93             ps.setString(4, language);
94             ps.setString(5, version);
95             ps.execute();
96         }
97     }
98
99     public static boolean isInCatsLimit(int uID, int testID) {
100         try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT 1 FROM `cats_passed` WHERE `user_id` = ? AND `variant_id` = ? AND`pass_date` > (now() - interval '1 months' * ?::INTEGER)")) {
101             ps.setInt(1, uID);
102             ps.setInt(2, testID);
103             ps.setInt(3, TEST_MONTHS);
104
105             GigiResultSet rs = ps.executeQuery();
106             return rs.next();
107         }
108     }
109 }