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

GEWIS / sudosos-backend / 25753937432

12 May 2026 09:17AM UTC coverage: 88.117% (-1.0%) from 89.089%
25753937432

push

github

web-flow
chore(deps): fix missing dependencies for running docs:dev (#911)

3925 of 4574 branches covered (85.81%)

Branch coverage included in aggregate %.

20093 of 22683 relevant lines covered (88.58%)

1125.83 hits per line

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

96.4
/src/database/database.ts
1
/**
1✔
2
 *  SudoSOS back-end API service.
3
 *  Copyright (C) 2026 Study association GEWIS
4
 *
5
 *  This program is free software: you can redistribute it and/or modify
6
 *  it under the terms of the GNU Affero General Public License as published
7
 *  by the Free Software Foundation, either version 3 of the License, or
8
 *  (at your option) any later version.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU Affero General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU Affero General Public License
16
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17
 *
18
 *  @license
19
 */
1✔
20

21
/**
1✔
22
 * This is the module page of the database.
23
 *
24
 * @module internal/database
25
 */
1✔
26

27
import {
28
  DataSource,
29
} from 'typeorm';
30
import fs from 'fs';
31
import User from '../entity/user/user';
32
import Product from '../entity/product/product';
33
import SubTransaction from '../entity/transactions/sub-transaction';
34
import Transaction from '../entity/transactions/transaction';
35
import ProductCategory from '../entity/product/product-category';
36
import SubTransactionRow from '../entity/transactions/sub-transaction-row';
37
import PointOfSale from '../entity/point-of-sale/point-of-sale';
38
import Container from '../entity/container/container';
39
import VoucherGroup from '../entity/user/voucher-group';
40
import LocalUser from '../entity/user/local-user';
41
import MemberUser from '../entity/user/member-user';
42
import UserVoucherGroup from '../entity/user/user-voucher-group';
43
import EanAuthenticator from '../entity/authenticator/ean-authenticator';
44
import OrganMembership from '../entity/organ/organ-membership';
45
import NfcAuthenticator from '../entity/authenticator/nfc-authenticator';
46
import PinAuthenticator from '../entity/authenticator/pin-authenticator';
47
import Banner from '../entity/banner';
48
import Transfer from '../entity/transactions/transfer';
49
import ProductRevision from '../entity/product/product-revision';
50
import ContainerRevision from '../entity/container/container-revision';
51
import PointOfSaleRevision from '../entity/point-of-sale/point-of-sale-revision';
52
import ProductOrdering from '../entity/point-of-sale/product-ordering';
53
import Balance from '../entity/transactions/balance';
54
import InvoiceUser from '../entity/user/invoice-user';
55
import Invoice from '../entity/invoices/invoice';
56
import InvoiceStatus from '../entity/invoices/invoice-status';
57
import BaseFile from '../entity/file/base-file';
58
import ProductImage from '../entity/file/product-image';
59
import BannerImage from '../entity/file/banner-image';
60
import StripeDeposit from '../entity/stripe/stripe-deposit';
61
import StripePaymentIntentStatus from '../entity/stripe/stripe-payment-intent-status';
62
import PayoutRequest from '../entity/transactions/payout/payout-request';
63
import PayoutRequestStatus from '../entity/transactions/payout/payout-request-status';
64
import LDAPAuthenticator from '../entity/authenticator/ldap-authenticator';
65
import AssignedRole from '../entity/rbac/assigned-role';
66
import VatGroup from '../entity/vat-group';
67
import LocalAuthenticator from '../entity/authenticator/local-authenticator';
68
import ResetToken from '../entity/authenticator/reset-token';
69
import { DataSourceOptions } from 'typeorm/data-source/DataSourceOptions';
70
import KeyAuthenticator from '../entity/authenticator/key-authenticator';
71
import Fine from '../entity/fine/fine';
72
import FineHandoutEvent from '../entity/fine/fineHandoutEvent';
73
import UserFineGroup from '../entity/fine/userFineGroup';
74
import Event from '../entity/event/event';
75
import EventShiftAnswer from '../entity/event/event-shift-answer';
76
import EventShift from '../entity/event/event-shift';
77
import { TransactionSubscriber, TransferSubscriber } from '../subscriber';
78
import InvoicePdf from '../entity/file/invoice-pdf';
79
import PayoutRequestPdf from '../entity/file/payout-request-pdf';
80
import Role from '../entity/rbac/role';
81
import Permission from '../entity/rbac/permission';
82
import RoleUserType from '../entity/rbac/role-user-type';
83
import WriteOff from '../entity/transactions/write-off';
84
import ServerSetting from '../entity/server-setting';
85
import StripePaymentIntent from '../entity/stripe/stripe-payment-intent';
86
import SellerPayout from '../entity/transactions/payout/seller-payout';
87
import SellerPayoutPdf from '../entity/file/seller-payout-pdf';
88
import { InitialSQLMigration1743601882766 } from '../migrations/1743601882766-initial-database';
89
import WriteOffPdf from '../entity/file/write-off-pdf';
90
import QRAuthenticator from '../entity/authenticator/qr-authenticator';
91
import { QrAuthenticator1743601882766 } from '../migrations/1743601882766-qr-authenticator';
92
import { MemberAuthenticator1761324427011 } from '../migrations/1761324427011-member-authenticator';
93
import { AddOrganMembershipIndex1761328648026 } from '../migrations/1761328648026-add-organ-membership-index';
94
import InactiveAdministrativeCost from '../entity/transactions/inactive-administrative-cost';
95
import {
96
  UserAdministrativeCost1761845457283,
97
} from '../migrations/1761845457283-user-administrative-cost';
98
import NotificationLog from '../entity/notifications/notification-log';
99
import UserNotificationPreference from '../entity/notifications/user-notification-preference';
100
import { RenameGewisToExternal1763399087409 } from '../migrations/1763399087409-rename-gewis-to-external';
101
import { UserNotificationPreference1764615514906 } from '../migrations/1764615514906-user-notification-preference';
102
import Wrapped from '../entity/wrapped';
103
import WrappedOrganMember from '../entity/wrapped/wrapped-organ-member';
104
import { AddWrappedTable1764842063654 } from '../migrations/1764842063654-add-wrapped-table';
105
import { AddWrappedOrganMember1765826596888 } from '../migrations/1765826596888-add-wrapped-organ-member';
106
import UserSetting from '../entity/user-setting';
107
import { UserSetting1768697568707 } from '../migrations/1768697568707-user-setting';
108
import {
109
  RemoveCreditTransferFromInactiveAdministrativeCost1769005123365,
110
} from '../migrations/1769005123365-remove-credit-transfer-from-inactive-administrative-cost';
111
import { AddLastSeenToUser1769000095806 } from '../migrations/1769000095806-add-last-seen-to-user';
112
import Config from '../config';
113

114
function getDataSourceOptions(): DataSourceOptions {
128✔
115
  const config = Config.get();
128✔
116

117
  if (config.app.isTest) {
128✔
118
    console.log('TYPEORM_CONNECTION:', config.database.connection);
128✔
119
  }
128✔
120

121
  const options = {
128✔
122
    host: config.database.host,
128✔
123
    port: config.database.port,
128✔
124
    database: config.database.database,
128✔
125
    type: config.database.connection,
128✔
126
    username: config.database.username,
128✔
127
    password: config.database.password,
128✔
128
    ...(config.database.sslEnabled ? {
128!
129
      ssl: {
×
130
        ca: fs.readFileSync(config.database.sslCaCertsPath),
×
131
      },
×
132
    } : {}),
128✔
133
    synchronize: config.database.synchronize,
128✔
134
    logging: config.database.logging,
128✔
135
    migrations: [
128✔
136
      InitialSQLMigration1743601882766,
128✔
137
      QrAuthenticator1743601882766,
128✔
138
      MemberAuthenticator1761324427011,
128✔
139
      AddOrganMembershipIndex1761328648026,
128✔
140
      UserAdministrativeCost1761845457283,
128✔
141
      RenameGewisToExternal1763399087409,
128✔
142
      UserNotificationPreference1764615514906,
128✔
143
      AddWrappedTable1764842063654,
128✔
144
      AddWrappedOrganMember1765826596888,
128✔
145
      UserSetting1768697568707,
128✔
146
      RemoveCreditTransferFromInactiveAdministrativeCost1769005123365,
128✔
147
      AddLastSeenToUser1769000095806,
128✔
148
    ],
128✔
149
    extra: {
128✔
150
      authPlugins: {
128✔
151
        mysql_clear_password: () => () => Buffer.from(`${config.database.password ?? ''}\0`),
128✔
152
      },
128✔
153
    },
128✔
154
    poolSize: 4,
128✔
155
    entities: [
128✔
156
      ServerSetting,
128✔
157
      ProductCategory,
128✔
158
      VatGroup,
128✔
159
      Product,
128✔
160
      ProductRevision,
128✔
161
      Container,
128✔
162
      ContainerRevision,
128✔
163
      PointOfSale,
128✔
164
      PointOfSaleRevision,
128✔
165
      Transfer,
128✔
166
      InactiveAdministrativeCost,
128✔
167
      StripeDeposit,
128✔
168
      StripePaymentIntent,
128✔
169
      StripePaymentIntentStatus,
128✔
170
      PayoutRequest,
128✔
171
      PayoutRequestPdf,
128✔
172
      PayoutRequestStatus,
128✔
173
      SellerPayout,
128✔
174
      SellerPayoutPdf,
128✔
175
      Fine,
128✔
176
      FineHandoutEvent,
128✔
177
      UserFineGroup,
128✔
178
      Transaction,
128✔
179
      SubTransaction,
128✔
180
      SubTransactionRow,
128✔
181
      VoucherGroup,
128✔
182
      User,
128✔
183
      LocalUser,
128✔
184
      MemberUser,
128✔
185
      UserVoucherGroup,
128✔
186
      EanAuthenticator,
128✔
187
      OrganMembership,
128✔
188
      NfcAuthenticator,
128✔
189
      KeyAuthenticator,
128✔
190
      PinAuthenticator,
128✔
191
      LocalAuthenticator,
128✔
192
      LDAPAuthenticator,
128✔
193
      Banner,
128✔
194
      ProductOrdering,
128✔
195
      Balance,
128✔
196
      InvoiceUser,
128✔
197
      Invoice,
128✔
198
      InvoiceStatus,
128✔
199
      InvoicePdf,
128✔
200
      BaseFile,
128✔
201
      ProductImage,
128✔
202
      BannerImage,
128✔
203
      Role,
128✔
204
      RoleUserType,
128✔
205
      Permission,
128✔
206
      AssignedRole,
128✔
207
      ResetToken,
128✔
208
      Event,
128✔
209
      EventShift,
128✔
210
      EventShiftAnswer,
128✔
211
      Wrapped,
128✔
212
      WrappedOrganMember,
128✔
213
      WriteOff,
128✔
214
      WriteOffPdf,
128✔
215
      QRAuthenticator,
128✔
216
      NotificationLog,
128✔
217
      UserNotificationPreference,
128✔
218
      UserSetting,
128✔
219
    ],
128✔
220
    subscribers: [
128✔
221
      TransactionSubscriber,
128✔
222
      TransferSubscriber,
128✔
223
    ],
224
  };
128✔
225

226
  return options as DataSourceOptions;
128✔
227
}
128✔
228

229
function getBootstrapDataSourceOptions(): DataSourceOptions {
104✔
230
  return {
104✔
231
    type: 'better-sqlite3',
104✔
232
    database: ':memory:',
104✔
233
    synchronize: true,
104✔
234
    logging: false,
104✔
235
    migrations: [],
104✔
236
    entities: [],
104✔
237
    subscribers: [],
104✔
238
  };
104✔
239
}
104✔
240

241
export let AppDataSource = new DataSource(getBootstrapDataSourceOptions());
1✔
242

243
const Database = {
1✔
244
  initialize: async () => {
1✔
245
    if (AppDataSource.isInitialized) return AppDataSource;
128!
246
    AppDataSource = new DataSource(getDataSourceOptions());
128✔
247
    return AppDataSource.initialize();
128✔
248
  },
128✔
249
};
1✔
250

251
export default Database;
1✔
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