vuer_oss Data Model (Sequelize)
The system-of-record schema for FaceKom lives in vuer_oss. It is defined with Sequelize over PostgreSQL (pg/pg-hstore). There are 61 model files in server/db/model/, each a (sequelize, DataTypes) => Model factory. A single aggregator file, server/db/models.js, requires all 61, wires every association centrally, and returns the model registry. This is the single-models-file pattern — see the gotcha below.
Related siblings: vuer_oss · architecture-overview · vuer_css (the customer-side node; shares codebase shape but OSS owns the DB).
1. ORM, versions, drivers (from manifests)
| Aspect | Value | Source |
|---|---|---|
| ORM | Sequelize — forked: "sequelize": "npm:@techteamer/sequelize@^6.30.1" | package.json |
| Resolved fork version | @techteamer/sequelize 6.32.2 | yarn.lock (sequelize@npm:@techteamer/sequelize@^6.30.1 → version "6.32.2") |
| CLI | sequelize-cli@^6.6.0 | package.json |
| Programmatic migrations | umzug@^3.8.2 (used by bin/db/migrate-data; server/db/migrationHelpers.js) | package.json |
| Primary DB driver | pg@^8.0.2 + pg-hstore@^2.3.2 → PostgreSQL | package.json |
| Session store | connect-session-sequelize@^8.0.3 (persists Express sessions in the DB Session table) | package.json |
| Other dialects (README opt-in) | OracleDB / MySQL (mysql2) / MSSQL (tedious) — alternates documented; Postgres is the shipped default | README.md, vuer_oss |
sequelizeis the@techteamer/sequelizefork, not upstream npm. The import isrequire('sequelize')everywhere, but it resolves to the fork (package.jsonaliases the package name). Pinned range^6.30.1, actually resolved6.32.2. Treat behavior as Sequelize v6, with fork patches.
Connection (server/db/sequelize.js, 117 lines)
- Builds one shared
Sequelizeinstance fromconfig.db. Ifdb.databaseis set →new Sequelize(database, username, password, options); else backward-compatnew Sequelize(db.url, options)(sequelize.js:27-33). - Default pool
max: 100, merged withconfig.get('db.options')(sequelize.js:17-23). - SQL logging only when
NODE_ENV === 'dev'→logger.channels.sql.info(sequelize.js:5). - Global hooks:
beforeFind/beforeCountstripundefinedkeys fromwhere(a v6 behavior shim — undefined is no longer coerced to null;sequelize.js:36-58). - A 5 s
setIntervalpublishes pool stats toserviceContainer.diagnostic.sequelizeStatsand logs POOL WARNING/ERROR at >0.4 / >0.6 usage (sequelize.js:60-95). SIGUSR1/SIGUSR2dump/force-release pooled connections (debug;sequelize.js:100-115).- Module exports the singleton
sequelize.
Model definition pattern (per file)
Every server/db/model/*.js exports (sequelize, DataTypes) => { const M = sequelize.define('<name>', { ...attributes }, { indexes, [tableName] }); ... return M }. Models define attributes, indexes, instance/class methods, getters/setters and hooks — but NOT associations (those are centralized in models.js). Common conventions seen across models:
M.getModelDescription()— human label (e.g. Room →'Videochat rooms', Setting →'Settings, for example: hologram detection limits').M.prototype.toFrontendSync()— serializer (epoch-second timestamps) used to ship rows to the UI.- JSON columns stored as
TEXTwithget/setthatJSON.parse/stringifyand, where encryption is enabled, transparently decrypt/encrypt (e.g.room.data,customer.data,flow.metadata,setting.value). - Conditional indexes: several models skip FK indexes on MySQL (
if (sequelize.dialect.name !== 'mysql')) to avoid duplicate indexes (flow.js:17,encryption.js:6).
2. The single-models-file (server/db/models.js, 408 lines)
All associations live in one 408-line file, not in the model files.
server/db/models.jsrequires every one of the 61 model factories, calls each with(sequelize, DataTypes), then declares everyhasMany/belongsTo/addScopefor the whole schema in its body, andreturns the model registry object. The individualserver/db/model/*.jsfiles contain attributes + methods only and have no knowledge of their relationships. To understand any entity's graph you must readmodels.js, not the model file.
How it is wired:
- Loaded via
require('../../db/models')(sequelize)and assigned toserviceContainer.dbModelsin three places:server/bootstrap/connection/db.js:13(the normal boot path —setupDb()),server/backgroundProcess/workers/report.worker.js:30,server/service/ImportService.js:263(assigns toserviceContainer.importDbModels, against a second connectionthis.originConnection— used to read a legacy/import DB with the same schema).
- The factory returns a flat object of all 61 models (keys like
Room,SelfServiceRoom,Customer,Flow, …). Verified: all 61 model files are required, and all 61 are returned (1:1, no orphans). - Named scopes are defined here too, e.g.
Flow.withTasks/withCustomer/withRoom/withUsers,FlowProto.withTasks/withTranslations/withActivityLog,Document.withFile,FaceComparison.withRecognitions,CustomerDataChange.withUser,SelfServiceRoom.withCustomer,User.withCerts,Cert.withUser(models.js:119-331).
Useris frequently associated.unscoped()(e.g. allFlow.belongsTo(User.unscoped(), { as: ... }),FlowActivity,UserActivity,ClientErrorLog).Userhas adefaultScope(see §5) that hides disabled users (where: { isEnabled: true }only — no sensitive-field exclusion);.unscoped()bypasses it so audit/flow joins still resolve disabled operators.
3. Entities / tables (61)
Each model define()s a name; Sequelize derives the table name from that name (v6 default pluralization — no global freezeTableName/underscored was found in server/db/**, config/**, or .sequelize-config.js). The only explicit tableName override is session.js → tableName: 'Session'.
Three different identifiers per entity — the file name, the
models.jsconst, and thesequelize.define(...)name often diverge. Examples where they differ:feedback.jsdefinesfeedbackAnswer;cert.js→certs;setting.js→settings;backgroundProcess.js→backgroundProcesses;backgroundProcessLog.js→backgroundProcessLogs;customerdatachange.js→customerDataChange;customerhistory.js→customerHistory;customervalidation.js→customerValidation;flowProtoActivity.js→flowprotoactivity;passwordhistory.js→passwordHistory;systemDocument.js→systemdocument;totpKey.js→totpKeys;userActivity.js→userActivities;webAuthnCredential.js→webAuthnCredentials. When mapping a DB table, go by thedefine()name (column 2 below), not the filename.
File (server/db/model/) | define() name | models.js const | Domain area |
|---|---|---|---|
room.js | room | Room | Videochat room (system core) |
selfserviceroom.js | selfServiceRoom | SelfServiceRoom | Self-service (unattended) session |
customer.js | customer | Customer | End-user being identified |
user.js | user | User | Operator/admin account |
cert.js | certs | Cert | User signing certificate |
activity.js | activity | Activity | Room/self-service activity log |
customerhistory.js | customerHistory | CustomerHistory | Customer change history |
customervalidation.js | customerValidation | CustomerValidation | Customer data validation record |
customerdatachange.js | customerDataChange | CustomerDataChange | Customer data-change audit |
attachment.js | attachment | Attachment | Stored file/screenshot blob ref |
mediafile.js | mediafile | MediaFile | Recorded/converted media file |
encryption.js | encryption | Encryption | Per-record AES key metadata |
recognitionattempt.js | recognitionattempt | RecognitionAttempt | Face-recognition attempt |
document.js | document | Document | Document record |
documentVersion.js | documentVersion | DocumentVersion | Document version |
download.js | download | Download | Export/download artifact |
feedback.js | feedbackAnswer | Feedback | Customer feedback answer |
openhourstandard.js | openhourstandard | OpenHourStandard | Weekly opening hours (7 rows) |
openhourexception.js | openhourexception | OpenHourException | Opening-hour exception/holiday |
emaillog.js | emaillog | EmailLog | Sent-email log |
smslog.js | smslog | SmsLog | Sent-SMS log |
auditlog.js | auditlog | AuditLog | Admin/security audit log |
callbackrequest.js | callbackrequest | CallbackRequest | Customer callback request |
callbackRequestActivity.js | callbackRequestActivity | CallbackRequestActivity | Callback request activity |
communicationlog.js | communicationlog | CommunicationLog | Comms log (room/self-service) |
clienterrorlog.js | clienterrorlog | ClientErrorLog | Browser/client error log |
shortener.js | shortener | Shortener | URL shortener entries |
timestampToken.js | timestampToken | TimestampToken | RFC3161 trusted-timestamp token |
setting.js | settings | Setting | Key/value system settings |
oneTimeLogin.js | oneTimeLogin | OneTimeLogin | One-time login token |
job.js | job | Job | Background/identification job |
backgroundProcess.js | backgroundProcesses | BackgroundProcess | Long-running process record |
backgroundProcessLog.js | backgroundProcessLogs | BackgroundProcessLog | Background-process log line |
flow.js | flow | Flow | KYC flow instance |
flowproto.js | flowProto | FlowProto | Flow definition/prototype |
task.js | task | Task | Flow task instance |
taskproto.js | taskProto | TaskProto | Task definition/prototype |
flowactivity.js | flowactivity | FlowActivity | Flow activity log |
flowscope.js | flowScope | FlowScope | Flow scope |
flowresult.js | flowResult | FlowResult | Flow result |
flowTranslation.js | flowTranslation | FlowTranslation | Flow proto translation |
flowProtoActivity.js | flowprotoactivity | FlowProtoActivity | Flow-proto edit activity |
faceRecognition.js | faceRecognition | FaceRecognition | Face-recognition result |
faceComparison.js | faceComparison | FaceComparison | Face-comparison (1:1) result |
storage.js | storage | Storage | Storage-engine placement record |
emrtdInfo.js | emrtdInfo | EmrtdInfo | eMRTD (passport chip) data |
passwordhistory.js | passwordHistory | PasswordHistory | User password history |
userActivity.js | userActivities | UserActivity | User activity audit |
systemDocument.js | systemdocument | SystemDocument | System document |
webAuthnCredential.js | webAuthnCredentials | WebAuthnCredential | WebAuthn/FIDO2 credential |
totpKey.js | totpKeys | TotpKey | TOTP secret |
integrationLog.js | integrationLog | IntegrationLog | Encrypted external-integration log |
janusevent.js | janusevent | JanusEvent | Janus/WebRTC event log |
session.js | Session (tableName: 'Session') | Session | Express login session |
partner.js | partner | Partner | Partner |
partnerService.js | partnerService | PartnerService | Partner service |
partnerServiceRequest.js | partnerServiceRequest | PartnerServiceRequest | Partner service request |
importedCustomer.js | importedCustomer | ImportedCustomer | Migrated/imported customer |
importedRoom.js | importedRoom | ImportedRoom | Migrated/imported room |
importedFlow.js | importedFlow | ImportedFlow | Migrated/imported flow |
importedFlowTranslation.js | importedFlowTranslation | ImportedFlowTranslation | Imported flow translation |
feedback.js→ table-namefeedbackAnsweris the sharpest filename/table mismatch; the registry key staysFeedback. Searching the DB for afeedbacktable will fail.
4. Key relationships (all from models.js)
System-of-record hubs
Customeris the central party.Customer hasMany Room,SelfServiceRoom,CustomerHistory,CallbackRequest,EmailLog,SmsLog,Document,Encryption,Download,ClientErrorLog,PartnerServiceRequest(models.js:74-336).RoombelongsTo CustomerandbelongsTo User;User hasMany Room.Room hasMany Activity, Feedback, CommunicationLog, ClientErrorLog, Encryption, Document, MediaFile, EmrtdInfo, Storage(models.js:74-323).SelfServiceRoombelongsTo Customer; mirrors Room’shasManyset (Activity, Feedback, CommunicationLog, ClientErrorLog, Encryption, Document, MediaFile, EmrtdInfo, Storage). ScopewithCustomer(models.js:80-331).UserhasMany Room, EmailLog, SmsLog, Cert, Download, ClientErrorLog, PasswordHistory, WebAuthnCredential, TotpKey;Cert belongsTo User(models.js:74-343).
Activity / audit
Activity belongsTo Room, SelfServiceRoom, User, Customer, plus a secondCustomeraliasencryptionCustomer(models.js:81-85).AuditLog belongsTo UserandbelongsTo User as 'targetUser'(models.js:94-95).UserActivity belongsTo User.unscoped(),User.unscoped() as 'targetUser',Customer(models.js:327-329).CustomerDataChange belongsTo Customer, Room, SelfServiceRoom, User+ scopewithUser(models.js:115-119).
Flow engine (proto vs instance)
- Definition side:
FlowProto hasMany TaskProto(as tasks), FlowScope(as scopes), FlowResult(as results), FlowTranslation(as translations), FlowProtoActivity(as activities);FlowProto belongsTo User.unscoped() (fk editingBy);TaskProto belongsTo FlowProto(models.js:200-223). - Instance side:
Flow belongsTo FlowProto, Customer, Room, SelfServiceRoom, Flow(as parentFlow), and fourUser.unscoped()rolescreatedBy/startedBy/updatedBy/finishedBy;Flow hasMany Task.Task belongsTo Flow (constraints:false), TaskProto, User.unscoped()(as updatedBy)(models.js:173-198). FlowActivity belongsTo User.unscoped(), Flow, Task, Room, SelfServiceRoom.FlowTranslation belongsTo FlowProto.FlowProtoActivity belongsTo FlowProto, User.unscoped().Document belongsTo Flow(models.js:225-236).
Biometrics
FaceRecognition belongsTo Attachment(as sourceAttachment), Attachment(as resultAttachment), Room, SelfServiceRoom, Customer, User(models.js:291-296).FaceComparison belongsTo FaceRecognition(as recognitionFrom), FaceRecognition(as recognitionTo), Room, SelfServiceRoom, Customer, User; scopewithRecognitions(models.js:298-309).RecognitionAttempt belongsTo Attachment, User, Room, SelfServiceRoom, Customer(models.js:243-247).EmrtdInfo belongsTo Customer, Room, SelfServiceRoom(models.js:319-323).
Crypto / media / storage
Encryptionis referenced fromCustomer/Room/SelfServiceRoom/ImportedRoom/ImportedCustomer (hasMany)and joined byAttachment/MediaFile/IntegrationLog/Document(withFile scope) (belongsTo)(models.js:138-241).Attachment belongsTo TimestampToken, Encryption;MediaFile belongsTo TimestampToken, Encryption, Room, ImportedRoom, SelfServiceRoom(models.js:126-171).Storage belongsTo Room, SelfServiceRoom, Attachment, Flow;Room/SelfServiceRoom/Flow hasMany Storage(models.js:311-317).Document belongsTo Customer, Room, SelfServiceRoom, Attachment, Flow+ scopewithFile(includes Attachment → Encryption).DocumentVersion belongsTo Document, Attachment(models.js:142-158).
Background processing
BackgroundProcess belongsToa wide fan-out:User, Customer, Room, SelfServiceRoom, Flow, Task, Attachment, Document, MediaFile, Partner, PartnerService, PartnerServiceRequest, Cert, Download, EmrtdInfo, ImportedRoom;BackgroundProcess hasMany BackgroundProcessLog(models.js:263-280).
Partner
Partner hasMany PartnerService;PartnerService belongsTo Partner,hasMany PartnerServiceRequest;PartnerServiceRequest belongsTo PartnerService, Customer;Customer hasMany PartnerServiceRequest(models.js:282-287).
Imported (data migration)
ImportedRoom belongsTo ImportedCustomer,hasMany Encryption;ImportedCustomer hasMany Encryption, ImportedRoom;ImportedFlow belongsTo ImportedCustomer, ImportedRoom(models.js:333-339).
Misc
IntegrationLog belongsTo Customer, Encryption, Room, SelfServiceRoom(models.js:238-241).OneTimeLogin belongsTo User;Job belongsTo User(models.js:249-251).Feedback belongsTo Customer, Room, SelfServiceRoom(models.js:86-88).EmailLog/SmsLog/CallbackRequest/CommunicationLog/ClientErrorLogall hang offCustomerand/orRoom/SelfServiceRoom(models.js:89-136).
5. Notable attribute details (sampled)
room(room.js):status(default'waiting'; validated againstallStatuses = waiting|incall|closed|deleted|archived),closedAt,roomCodec(defaultvp8;vp8|vp9|h264),roomCodecContainer(mkv|mp4|webm),closedInitiator(operator|customer|supervisor|admin),convertState(queued|processing|done|errored),deleteReasonSTRING(255),dataTEXT (transparent JSON + optional AES viacryptos.data),encryptionKeySTRING(44). Indexes[userId,status],[customerId,status],[status]. Hooks:beforeSaveensures an encryption key when crypto enabled;afterSaveemitsroom:updated. Methodsclose(),isDeletable(),isEncrypted(),toFrontendSync(),toCustomerSync().customer(customer.js):ipSTRING(45),userAgentTEXT,locale(defaultconfig.locales.default),token,dataTEXT (transparent JSON + crypto, callsupdatePortalData),keySTRING(44),deleteReasonSTRING(255), andsearchField1…searchField9+ (hashed/searchable surrogate columns — populated bybin/db/customer-index.jsre-indexing). Requirescustomization/portal/PortalDataandua-parser-js.selfServiceRoom(selfserviceroom.js):status,serviceProgress,data(transparent JSON/crypto),closedAt,expireAt,roomCodec,roomCodecContainer,convertState,deleteReason,encryptionKey.flow(flow.js):status(created|in-progress|on-hold|finished|aborted, defaultcreated),finishedTaskCount,startedAt/finishedAt/lastUpdatedAt,result,name(validated againstconfig.flow.flows),version(default 1),taskCount(NOT NULL),isArchived,cleared,metadataTEXT (JSON). Index onresultand[roomId,name,status](+ FK indexes off-MySQL).user(user.js):username,email,phone,rights,data,searchField1…searchField8,isEnabled,firstName,lastName,password,passwordExpiry.defaultScopeis{ where: { isEnabled: true } }only — it hides disabled users and does not exclude any sensitive fields (user.js:157-161). Additional named scopes come fromcustomization/user/UserScopes.getScopes(). ThisdefaultScopeis whyUser.unscoped()is pervasive in associations.encryption(encryption.js):algorithm(NOT NULL),versionINT (default 1),keySTRING(44) (getter resolves actual key viacryptos.data.getActualKey),aadTEXT,chunkSize/chunkCountINT,dataIsArchivedBOOL. FK indexes oncustomerId/roomId/selfServiceRoomId(skipped on MySQL).settings(setting.js):key(unique, NOT NULL),valueTEXT (transparent JSON). Stores e.g. hologram/face-comparison thresholds (cf.bin/self_service_settings_db_checker).Session(session.js):sidSTRING(36) PK,expiresDATE,dataTEXT,tableName: 'Session'. Copied fromconnect-session-sequelize’s internal model so thatsyncOnStartcreates it; file header warns to keep it in sync with the upstream module.
Non-DB "models" exist too.
server/model/holds 12 plain domain classes (OperatorRoomData,RoomSettings,ReplayData,ScreenshotLog,CustomerEnvData,CustomerRoomData,GirinfoCheckData,SelfServiceChecksData,SelfServiceOperatorRoomData[V2],SelfServiceReplayData,SelfServiceRoomData) — these are not Sequelize tables;server/db/helpers.js:3-6requires several of them. Don't confuseserver/model/(domain objects) withserver/db/model/(the 61 ORM entities).
6. Migrations
Models and migrations are separate trees, both under version control.
- Two migration directories (
db/):db/migrate/— the main migration set, 127.jsfiles (git ls-tree devel:db/migrate | grep '\.js$' | wc -l; the dir holds only.jsmigrations). Naming isYYYYMMDDHHMMSS-<desc>.js. Range observed (valid timestamps only):20170625…→20260110150200-index-feedback-indexes.js. One filename is malformed:201090911093344-add-meta-to-otl.jshas a 15-digit prefix (201090911093344), not a valid 14-digitYYYYMMDDHHMMSS— it sorts above20170625…but is not the real lower bound. It is still counted in the 127. Path set by.sequelizerc→migrations-path: db/migrate.db/beforeMigrate/— a pre-migration set (≈25 files, index/search-field setup) run first via a separate rc,.sequelizercBefore→migrations-path: db/beforeMigrate.
- Config for both:
.sequelizercand.sequelizercBeforeboth pointconfig→.sequelize-config.jsandmodels-path→server/db/model..sequelize-config.jsreadsdb.{database|url, username, password, options.dialect}fromconfig, throwsSequelize misconfiguration error!unless exactly one ofdb.database/db.urlis set, and requiresdb.options.dialectwhen usingdb.database. - Boot-time execution order (
server/bootstrap/connection/db.js:16-28, only whensetupDb(initDb=true)— i.e.server.jsonly, withdb.syncOnStarttrue):sequelize db:migrate --options-path=.sequelizercBefore(rundb/beforeMigrate/),./bin/db/sync(sequelize.sync()),sequelize db:migrate(rundb/migrate/),dbHelpers.checkStandardDays()(seed the 7OpenHourStandardrows). Ifdb.syncOnStartis false, onlycheckStandardDays()runs.
- Umzug (
umzug@^3.8.2) backs programmatic data migrations:server/db/migrationHelpers.jsandbin/db/migrate-data(storage indb/beforeMigrate);bin/db/migrate-rdbms.jsmigrates between two RDBMS URLs runningsequelize db:migratewith.sequelizercBeforethen default. (See vuer_oss §“bin/db”.)
Only
server.jsmigrates/syncs the DB.setupDbruns migrations solely when called withinitDb=true, which happens only fromserver.js. The other daemons (media.js,convert.js,cron.js,background.js,storage.js,integrationLog.js) connect read/write against an already-migrated schema. Withdb.syncOnStarttrue, boot mutates schema (runssequelize.sync()+ both migration sets).
7. Verified gotchas (data model)
Single models file. Associations + scopes for all 61 entities are centralized in
server/db/models.js(408 lines), not in the per-entity files. The model files are attributes/methods only. Edit/read associations there.
Forked ORM.
sequelizeresolves to@techteamer/sequelize@6.32.2(range^6.30.1), not upstreamsequelize. Behavior is Sequelize v6 + fork patches;server/db/sequelize.jsadds awhere-undefined-stripping shim because v6 stopped coercingundefined→null.
Filename ≠ table name. Go by the
sequelize.define(...)name (often pluralized/camelCased) — e.g.feedback.js→feedbackAnswer,cert.js→certs,setting.js→settings. OnlySessionsets an explicittableName. No globalfreezeTableName/underscoredis configured, so Sequelize default pluralization applies.
Transparent at-rest encryption is baked into model getters/setters (
room.data,customer.data,flow.metadata,setting.value,encryption.key) viaserviceContainer.service.cryptos.dataandCryptoService.isEnabledFor([...]). Reading these columns raw in SQL yields ciphertext when encryption is on; theEncryptiontable +encryptionKey/keySTRING(44) columns hold per-record key material.
User.unscoped()everywhere in associations bypassesUser.defaultScope({ where: { isEnabled: true } }— disabled-user filter only, no field exclusion) so audit/flow/activity joins still surface disabled operators.
A second model graph for imports.
ImportServicebuildsrequire('../db/models')(originConnection)against a separate legacy DB connection (serviceContainer.importDbModels) — same 61-entity schema, different connection.
Unverified / gaps
- Read in full:
server/db/models.js,server/db/sequelize.js,server/bootstrap/connection/db.js,.sequelizerc,.sequelizercBefore,.sequelize-config.js, and the model filesroom.js,customer.js(head),selfserviceroom.js(headers),flow.js,user.js(headers),setting.js,session.js,encryption.js,auditlog.js(headers). The remaining ~50 model files were enumerated fordefine()name +tableName(via grep) but not read line-by-line — their full column lists, validators, hooks and methods were not transcribed. - Exact DB column types/lengths beyond the sampled models are not enumerated here; authoritative source is each
server/db/model/*.jsplus the 127db/migrate/files (not all read). - Precise count of
db/beforeMigrate/(listed ≈25; not exhaustively counted) — the directory listing shown was truncated by the tool; onlydb/migrate/was counted exactly (127). - Default vs. partner-overridden schema:
customization/*branches may add/alter models and migrations (see customization-architecture); this doc reflectsdevelcore only.
Sources
Read via git show devel:<path> / git ls-tree devel:<path> on /Users/levander/coding/facekom/vuer_oss:
server/db/models.js(408 lines, full),server/db/sequelize.js(117 lines, full),server/db/helpers.js(head),server/db/migrationHelpers.js(counted).server/db/model/—git ls-tree(61 files); read:room.js,customer.js(head),selfserviceroom.js(headers),flow.js,user.js(headers),setting.js,session.js,encryption.js,auditlog.js(headers); greppeddefine()name +tableNameacross all 61.server/model/—git ls-tree(12 non-DB domain models).server/bootstrap/connection/db.js(full),server/backgroundProcess/workers/report.worker.js:30(grep),server/service/ImportService.js:263(grep)..sequelizerc,.sequelizercBefore,.sequelize-config.js(full).db/—git ls-treeofdb,db/migrate(127.js),db/beforeMigrate(sample).package.json(sequelize/pg/umzug/connect-session-sequelize deps),yarn.lock(@techteamer/sequelizeresolved6.32.2).- Cross-checked against existing vuer_oss doc; independently verified each claim against source.