• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

steinarb / handlereg / #134

07 Jun 2025 09:55PM UTC coverage: 99.721% (+2.5%) from 97.174%
#134

push

steinarb
Let dependabot upgrade npm dependencies on github

716 of 718 relevant lines covered (99.72%)

1.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.72
/handlereg.backend/src/main/java/no/priv/bang/handlereg/backend/HandleregServiceProvider.java
1
/*
2
 * Copyright 2018-2025 Steinar Bang
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *   http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing,
11
 * software distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and limitations
14
 * under the License.
15
 */
16
package no.priv.bang.handlereg.backend;
17

18
import java.sql.Connection;
19
import java.sql.ResultSet;
20
import java.sql.SQLException;
21
import java.sql.Timestamp;
22
import java.time.Month;
23
import java.time.Year;
24
import java.util.ArrayList;
25
import java.util.Date;
26
import java.util.List;
27
import javax.sql.DataSource;
28

29
import org.osgi.service.component.annotations.Activate;
30
import org.osgi.service.component.annotations.Component;
31
import org.osgi.service.component.annotations.Reference;
32
import org.osgi.service.log.LogService;
33
import org.osgi.service.log.Logger;
34

35
import no.priv.bang.handlereg.services.Butikk;
36
import no.priv.bang.handlereg.services.ButikkCount;
37
import no.priv.bang.handlereg.services.ButikkDate;
38
import no.priv.bang.handlereg.services.ButikkSum;
39
import no.priv.bang.handlereg.services.Favoritt;
40
import no.priv.bang.handlereg.services.NyFavoritt;
41
import no.priv.bang.handlereg.services.Favorittpar;
42
import no.priv.bang.handlereg.services.HandleregException;
43
import no.priv.bang.handlereg.services.HandleregService;
44
import no.priv.bang.handlereg.services.NyHandling;
45
import no.priv.bang.handlereg.services.Oversikt;
46
import no.priv.bang.handlereg.services.SumYear;
47
import no.priv.bang.handlereg.services.SumYearMonth;
48
import no.priv.bang.handlereg.services.Transaction;
49
import no.priv.bang.osgiservice.users.Role;
50
import no.priv.bang.osgiservice.users.UserManagementService;
51

52
import static java.lang.String.format;
53
import static no.priv.bang.handlereg.services.HandleregConstants.*;
54

55
@Component(service=HandleregService.class, immediate=true)
56
public class HandleregServiceProvider implements HandleregService {
1✔
57

58
    private static final String STORE_NAME = "store_name";
59
    private static final String REKKEFOLGE = "rekkefolge";
60
    private static final String GRUPPE = "gruppe";
61
    private static final String TRANSACTION_ID = "transaction_id";
62
    private static final String ACCOUNT_ID = "account_id";
63
    private static final String STORE_ID = "store_id";
64
    private static final String AGGREGATE_AMOUNT = "aggregate_amount";
65
    private Logger logger;
66
    private DataSource datasource;
67
    private UserManagementService useradmin;
68

69
    @Reference
70
    public void setLogservice(LogService logservice) {
71
        this.logger = logservice.getLogger(HandleregServiceProvider.class);
1✔
72
    }
1✔
73

74
    @Reference(target = "(osgi.jndi.service.name=jdbc/handlereg)")
75
    public void setDatasource(DataSource datasource) {
76
        this.datasource = datasource;
1✔
77
    }
1✔
78

79
    @Reference
80
    public void setUseradmin(UserManagementService useradmin) {
81
        this.useradmin = useradmin;
1✔
82
    }
1✔
83

84
    @Activate
85
    public void activate() {
86
        addRolesIfNotpresent();
1✔
87
    }
1✔
88

89
    @Override
90
    public Oversikt finnOversikt(String brukernavn) {
91
        var sql = "select a.account_id, a.username, (select sum(t1.transaction_amount) from transactions t1 where t1.account_id=a.account_id) - (select sum(t1.transaction_amount) from transactions t1 where t1.account_id!=a.account_id) as balance from accounts a where a.username=?";
1✔
92
        try(var connection = datasource.getConnection()) {
1✔
93
            var sumPreviousMonth = 0.0;
1✔
94
            var sumThisMonth = 0.0;
1✔
95
            // We want the two last items of the resultset, but it's not possible to
96
            // order a view in SQL, so this can't be done in SQL.
97
            //
98
            // Therefore we have to iterate backwards through the resultset.
99
            try (var statement = connection.prepareStatement(
1✔
100
                "select aggregate_amount from sum_over_month_view",
101
                ResultSet.TYPE_SCROLL_INSENSITIVE,
102
                ResultSet.CONCUR_READ_ONLY))
103
            {
104
                try (var results = statement.executeQuery()) {
1✔
105
                    if (results.last()) {
1✔
106
                        sumThisMonth = results.getDouble(AGGREGATE_AMOUNT);
1✔
107
                    }
108
                    if (results.previous()) {
1✔
109
                        sumPreviousMonth = results.getDouble(AGGREGATE_AMOUNT);
1✔
110
                    }
111
                }
112
            }
113

114
            double lastTransactionAmount = 0;
1✔
115
            var lastTransactionStore = -1;
1✔
116
            var lastTransactionAmountQuery = "select transaction_amount, store_id from transactions t join accounts a on t.account_id=a.account_id where a.username=? order by transaction_time desc fetch first 1 rows only";
1✔
117
            try (var statement = connection.prepareStatement(lastTransactionAmountQuery)) {
1✔
118
                statement.setString(1, brukernavn);
1✔
119
                try(var results = statement.executeQuery()) {
1✔
120
                    if (results.next()) {
1✔
121
                        lastTransactionAmount = results.getDouble("transaction_amount");
1✔
122
                        lastTransactionStore = results.getInt(STORE_ID);
1✔
123
                    }
124
                }
125
            }
126

127
            try (var statement = connection.prepareStatement(sql)) {
1✔
128
                statement.setString(1, brukernavn);
1✔
129
                try(var results = statement.executeQuery()) {
1✔
130
                    if (results.next()) {
1✔
131
                        var userid = results.getInt(ACCOUNT_ID);
1✔
132
                        var username = results.getString("username");
1✔
133
                        var balanse = results.getDouble("balance");
1✔
134
                        var user = useradmin.getUser(username);
1✔
135
                        return Oversikt.with()
1✔
136
                            .accountid(userid)
1✔
137
                            .brukernavn(username)
1✔
138
                            .email(user.email())
1✔
139
                            .fornavn(user.firstname())
1✔
140
                            .etternavn(user.lastname())
1✔
141
                            .balanse(balanse)
1✔
142
                            .sumPreviousMonth(sumPreviousMonth)
1✔
143
                            .sumThisMonth(sumThisMonth)
1✔
144
                            .lastTransactionAmount(lastTransactionAmount)
1✔
145
                            .lastTransactionStore(lastTransactionStore)
1✔
146
                            .build();
1✔
147
                    }
148

149
                    return null;
1✔
150
                }
1✔
151
            }
1✔
152
        } catch (SQLException e) {
1✔
153
            throw new HandleregException(format("Failed to retrieve an Oversikt for user %s", brukernavn), e);
1✔
154
        }
155
    }
156

157
    @Override
158
    public List<Transaction> findTransactions(int userId, int pageNumber, int pageSize) {
159
        var handlinger = new ArrayList<Transaction>();
1✔
160
        var sql = "select t.transaction_id, t.transaction_time, s.store_name, s.store_id, t.transaction_amount from transactions t join stores s on s.store_id=t.store_id where t.account_id=? order by t.transaction_time desc offset ? rows fetch next ? rows only";
1✔
161
        try(var connection = datasource.getConnection()) {
1✔
162
            try (var statement = connection.prepareStatement(sql)) {
1✔
163
                statement.setInt(1, userId);
1✔
164
                statement.setInt(2, pageNumber * pageSize);
1✔
165
                statement.setInt(3, pageSize);
1✔
166
                try (var results = statement.executeQuery()) {
1✔
167
                    while(results.next()) {
1✔
168
                        var transaction = Transaction.with()
1✔
169
                            .transactionId(results.getInt(TRANSACTION_ID))
1✔
170
                            .handletidspunkt(new Date(results.getTimestamp("transaction_time").getTime()))
1✔
171
                            .butikk(results.getString(STORE_NAME))
1✔
172
                            .storeId(results.getInt(STORE_ID))
1✔
173
                            .belop(results.getDouble("transaction_amount"))
1✔
174
                            .build();
1✔
175
                        handlinger.add(transaction);
1✔
176
                    }
1✔
177
                }
178
            }
179
        } catch (SQLException e) {
1✔
180
            throw new HandleregException(format("Failed to retrieve a list of transactions for account number %d", userId), e);
1✔
181
        }
1✔
182

183
        return handlinger;
1✔
184
    }
185

186
    @Override
187
    public Oversikt registrerHandling(NyHandling handling) {
188
        var transactionTime = handling.handletidspunkt() == null ? new Date() : handling.handletidspunkt();
1✔
189
        var sql = "insert into transactions (account_id, store_id, transaction_amount, transaction_time) values ((select account_id from accounts where username=?), ?, ?, ?)";
1✔
190
        try(var connection = datasource.getConnection()) {
1✔
191
            try(var statement = connection.prepareStatement(sql)) {
1✔
192
                statement.setString(1, handling.username());
1✔
193
                statement.setInt(2, handling.storeId());
1✔
194
                statement.setDouble(3, handling.belop());
1✔
195
                statement.setTimestamp(4, Timestamp.from(transactionTime.toInstant()));
1✔
196
                statement.executeUpdate();
1✔
197
                return finnOversikt(handling.username());
1✔
198
            }
199
        } catch (SQLException e) {
1✔
200
            throw new HandleregException(format("Failed to register purchase for user %s", handling.username()), e);
1✔
201
        }
202
    }
203

204
    @Override
205
    public List<Butikk> finnButikker() {
206
        var butikker = new ArrayList<Butikk>();
1✔
207
        var sql = "select store_id, store_name, gruppe, rekkefolge from stores where not deaktivert order by gruppe, rekkefolge";
1✔
208
        try (var connection = datasource.getConnection()) {
1✔
209
            try (var statement = connection.prepareStatement(sql)) {
1✔
210
                try (var results = statement.executeQuery()) {
1✔
211
                    while(results.next()) {
1✔
212
                        var butikk = Butikk.with()
1✔
213
                            .storeId(results.getInt(STORE_ID))
1✔
214
                            .butikknavn(results.getString(STORE_NAME))
1✔
215
                            .gruppe(results.getInt(GRUPPE))
1✔
216
                            .rekkefolge(results.getInt(REKKEFOLGE))
1✔
217
                            .build();
1✔
218
                        butikker.add(butikk);
1✔
219
                    }
1✔
220
                }
221
            }
222
        } catch (SQLException e) {
1✔
223
            throw new HandleregException("Failed to retrieve a list of stores", e);
1✔
224
        }
1✔
225
        return butikker;
1✔
226
    }
227

228
    @Override
229
    public List<Butikk> endreButikk(Butikk butikkSomSkalEndres) {
230
        var butikkId = butikkSomSkalEndres.storeId();
1✔
231
        var butikknavn = butikkSomSkalEndres.butikknavn();
1✔
232
        var gruppe = butikkSomSkalEndres.gruppe();
1✔
233
        var rekkefolge = butikkSomSkalEndres.rekkefolge();
1✔
234
        var sql = "update stores set store_name=?, gruppe=?, rekkefolge=? where store_id=?";
1✔
235
        try (var connection = datasource.getConnection()) {
1✔
236
            try(var statement = connection.prepareStatement(sql)) {
1✔
237
                statement.setString(1, butikknavn);
1✔
238
                statement.setInt(2, gruppe);
1✔
239
                statement.setInt(3, rekkefolge);
1✔
240
                statement.setInt(4, butikkId);
1✔
241
                statement.executeUpdate();
1✔
242
                return finnButikker();
1✔
243
            }
244
        } catch (SQLException e) {
1✔
245
            throw new HandleregException(format("Failed to insert store \"%s\" in group %d, sort order %s", butikkSomSkalEndres.butikknavn(), gruppe, rekkefolge), e);
1✔
246
        }
247
    }
248

249
    @Override
250
    public List<Butikk> leggTilButikk(Butikk nybutikk) {
251
        var gruppe = nybutikk.gruppe() < 1 ? 2 : nybutikk.gruppe();
1✔
252
        var rekkefolge = nybutikk.rekkefolge() < 1 ? finnNesteLedigeRekkefolgeForGruppe(gruppe) : nybutikk.rekkefolge();
1✔
253
        var sql = "insert into stores (store_name, gruppe, rekkefolge) values (?, ?, ?)";
1✔
254
        try (var connection = datasource.getConnection()) {
1✔
255
            try(var statement = connection.prepareStatement(sql)) {
1✔
256
                statement.setString(1, nybutikk.butikknavn());
1✔
257
                statement.setInt(2, gruppe);
1✔
258
                statement.setInt(3, rekkefolge);
1✔
259
                statement.executeUpdate();
1✔
260
                return finnButikker();
1✔
261
            }
262
        } catch (SQLException e) {
1✔
263
            throw new HandleregException(format("Failed to modify store \"%s\" in group %d, sort order %s", nybutikk.butikknavn(), gruppe, rekkefolge), e);
1✔
264
        }
265
    }
266

267
    @Override
268
    public List<ButikkSum> sumOverButikk() {
269
        var sumOverButikk = new ArrayList<ButikkSum>();
1✔
270
        var sql = "select s.store_id, s.store_name, s.gruppe, s.rekkefolge, sum(t.transaction_amount) as totalbelop from transactions t join stores s on s.store_id=t.store_id group by s.store_id, s.store_name, s.gruppe, s.rekkefolge order by totalbelop desc";
1✔
271
        try (var connection = datasource.getConnection()) {
1✔
272
            try (var statement = connection.prepareStatement(sql)) {
1✔
273
                try (var results = statement.executeQuery()) {
1✔
274
                    while(results.next()) {
1✔
275
                        var butikk = Butikk.with()
1✔
276
                            .storeId(results.getInt(STORE_ID))
1✔
277
                            .butikknavn(results.getString(STORE_NAME))
1✔
278
                            .gruppe(results.getInt(GRUPPE))
1✔
279
                            .rekkefolge(results.getInt(REKKEFOLGE))
1✔
280
                            .build();
1✔
281
                        var butikkSum = ButikkSum.with()
1✔
282
                            .butikk(butikk)
1✔
283
                            .sum(results.getDouble("totalbelop"))
1✔
284
                            .build();
1✔
285
                        sumOverButikk.add(butikkSum);
1✔
286
                    }
1✔
287
                }
288
            }
289
        } catch (SQLException e) {
1✔
290
            logWarning("Got error when retrieving sum over stores", e);
1✔
291
        }
1✔
292
        return sumOverButikk;
1✔
293
    }
294

295
    @Override
296
    public List<ButikkCount> antallHandlingerIButikk() {
297
        var antallHandlerIButikk = new ArrayList<ButikkCount>();
1✔
298
        var sql = "select s.store_id, s.store_name, s.gruppe, s.rekkefolge, count(t.transaction_amount) as antallbesok from transactions t join stores s on s.store_id=t.store_id group by s.store_id, s.store_name, s.gruppe, s.rekkefolge order by antallbesok desc";
1✔
299
        try (var connection = datasource.getConnection()) {
1✔
300
            try (var statement = connection.prepareStatement(sql)) {
1✔
301
                try (var results = statement.executeQuery()) {
1✔
302
                    while(results.next()) {
1✔
303
                        var butikk = Butikk.with()
1✔
304
                            .storeId(results.getInt(STORE_ID))
1✔
305
                            .butikknavn(results.getString(STORE_NAME))
1✔
306
                            .gruppe(results.getInt(GRUPPE))
1✔
307
                            .rekkefolge(results.getInt(REKKEFOLGE))
1✔
308
                            .build();
1✔
309
                        var butikkSum = ButikkCount.with()
1✔
310
                            .butikk(butikk)
1✔
311
                            .count(results.getLong("antallbesok"))
1✔
312
                            .build();
1✔
313
                        antallHandlerIButikk.add(butikkSum);
1✔
314
                    }
1✔
315
                }
316
            }
317
        } catch (SQLException e) {
1✔
318
            logWarning("Got error when retrieving count of the number of times store have been visited", e);
1✔
319
        }
1✔
320
        return antallHandlerIButikk;
1✔
321
    }
322

323
    @Override
324
    public List<ButikkDate> sisteHandelIButikk() {
325
        var sisteHandelIButikk = new ArrayList<ButikkDate>();
1✔
326
        var sql = "select s.store_id, s.store_name, s.gruppe, s.rekkefolge, MAX(t.transaction_time) as handletid from transactions t join stores s on s.store_id=t.store_id group by s.store_id, s.store_name, s.gruppe, s.rekkefolge order by handletid desc";
1✔
327
        try (var connection = datasource.getConnection()) {
1✔
328
            try (var statement = connection.prepareStatement(sql)) {
1✔
329
                try (var results = statement.executeQuery()) {
1✔
330
                    while(results.next()) {
1✔
331
                        var butikk = Butikk.with()
1✔
332
                            .storeId(results.getInt(STORE_ID))
1✔
333
                            .butikknavn(results.getString(STORE_NAME))
1✔
334
                            .gruppe(results.getInt(GRUPPE))
1✔
335
                            .rekkefolge(results.getInt(REKKEFOLGE))
1✔
336
                            .build();
1✔
337
                        var butikkSum = ButikkDate.with()
1✔
338
                            .butikk(butikk)
1✔
339
                            .date(new Date(results.getTimestamp("handletid").getTime()))
1✔
340
                            .build();
1✔
341
                        sisteHandelIButikk.add(butikkSum);
1✔
342
                    }
1✔
343
                }
344
            }
345
        } catch (SQLException e) {
1✔
346
            logWarning("Got error when retrieving last visit times for stores", e);
1✔
347
        }
1✔
348
        return sisteHandelIButikk;
1✔
349
    }
350

351
    @Override
352
    public List<SumYear> totaltHandlebelopPrAar() {
353
        var totaltHandlebelopPrAar = new ArrayList<SumYear>();
1✔
354
        try (var connection = datasource.getConnection()) {
1✔
355
            try (var statement = connection.prepareStatement("select aggregate_amount, aggregate_year from sum_over_year_view")) {
1✔
356
                try (var results = statement.executeQuery()) {
1✔
357
                    while(results.next()) {
1✔
358
                        var sumMonth = SumYear.with()
1✔
359
                            .sum(results.getDouble(AGGREGATE_AMOUNT))
1✔
360
                            .year(Year.of(results.getInt("aggregate_year")))
1✔
361
                            .build();
1✔
362
                        totaltHandlebelopPrAar.add(sumMonth);
1✔
363
                    }
1✔
364
                }
365
            }
366
        } catch (SQLException e) {
1✔
367
            logWarning("Got error when retrieving total amount used per year", e);
1✔
368
        }
1✔
369
        return totaltHandlebelopPrAar;
1✔
370
    }
371

372
    @Override
373
    public List<SumYearMonth> totaltHandlebelopPrAarOgMaaned() {
374
        var totaltHandlebelopPrAarOgMaaned = new ArrayList<SumYearMonth>();
1✔
375
        try (var connection = datasource.getConnection()) {
1✔
376
            try (var statement = connection.prepareStatement("select aggregate_amount, aggregate_year, aggregate_month from sum_over_month_view")) {
1✔
377
                try (var results = statement.executeQuery()) {
1✔
378
                    while(results.next()) {
1✔
379
                        var sumMonth = SumYearMonth.with()
1✔
380
                            .sum(results.getDouble(AGGREGATE_AMOUNT))
1✔
381
                            .year(Year.of(results.getInt("aggregate_year")))
1✔
382
                            .month(Month.of(results.getInt("aggregate_month")))
1✔
383
                            .build();
1✔
384
                        totaltHandlebelopPrAarOgMaaned.add(sumMonth);
1✔
385
                    }
1✔
386
                }
387
            }
388
        } catch (SQLException e) {
1✔
389
            logWarning("Got error when retrieving total amount used per year", e);
1✔
390
        }
1✔
391
        return totaltHandlebelopPrAarOgMaaned;
1✔
392
    }
393

394
    @Override
395
    public List<Favoritt> finnFavoritter(String brukernavn) {
396
        var favoritter = new ArrayList<Favoritt>();
1✔
397
        var sql = "select s.store_id, s.store_name, s.gruppe, s.rekkefolge as store_rekkefolge, f.favourite_id, f.account_id, f.rekkefolge favourite_rekkefolge from accounts a join favourites f on a.account_id=f.account_id join stores s on f.store_id=s.store_id where a.username=? order by f.rekkefolge";
1✔
398
        try (var connection = datasource.getConnection()) {
1✔
399
            try (var statement = connection.prepareStatement(sql)) {
1✔
400
                statement.setString(1, brukernavn);
1✔
401
                try (var results = statement.executeQuery()) {
1✔
402
                    while(results.next()) {
1✔
403
                        var butikk = Butikk.with()
1✔
404
                            .storeId(results.getInt(STORE_ID))
1✔
405
                            .butikknavn(results.getString(STORE_NAME))
1✔
406
                            .gruppe(results.getInt(GRUPPE))
1✔
407
                            .rekkefolge(results.getInt("store_rekkefolge"))
1✔
408
                            .build();
1✔
409
                        var favoritt = Favoritt.with()
1✔
410
                            .favouriteid(results.getInt("favourite_id"))
1✔
411
                            .accountid(results.getInt(ACCOUNT_ID))
1✔
412
                            .store(butikk)
1✔
413
                            .rekkefolge(results.getInt("favourite_rekkefolge"))
1✔
414
                            .build();
1✔
415
                        favoritter.add(favoritt);
1✔
416
                    }
1✔
417
                }
418
            }
419
        } catch (SQLException e) {
1✔
420
            throw new HandleregException("Failed to retrieve a list of favourites", e);
1✔
421
        }
1✔
422
        return favoritter;
1✔
423
    }
424

425
    @Override
426
    public List<Favoritt> leggTilFavoritt(NyFavoritt nyFavoritt) {
427
        try (var connection = datasource.getConnection()) {
1✔
428
            var sisteRekkefolge = finnSisteRekkefolgeIBrukersFavoritter(connection, nyFavoritt.brukernavn());
1✔
429
            var sql = "insert into favourites (account_id, store_id, rekkefolge) values ((select account_id from accounts where username=?), ?, ?)";
1✔
430
            try (var statement = connection.prepareStatement(sql)) {
1✔
431
                statement.setString(1, nyFavoritt.brukernavn());
1✔
432
                statement.setInt(2, nyFavoritt.butikk().storeId());
1✔
433
                statement.setInt(3, sisteRekkefolge + 1);
1✔
434
                statement.executeUpdate();
1✔
435
            }
436
        } catch (SQLException e) {
1✔
437
            throw new HandleregException("Failed to insert a new favourite", e);
1✔
438
        }
1✔
439
        return finnFavoritter(nyFavoritt.brukernavn());
1✔
440
    }
441

442
    @Override
443
    public List<Favoritt> slettFavoritt(Favoritt skalSlettes) {
444
        try (var connection = datasource.getConnection()) {
1✔
445
            var sql = "delete from favourites where favourite_id=?";
1✔
446
            try (var statement = connection.prepareStatement(sql)) {
1✔
447
                statement.setInt(1, skalSlettes.favouriteid());
1✔
448
                statement.executeUpdate();
1✔
449
            }
450
        } catch (SQLException e) {
1✔
451
            throw new HandleregException("Failed to delete favourite", e);
1✔
452
        }
1✔
453
        return finnFavoritterMedAccountid(skalSlettes.accountid());
1✔
454
    }
455

456
    @Override
457
    public List<Favoritt> byttRekkefolge(Favorittpar parSomSkalBytteRekkfolge) {
458
        try (var connection = datasource.getConnection()) {
1✔
459
            var sql = "update favourites set rekkefolge=? where favourite_id=?";
1✔
460
            try (var flipstatement1 = connection.prepareStatement(sql)) {
1✔
461
                flipstatement1.setInt(1, parSomSkalBytteRekkfolge.andre().rekkefolge());
1✔
462
                flipstatement1.setInt(2, parSomSkalBytteRekkfolge.forste().favouriteid());
1✔
463
                flipstatement1.executeUpdate();
1✔
464
            }
465
            try (var flipstatement2 = connection.prepareStatement(sql)) {
1✔
466
                flipstatement2.setInt(1, parSomSkalBytteRekkfolge.forste().rekkefolge());
1✔
467
                flipstatement2.setInt(2, parSomSkalBytteRekkfolge.andre().favouriteid());
1✔
468
                flipstatement2.executeUpdate();
1✔
469
            }
470
        } catch (SQLException e) {
1✔
471
            throw new HandleregException("Failed to swap order of favourites", e);
1✔
472
        }
1✔
473

474
        return finnFavoritterMedAccountid(parSomSkalBytteRekkfolge.forste().accountid());
1✔
475
    }
476

477
    int finnNesteLedigeRekkefolgeForGruppe(int gruppe) {
478
        var sql = "select rekkefolge from stores where gruppe=? order by rekkefolge desc fetch next 1 rows only";
1✔
479
        try (var connection = datasource.getConnection()) {
1✔
480
            try(var statement = connection.prepareStatement(sql)) {
1✔
481
                statement.setInt(1, gruppe);
1✔
482
                try (var results = statement.executeQuery()) {
1✔
483
                    while(results.next()) {
1✔
484
                        var sortorderValueOfLastStore = results.getInt(REKKEFOLGE);
1✔
485
                        return sortorderValueOfLastStore + 10;
1✔
486
                    }
487
                }
1✔
488
            }
1✔
489
        } catch (SQLException e) {
1✔
490
            var message = String.format("Failed to retrieve the next store sort order value for group %d", gruppe);
1✔
491
            logError(message, e);
1✔
492
            throw new HandleregException(message, e);
1✔
493
        }
1✔
494

495
        return 0;
1✔
496
    }
497

498
    List<Favoritt> finnFavoritterMedAccountid(int accountid) {
499
        var favoritter = new ArrayList<Favoritt>();
1✔
500
        var sql = "select s.store_id, s.store_name, s.gruppe as store_gruppe, s.rekkefolge as store_rekkefolge, f.favourite_id, f.account_id, f.rekkefolge as favourite_rekkefolge from favourites f join stores s on f.store_id=s.store_id where f.account_id=? order by f.rekkefolge";
1✔
501
        try (var connection = datasource.getConnection()) {
1✔
502
            try (var statement = connection.prepareStatement(sql)) {
1✔
503
                statement.setInt(1, accountid);
1✔
504
                try (var results = statement.executeQuery()) {
1✔
505
                    while(results.next()) {
1✔
506
                        var butikk = Butikk.with()
1✔
507
                            .storeId(results.getInt(STORE_ID))
1✔
508
                            .butikknavn(results.getString(STORE_NAME))
1✔
509
                            .gruppe(results.getInt("store_gruppe"))
1✔
510
                            .rekkefolge(results.getInt("store_rekkefolge"))
1✔
511
                            .build();
1✔
512
                        var favoritt = Favoritt.with()
1✔
513
                            .favouriteid(results.getInt("favourite_id"))
1✔
514
                            .accountid(results.getInt(ACCOUNT_ID))
1✔
515
                            .store(butikk)
1✔
516
                            .rekkefolge(results.getInt("favourite_rekkefolge"))
1✔
517
                            .build();
1✔
518
                        favoritter.add(favoritt);
1✔
519
                    }
1✔
520
                }
521
            }
522
        } catch (SQLException e) {
1✔
523
            throw new HandleregException("Failed to retrieve a list of favourites", e);
1✔
524
        }
1✔
525

526
        return favoritter;
1✔
527
    }
528

529
    int finnSisteRekkefolgeIBrukersFavoritter(Connection connection, String brukernavn) {
530
        var sql = "select rekkefolge from accounts a join favourites f on a.account_id=f.account_id where a.username=? order by f.rekkefolge desc";
1✔
531
        try (var statement = connection.prepareStatement(sql)) {
1✔
532
            statement.setString(1, brukernavn);
1✔
533
            try (var results = statement.executeQuery()) {
1✔
534
                while(results.next()) {
1✔
535
                    return results.getInt(REKKEFOLGE);
1✔
536
                }
537
            }
1✔
538
        } catch (SQLException e) {
1✔
539
            logWarning("Failed to retrieve last favourite rekkefolge value", e);
1✔
540
        }
×
541

542
        return 0;
1✔
543
    }
544

545
    private void addRolesIfNotpresent() {
546
        var handleregbruker = HANDLEREGBRUKER_ROLE;
1✔
547
        var roles = useradmin.getRoles();
1✔
548
        var existingRole = roles.stream().filter(r -> handleregbruker.equals(r.rolename())).findFirst();
1✔
549
        if (!existingRole.isPresent()) {
1✔
550
            useradmin.addRole(Role.with().id(-1).rolename(handleregbruker).description("Bruker av applikasjonen handlereg").build());
1✔
551
        }
552
    }
1✔
553

554
    private void logError(String message, SQLException e) {
555
        logger.error(message, e);
1✔
556
    }
1✔
557

558
    private void logWarning(String message, SQLException e) {
559
        logger.warn(message, e);
1✔
560
    }
1✔
561

562
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc