├── .git-blame-ignore-revs
├── .github
├── release-drafter.yml
├── renovate.json
└── workflows
│ ├── auto-approve.yml
│ ├── ci-docs.yml
│ ├── ci.yml
│ ├── release-drafter.yml
│ ├── release-nightly.yml
│ ├── release.yml
│ ├── stale.yml
│ └── website.yml
├── .gitignore
├── .mergify.yml
├── .projectile
├── .redocly.lint-ignore.yaml
├── .scala-steward.conf
├── .scalafix.conf
├── .scalafmt.conf
├── Changelog.md
├── Contributing.md
├── LICENSE.txt
├── NOTICE.txt
├── README.md
├── artwork
├── logo-400.png
├── logo-48.png
├── logo-96.png
├── logo-mc-400.png
├── logo-mc-96.png
├── logo-only-36.svg
├── logo-only-mc.svg
├── logo-only.svg
├── make-png.sh
└── poster.svg
├── build.sbt
├── flake.lock
├── flake.nix
├── modules
├── addonlib
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── addons
│ │ │ ├── AddonArchive.scala
│ │ │ ├── AddonExecutionResult.scala
│ │ │ ├── AddonExecutor.scala
│ │ │ ├── AddonExecutorConfig.scala
│ │ │ ├── AddonLoggerExtension.scala
│ │ │ ├── AddonMeta.scala
│ │ │ ├── AddonRef.scala
│ │ │ ├── AddonResult.scala
│ │ │ ├── AddonRunner.scala
│ │ │ ├── AddonTriggerType.scala
│ │ │ ├── Context.scala
│ │ │ ├── InputEnv.scala
│ │ │ ├── Middleware.scala
│ │ │ ├── RunnerType.scala
│ │ │ ├── out
│ │ │ ├── AddonOutput.scala
│ │ │ ├── ItemFile.scala
│ │ │ ├── NewFile.scala
│ │ │ └── NewItem.scala
│ │ │ ├── package.scala
│ │ │ └── runner
│ │ │ ├── CollectOut.scala
│ │ │ ├── DockerBuilder.scala
│ │ │ ├── DockerRunner.scala
│ │ │ ├── NSpawnBuilder.scala
│ │ │ ├── NixFlakeRunner.scala
│ │ │ ├── RunnerUtil.scala
│ │ │ └── TrivialRunner.scala
│ │ └── test
│ │ ├── resources
│ │ ├── docspell-addon-single-file.zip
│ │ ├── docspell-dummy-addon-master.zip
│ │ └── minimal-addon.zip
│ │ └── scala
│ │ └── docspell
│ │ └── addons
│ │ ├── AddonArchiveTest.scala
│ │ ├── AddonExecutorTest.scala
│ │ ├── AddonGenerator.scala
│ │ ├── AddonMetaTest.scala
│ │ ├── AddonOutputTest.scala
│ │ ├── AddonRunnerTest.scala
│ │ └── Fixtures.scala
├── analysis
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── analysis
│ │ │ ├── NlpSettings.scala
│ │ │ ├── TextAnalyser.scala
│ │ │ ├── TextAnalysisConfig.scala
│ │ │ ├── classifier
│ │ │ ├── ClassifierModel.scala
│ │ │ ├── StanfordTextClassifier.scala
│ │ │ ├── TextClassifier.scala
│ │ │ └── TextClassifierConfig.scala
│ │ │ ├── contact
│ │ │ ├── Contact.scala
│ │ │ ├── Domain.scala
│ │ │ └── Tld.scala
│ │ │ ├── date
│ │ │ ├── DateFind.scala
│ │ │ └── MonthName.scala
│ │ │ ├── nlp
│ │ │ ├── Annotator.scala
│ │ │ ├── BasicCRFAnnotator.scala
│ │ │ ├── LabelConverter.scala
│ │ │ ├── PipelineCache.scala
│ │ │ ├── Properties.scala
│ │ │ ├── StanfordNerAnnotator.scala
│ │ │ └── StanfordNerSettings.scala
│ │ │ └── split
│ │ │ ├── TextSplitter.scala
│ │ │ └── Word.scala
│ │ └── test
│ │ ├── resources
│ │ └── test.ser.gz
│ │ └── scala
│ │ └── docspell
│ │ └── analysis
│ │ ├── Env.scala
│ │ ├── classifier
│ │ └── StanfordTextClassifierSuite.scala
│ │ ├── contact
│ │ └── ContactAnnotateSpec.scala
│ │ ├── date
│ │ └── DateFindTest.scala
│ │ ├── nlp
│ │ ├── BaseCRFAnnotatorSuite.scala
│ │ └── StanfordNerAnnotatorSuite.scala
│ │ └── split
│ │ └── TestSplitterSpec.scala
├── backend
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── backend
│ │ │ ├── AttachedEvent.scala
│ │ │ ├── BackendApp.scala
│ │ │ ├── BackendCommands.scala
│ │ │ ├── Common.scala
│ │ │ ├── Config.scala
│ │ │ ├── JobFactory.scala
│ │ │ ├── MailAddressCodec.scala
│ │ │ ├── PasswordCrypt.scala
│ │ │ ├── auth
│ │ │ ├── AuthToken.scala
│ │ │ ├── Login.scala
│ │ │ ├── RememberToken.scala
│ │ │ ├── ShareToken.scala
│ │ │ └── TokenUtil.scala
│ │ │ ├── codec
│ │ │ └── ItemQueryCodec.scala
│ │ │ ├── fulltext
│ │ │ └── CreateIndex.scala
│ │ │ ├── item
│ │ │ └── Merge.scala
│ │ │ ├── joex
│ │ │ ├── AddonEnvConfig.scala
│ │ │ ├── AddonOps.scala
│ │ │ ├── AddonPostProcess.scala
│ │ │ ├── AddonPrepare.scala
│ │ │ ├── FindJobOwnerAccount.scala
│ │ │ └── LoggerExtension.scala
│ │ │ ├── msg
│ │ │ └── Topics.scala
│ │ │ ├── ops
│ │ │ ├── AddonRunConfigError.scala
│ │ │ ├── AddonRunConfigValidate.scala
│ │ │ ├── AddonValidate.scala
│ │ │ ├── AddonValidationError.scala
│ │ │ ├── OAddons.scala
│ │ │ ├── OAttachment.scala
│ │ │ ├── OClientSettings.scala
│ │ │ ├── OCollective.scala
│ │ │ ├── OCustomFields.scala
│ │ │ ├── ODownloadAll.scala
│ │ │ ├── OEquipment.scala
│ │ │ ├── OFileRepository.scala
│ │ │ ├── OFolder.scala
│ │ │ ├── OFulltext.scala
│ │ │ ├── OItem.scala
│ │ │ ├── OItemLink.scala
│ │ │ ├── OItemSearch.scala
│ │ │ ├── OJob.scala
│ │ │ ├── OJoex.scala
│ │ │ ├── OMail.scala
│ │ │ ├── ONode.scala
│ │ │ ├── ONotification.scala
│ │ │ ├── OOrganization.scala
│ │ │ ├── OQueryBookmarks.scala
│ │ │ ├── OShare.scala
│ │ │ ├── OSource.scala
│ │ │ ├── OTag.scala
│ │ │ ├── OTotp.scala
│ │ │ ├── OUpload.scala
│ │ │ ├── OUserTask.scala
│ │ │ ├── WildcardString.scala
│ │ │ └── search
│ │ │ │ ├── OSearch.scala
│ │ │ │ └── QueryParseResult.scala
│ │ │ ├── signup
│ │ │ ├── Config.scala
│ │ │ ├── ExternalAccount.scala
│ │ │ ├── NewInviteResult.scala
│ │ │ ├── OSignup.scala
│ │ │ ├── RegisterData.scala
│ │ │ └── SignupResult.scala
│ │ │ └── task
│ │ │ └── DownloadZipArgs.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── backend
│ │ └── auth
│ │ └── AuthTokenTest.scala
├── common
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── common
│ │ │ ├── AccountId.scala
│ │ │ ├── AccountInfo.scala
│ │ │ ├── AccountSource.scala
│ │ │ ├── AllPreviewsArgs.scala
│ │ │ ├── Banner.scala
│ │ │ ├── BaseJsonCodecs.scala
│ │ │ ├── Binary.scala
│ │ │ ├── ByteSize.scala
│ │ │ ├── CollectiveId.scala
│ │ │ ├── CollectiveState.scala
│ │ │ ├── ContactKind.scala
│ │ │ ├── ConvertAllPdfArgs.scala
│ │ │ ├── CustomFieldType.scala
│ │ │ ├── DataType.scala
│ │ │ ├── Direction.scala
│ │ │ ├── DocspellSystem.scala
│ │ │ ├── DownloadAllType.scala
│ │ │ ├── DownloadState.scala
│ │ │ ├── Duration.scala
│ │ │ ├── EmptyTrashArgs.scala
│ │ │ ├── EnvMode.scala
│ │ │ ├── EquipmentUse.scala
│ │ │ ├── FileCategory.scala
│ │ │ ├── FileCopyTaskArgs.scala
│ │ │ ├── FileIntegrityCheckArgs.scala
│ │ │ ├── FileKey.scala
│ │ │ ├── FileKeyPart.scala
│ │ │ ├── FileName.scala
│ │ │ ├── FileStoreConfig.scala
│ │ │ ├── FileStoreType.scala
│ │ │ ├── Glob.scala
│ │ │ ├── Hash.scala
│ │ │ ├── IdRef.scala
│ │ │ ├── Ident.scala
│ │ │ ├── ItemAddonTaskArgs.scala
│ │ │ ├── ItemQueryString.scala
│ │ │ ├── ItemState.scala
│ │ │ ├── JobState.scala
│ │ │ ├── JvmInfo.scala
│ │ │ ├── Language.scala
│ │ │ ├── LearnClassifierArgs.scala
│ │ │ ├── LenientUri.scala
│ │ │ ├── ListType.scala
│ │ │ ├── LogLevel.scala
│ │ │ ├── MailSendConfig.scala
│ │ │ ├── MakePageCountArgs.scala
│ │ │ ├── MakePreviewArgs.scala
│ │ │ ├── MetaProposal.scala
│ │ │ ├── MetaProposalList.scala
│ │ │ ├── MetaProposalType.scala
│ │ │ ├── MimeType.scala
│ │ │ ├── MimeTypeHint.scala
│ │ │ ├── NerDateLabel.scala
│ │ │ ├── NerLabel.scala
│ │ │ ├── NerLabelSpan.scala
│ │ │ ├── NerTag.scala
│ │ │ ├── NlpMode.scala
│ │ │ ├── NodeType.scala
│ │ │ ├── OrgUse.scala
│ │ │ ├── Password.scala
│ │ │ ├── PersonRef.scala
│ │ │ ├── PersonUse.scala
│ │ │ ├── Pools.scala
│ │ │ ├── Priority.scala
│ │ │ ├── ProcessItemArgs.scala
│ │ │ ├── ReIndexTaskArgs.scala
│ │ │ ├── ReProcessItemArgs.scala
│ │ │ ├── ScanMailboxArgs.scala
│ │ │ ├── ScheduledAddonTaskArgs.scala
│ │ │ ├── SearchMode.scala
│ │ │ ├── TaskArguments.scala
│ │ │ ├── ThreadFactories.scala
│ │ │ ├── Timestamp.scala
│ │ │ ├── UrlMatcher.scala
│ │ │ ├── UrlReader.scala
│ │ │ ├── UserState.scala
│ │ │ ├── bc
│ │ │ ├── AttachmentAction.scala
│ │ │ ├── BackendCommand.scala
│ │ │ ├── BackendCommandRunner.scala
│ │ │ └── ItemAction.scala
│ │ │ ├── exec
│ │ │ ├── Args.scala
│ │ │ ├── Env.scala
│ │ │ ├── ExternalCommand.scala
│ │ │ ├── SysCmd.scala
│ │ │ └── SysExec.scala
│ │ │ ├── syntax
│ │ │ ├── EitherSyntax.scala
│ │ │ ├── FileSyntax.scala
│ │ │ ├── StreamSyntax.scala
│ │ │ ├── StringSyntax.scala
│ │ │ └── package.scala
│ │ │ └── util
│ │ │ ├── Directory.scala
│ │ │ ├── File.scala
│ │ │ ├── Random.scala
│ │ │ ├── ResourceUse.scala
│ │ │ ├── SignUtil.scala
│ │ │ ├── Zip.scala
│ │ │ └── ZipImpl.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── common
│ │ ├── FileNameTest.scala
│ │ ├── GlobTest.scala
│ │ ├── LenientUriTest.scala
│ │ ├── MetaProposalListTest.scala
│ │ ├── MimeTypeTest.scala
│ │ ├── NerLabelSpanTest.scala
│ │ ├── UrlMatcherTest.scala
│ │ ├── bc
│ │ └── BackendCommandTest.scala
│ │ ├── exec
│ │ └── ExternalCommandTest.scala
│ │ └── util
│ │ ├── DirectoryTest.scala
│ │ └── SignUtilTest.scala
├── config
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── config
│ │ │ ├── ConfigFactory.scala
│ │ │ ├── EnvConfig.scala
│ │ │ ├── FtsType.scala
│ │ │ ├── Implicits.scala
│ │ │ ├── PgFtsConfig.scala
│ │ │ └── Validation.scala
│ │ └── test
│ │ ├── resources
│ │ └── reference.conf
│ │ └── scala
│ │ └── docspell
│ │ └── config
│ │ ├── EnvConfigTest.scala
│ │ └── ValidationTest.scala
├── convert
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── convert
│ │ │ ├── Conversion.scala
│ │ │ ├── ConversionResult.scala
│ │ │ ├── ConvertConfig.scala
│ │ │ ├── RemovePdfEncryption.scala
│ │ │ ├── SanitizeHtml.scala
│ │ │ ├── extern
│ │ │ ├── ExternConv.scala
│ │ │ ├── OcrMyPdf.scala
│ │ │ ├── OcrMyPdfConfig.scala
│ │ │ ├── Tesseract.scala
│ │ │ ├── TesseractConfig.scala
│ │ │ ├── Unoconv.scala
│ │ │ ├── UnoconvConfig.scala
│ │ │ ├── Weasyprint.scala
│ │ │ ├── WeasyprintConfig.scala
│ │ │ ├── WkHtmlPdf.scala
│ │ │ └── WkHtmlPdfConfig.scala
│ │ │ └── flexmark
│ │ │ ├── Markdown.scala
│ │ │ └── MarkdownConfig.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── convert
│ │ ├── ConversionTest.scala
│ │ ├── FileChecks.scala
│ │ ├── RemovePdfEncryptionTest.scala
│ │ └── extern
│ │ └── ExternConvTest.scala
├── extract
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── org
│ │ │ │ └── apache
│ │ │ │ └── tika
│ │ │ │ ├── exception
│ │ │ │ └── WriteLimitReachedException.java
│ │ │ │ ├── parser
│ │ │ │ ├── odf
│ │ │ │ │ ├── FlatOpenDocumentMacroHandler.java
│ │ │ │ │ ├── NSNormalizerContentHandler.java
│ │ │ │ │ ├── OpenDocumentBodyHandler.java
│ │ │ │ │ ├── OpenDocumentContentParser.java
│ │ │ │ │ ├── OpenDocumentMacroHandler.java
│ │ │ │ │ ├── OpenDocumentManifestHandler.java
│ │ │ │ │ ├── OpenDocumentMetaParser.java
│ │ │ │ │ └── OpenDocumentParser.java
│ │ │ │ └── xml
│ │ │ │ │ ├── AbstractMetadataHandler.java
│ │ │ │ │ ├── AttributeDependantMetadataHandler.java
│ │ │ │ │ ├── AttributeMetadataHandler.java
│ │ │ │ │ ├── DcXMLParser.java
│ │ │ │ │ ├── ElementMetadataHandler.java
│ │ │ │ │ ├── FictionBookParser.java
│ │ │ │ │ ├── MetadataHandler.java
│ │ │ │ │ ├── TextAndAttributeXMLParser.java
│ │ │ │ │ └── XMLParser.java
│ │ │ │ └── utils
│ │ │ │ └── StringUtils.java
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── extract
│ │ │ ├── ExtractConfig.scala
│ │ │ ├── ExtractResult.scala
│ │ │ ├── Extraction.scala
│ │ │ ├── PdfConfig.scala
│ │ │ ├── PdfExtract.scala
│ │ │ ├── internal
│ │ │ └── Text.scala
│ │ │ ├── ocr
│ │ │ ├── Ocr.scala
│ │ │ ├── OcrConfig.scala
│ │ │ ├── OcrType.scala
│ │ │ └── TextExtract.scala
│ │ │ ├── odf
│ │ │ ├── OdfExtract.scala
│ │ │ └── OdfType.scala
│ │ │ ├── pdfbox
│ │ │ ├── PdfLoader.scala
│ │ │ ├── PdfMetaData.scala
│ │ │ ├── PdfboxExtract.scala
│ │ │ ├── PdfboxPreview.scala
│ │ │ └── PreviewConfig.scala
│ │ │ ├── poi
│ │ │ ├── PoiExtract.scala
│ │ │ └── PoiType.scala
│ │ │ └── rtf
│ │ │ └── RtfExtract.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── extract
│ │ ├── ocr
│ │ └── TextExtractionSuite.scala
│ │ ├── odf
│ │ └── OdfExtractTest.scala
│ │ ├── pdfbox
│ │ ├── PdfMetaDataTest.scala
│ │ ├── PdfboxExtractTest.scala
│ │ └── PdfboxPreviewTest.scala
│ │ ├── poi
│ │ └── PoiExtractTest.scala
│ │ └── rtf
│ │ └── RtfExtractTest.scala
├── files
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── org
│ │ │ │ └── apache
│ │ │ │ └── tika
│ │ │ │ └── parser
│ │ │ │ └── txt
│ │ │ │ ├── IOUtils.java
│ │ │ │ └── Icu4jEncodingDetector.java
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── files
│ │ │ ├── Dimension.scala
│ │ │ ├── FileSupport.scala
│ │ │ ├── ImageSize.scala
│ │ │ └── TikaMimetype.scala
│ │ └── test
│ │ ├── resources
│ │ ├── bombs
│ │ │ ├── 20K-gray.jpeg
│ │ │ ├── 20K-gray.png
│ │ │ ├── 20K-rgb.jpeg
│ │ │ └── 20K-rgb.png
│ │ ├── camera
│ │ │ ├── letter-en.jpg
│ │ │ ├── letter-en.png
│ │ │ └── letter-en.tiff
│ │ ├── examples
│ │ │ ├── letter-ita.txt
│ │ │ ├── sample.doc
│ │ │ ├── sample.docx
│ │ │ ├── sample.ods
│ │ │ ├── sample.odt
│ │ │ ├── sample.rtf
│ │ │ ├── sample.xls
│ │ │ └── sample.xlsx
│ │ ├── keywords.pdf
│ │ ├── large-file.pdf
│ │ ├── letter-de.html
│ │ ├── letter-de.md
│ │ ├── letter-de.pdf
│ │ ├── letter-de.txt
│ │ ├── letter-en.pdf
│ │ ├── letter-en.txt
│ │ ├── letters.zip
│ │ ├── scanner
│ │ │ ├── jfif.jpg
│ │ │ ├── pdf13.pdf
│ │ │ └── pdfa14.pdf
│ │ ├── secured
│ │ │ ├── encrypted-test123.pdf
│ │ │ └── protected-test123.pdf
│ │ ├── zip-dirs-one.zip
│ │ └── zip-dirs.zip
│ │ └── scala
│ │ └── docspell
│ │ └── files
│ │ ├── ExampleFilesSupport.scala
│ │ ├── ImageSizeTest.scala
│ │ ├── Playing.scala
│ │ ├── TestFiles.scala
│ │ ├── TikaMimetypeTest.scala
│ │ └── ZipTest.scala
├── fts-client
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── docspell
│ │ └── ftsclient
│ │ ├── FtsClient.scala
│ │ ├── FtsMigration.scala
│ │ ├── FtsQuery.scala
│ │ ├── FtsResult.scala
│ │ └── TextData.scala
├── fts-psql
│ └── src
│ │ ├── main
│ │ ├── resources
│ │ │ └── db
│ │ │ │ └── psqlfts
│ │ │ │ ├── V2.0.0__initial_schema.sql
│ │ │ │ └── V2.1.0__collective_id.sql
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── ftspsql
│ │ │ ├── DbMigration.scala
│ │ │ ├── DoobieMeta.scala
│ │ │ ├── FtsRecord.scala
│ │ │ ├── FtsRepository.scala
│ │ │ ├── PgQueryParser.scala
│ │ │ ├── PsqlConfig.scala
│ │ │ ├── PsqlFtsClient.scala
│ │ │ ├── RankNormalization.scala
│ │ │ ├── SearchResult.scala
│ │ │ └── SearchSummary.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── ftspsql
│ │ ├── MigrationTest.scala
│ │ ├── PgFixtures.scala
│ │ └── PsqlFtsClientTest.scala
├── fts-solr
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── docspell
│ │ └── ftssolr
│ │ ├── DocIdResult.scala
│ │ ├── Field.scala
│ │ ├── JsonCodec.scala
│ │ ├── QueryData.scala
│ │ ├── SetFields.scala
│ │ ├── SetFolder.scala
│ │ ├── SolrConfig.scala
│ │ ├── SolrFtsClient.scala
│ │ ├── SolrMigration.scala
│ │ ├── SolrQuery.scala
│ │ ├── SolrSetup.scala
│ │ ├── SolrUpdate.scala
│ │ └── VersionDoc.scala
├── joex
│ └── src
│ │ ├── main
│ │ ├── resources
│ │ │ └── reference.conf
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── joex
│ │ │ ├── Config.scala
│ │ │ ├── ConfigFile.scala
│ │ │ ├── JoexApp.scala
│ │ │ ├── JoexAppImpl.scala
│ │ │ ├── JoexServer.scala
│ │ │ ├── JoexTasks.scala
│ │ │ ├── Main.scala
│ │ │ ├── addon
│ │ │ ├── AddonTaskExtension.scala
│ │ │ ├── GenericItemAddonTask.scala
│ │ │ ├── ItemAddonTask.scala
│ │ │ ├── Result.scala
│ │ │ └── ScheduledAddonTask.scala
│ │ │ ├── analysis
│ │ │ ├── NerFile.scala
│ │ │ └── RegexNerFile.scala
│ │ │ ├── download
│ │ │ ├── DownloadZipTask.scala
│ │ │ └── Result.scala
│ │ │ ├── emptytrash
│ │ │ ├── EmptyTrashTask.scala
│ │ │ └── Result.scala
│ │ │ ├── extract
│ │ │ └── JsoupSanitizer.scala
│ │ │ ├── filecopy
│ │ │ ├── FileCopyTask.scala
│ │ │ └── FileIntegrityCheckTask.scala
│ │ │ ├── fts
│ │ │ ├── FtsContext.scala
│ │ │ ├── FtsWork.scala
│ │ │ ├── Migration.scala
│ │ │ ├── MigrationTask.scala
│ │ │ ├── ReIndexTask.scala
│ │ │ └── package.scala
│ │ │ ├── hk
│ │ │ ├── CheckNodesTask.scala
│ │ │ ├── CleanupDownloadsTask.scala
│ │ │ ├── CleanupInvitesTask.scala
│ │ │ ├── CleanupJobsTask.scala
│ │ │ ├── CleanupRememberMeTask.scala
│ │ │ ├── CleanupResult.scala
│ │ │ ├── HouseKeepingConfig.scala
│ │ │ ├── HouseKeepingTask.scala
│ │ │ └── IntegrityCheckTask.scala
│ │ │ ├── learn
│ │ │ ├── ClassifierName.scala
│ │ │ ├── Classify.scala
│ │ │ ├── LearnClassifierTask.scala
│ │ │ ├── LearnItemEntities.scala
│ │ │ ├── LearnTags.scala
│ │ │ ├── SelectItems.scala
│ │ │ └── StoreClassifierModel.scala
│ │ │ ├── mail
│ │ │ ├── EmilHeader.scala
│ │ │ └── ReadMail.scala
│ │ │ ├── multiupload
│ │ │ ├── MultiUploadArchiveTask.scala
│ │ │ └── Result.scala
│ │ │ ├── notify
│ │ │ ├── PeriodicDueItemsTask.scala
│ │ │ ├── PeriodicQueryTask.scala
│ │ │ ├── TaskOperations.scala
│ │ │ └── YamuscaConverter.scala
│ │ │ ├── pagecount
│ │ │ ├── AllPageCountTask.scala
│ │ │ └── MakePageCountTask.scala
│ │ │ ├── pdfconv
│ │ │ ├── ConvertAllPdfTask.scala
│ │ │ └── PdfConvTask.scala
│ │ │ ├── preview
│ │ │ ├── AllPreviewsTask.scala
│ │ │ └── MakePreviewTask.scala
│ │ │ ├── process
│ │ │ ├── AttachmentPageCount.scala
│ │ │ ├── AttachmentPreview.scala
│ │ │ ├── ConvertPdf.scala
│ │ │ ├── CreateItem.scala
│ │ │ ├── CrossCheckProposals.scala
│ │ │ ├── DuplicateCheck.scala
│ │ │ ├── EvalProposals.scala
│ │ │ ├── ExtractArchive.scala
│ │ │ ├── FindProposal.scala
│ │ │ ├── ItemData.scala
│ │ │ ├── ItemHandler.scala
│ │ │ ├── LinkProposal.scala
│ │ │ ├── ProcessItem.scala
│ │ │ ├── ReProcessItem.scala
│ │ │ ├── RemoveEmptyItem.scala
│ │ │ ├── RunAddons.scala
│ │ │ ├── SaveProposals.scala
│ │ │ ├── SetGivenData.scala
│ │ │ ├── TextAnalysis.scala
│ │ │ └── TextExtraction.scala
│ │ │ ├── routes
│ │ │ ├── InfoRoutes.scala
│ │ │ ├── InternalHeader.scala
│ │ │ └── JoexRoutes.scala
│ │ │ ├── scanmailbox
│ │ │ └── ScanMailboxTask.scala
│ │ │ └── updatecheck
│ │ │ ├── MakeMail.scala
│ │ │ ├── ThisVersion.scala
│ │ │ ├── UpdateCheck.scala
│ │ │ ├── UpdateCheckConfig.scala
│ │ │ └── UpdateCheckTask.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── joex
│ │ ├── analysis
│ │ └── NerFileTest.scala
│ │ ├── extract
│ │ └── JsoupSanitizerTest.scala
│ │ └── updatecheck
│ │ └── UpdateCheckTest.scala
├── joexapi
│ └── src
│ │ └── main
│ │ ├── resources
│ │ └── joex-openapi.yml
│ │ └── scala
│ │ └── docspell
│ │ └── joexapi
│ │ └── client
│ │ └── JoexClient.scala
├── jsonminiq
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── jsonminiq
│ │ │ ├── Format.scala
│ │ │ ├── JsonMiniQuery.scala
│ │ │ └── Parser.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── jsonminiq
│ │ ├── Fixtures.scala
│ │ ├── FormatTest.scala
│ │ ├── JsonMiniQueryTest.scala
│ │ └── ParserTest.scala
├── logging
│ ├── api
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── docspell
│ │ │ │ └── logging
│ │ │ │ ├── AndThenLogger.scala
│ │ │ │ ├── CapturedLogger.scala
│ │ │ │ ├── LazyMap.scala
│ │ │ │ ├── Level.scala
│ │ │ │ ├── LogConfig.scala
│ │ │ │ ├── LogEvent.scala
│ │ │ │ ├── Logger.scala
│ │ │ │ └── LoggerExtension.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── docspell
│ │ │ └── logging
│ │ │ ├── CapturedLoggerTest.scala
│ │ │ ├── LazyMapTest.scala
│ │ │ └── TestLogger.scala
│ └── scribe
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── logging
│ │ │ ├── impl
│ │ │ ├── JsonWriter.scala
│ │ │ ├── LogfmtWriter.scala
│ │ │ ├── Record.scala
│ │ │ ├── ScribeConfigure.scala
│ │ │ └── ScribeWrapper.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── logging
│ │ └── TestLoggingConfig.scala
├── notification
│ ├── api
│ │ └── src
│ │ │ └── main
│ │ │ └── scala
│ │ │ └── docspell
│ │ │ └── notification
│ │ │ └── api
│ │ │ ├── Channel.scala
│ │ │ ├── ChannelRef.scala
│ │ │ ├── ChannelType.scala
│ │ │ ├── Event.scala
│ │ │ ├── EventContext.scala
│ │ │ ├── EventExchange.scala
│ │ │ ├── EventMessage.scala
│ │ │ ├── EventReader.scala
│ │ │ ├── EventSink.scala
│ │ │ ├── NotificationBackend.scala
│ │ │ ├── NotificationChannel.scala
│ │ │ ├── NotificationModule.scala
│ │ │ ├── PeriodicDueItemsArgs.scala
│ │ │ └── PeriodicQueryArgs.scala
│ └── impl
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── notification
│ │ │ └── impl
│ │ │ ├── AbstractEventContext.scala
│ │ │ ├── DbEventContext.scala
│ │ │ ├── EmailBackend.scala
│ │ │ ├── EventContextSyntax.scala
│ │ │ ├── EventNotify.scala
│ │ │ ├── ExampleEventContext.scala
│ │ │ ├── GotifyBackend.scala
│ │ │ ├── HttpPostBackend.scala
│ │ │ ├── HttpSend.scala
│ │ │ ├── Markdown.scala
│ │ │ ├── MatrixBackend.scala
│ │ │ ├── NotificationBackendImpl.scala
│ │ │ ├── NotificationModuleImpl.scala
│ │ │ └── context
│ │ │ ├── BasicData.scala
│ │ │ ├── DeleteFieldValueCtx.scala
│ │ │ ├── ItemSelectionCtx.scala
│ │ │ ├── JobDoneCtx.scala
│ │ │ ├── JobSubmittedCtx.scala
│ │ │ ├── SetFieldValueCtx.scala
│ │ │ ├── Syntax.scala
│ │ │ └── TagsChangedCtx.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── notification
│ │ └── impl
│ │ └── context
│ │ └── TagsChangedCtxTest.scala
├── oidc
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── oidc
│ │ │ ├── AccessToken.scala
│ │ │ ├── CodeFlow.scala
│ │ │ ├── CodeFlowConfig.scala
│ │ │ ├── CodeFlowRoutes.scala
│ │ │ ├── Jwt.scala
│ │ │ ├── OnUserInfo.scala
│ │ │ ├── ProviderConfig.scala
│ │ │ ├── SignatureAlgo.scala
│ │ │ ├── StateParam.scala
│ │ │ └── UserInfoDecoder.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── oidc
│ │ └── StateParamTest.scala
├── pubsub
│ ├── api
│ │ └── src
│ │ │ └── main
│ │ │ └── scala
│ │ │ └── docspell
│ │ │ └── pubsub
│ │ │ └── api
│ │ │ ├── Message.scala
│ │ │ ├── MessageHead.scala
│ │ │ ├── PubSub.scala
│ │ │ ├── PubSubT.scala
│ │ │ ├── Topic.scala
│ │ │ └── TypedTopic.scala
│ └── naive
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── pubsub
│ │ │ └── naive
│ │ │ ├── NaivePubSub.scala
│ │ │ └── PubSubConfig.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── pubsub
│ │ └── naive
│ │ ├── Fixtures.scala
│ │ ├── HttpClientOps.scala
│ │ ├── NaivePubSubTest.scala
│ │ └── Topics.scala
├── query
│ ├── js
│ │ └── src
│ │ │ └── main
│ │ │ └── scala
│ │ │ └── docspell
│ │ │ └── query
│ │ │ └── js
│ │ │ └── JSItemQueryParser.scala
│ └── shared
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── query
│ │ │ ├── Date.scala
│ │ │ ├── FulltextExtract.scala
│ │ │ ├── ItemQuery.scala
│ │ │ ├── ItemQueryDsl.scala
│ │ │ ├── ItemQueryParser.scala
│ │ │ ├── ParseFailure.scala
│ │ │ └── internal
│ │ │ ├── AttrParser.scala
│ │ │ ├── BasicParser.scala
│ │ │ ├── Constants.scala
│ │ │ ├── DateParser.scala
│ │ │ ├── ExprParser.scala
│ │ │ ├── ExprString.scala
│ │ │ ├── ExprUtil.scala
│ │ │ ├── MacroParser.scala
│ │ │ ├── OperatorParser.scala
│ │ │ ├── SimpleExprParser.scala
│ │ │ └── StringUtil.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── query
│ │ ├── FulltextExtractTest.scala
│ │ ├── ItemQueryGen.scala
│ │ └── internal
│ │ ├── AttrParserTest.scala
│ │ ├── BasicParserTest.scala
│ │ ├── DateParserTest.scala
│ │ ├── ExprParserTest.scala
│ │ ├── ExprStringTest.scala
│ │ ├── ItemQueryParserTest.scala
│ │ ├── MacroParserTest.scala
│ │ ├── OperatorParserTest.scala
│ │ ├── SimpleExprParserTest.scala
│ │ └── ValueHelper.scala
├── restapi
│ └── src
│ │ └── main
│ │ ├── resources
│ │ └── docspell-openapi.yml
│ │ └── scala
│ │ └── docspell
│ │ └── restapi
│ │ ├── codec
│ │ ├── ChannelEihterCodec.scala
│ │ └── ItemQueryJson.scala
│ │ └── model
│ │ └── NotificationChannel.scala
├── restserver
│ └── src
│ │ ├── main
│ │ ├── resources
│ │ │ ├── docspell
│ │ │ │ └── restserver
│ │ │ │ │ └── no-preview.svg
│ │ │ └── reference.conf
│ │ ├── scala
│ │ │ └── docspell
│ │ │ │ └── restserver
│ │ │ │ ├── Config.scala
│ │ │ │ ├── ConfigFile.scala
│ │ │ │ ├── Main.scala
│ │ │ │ ├── RestApp.scala
│ │ │ │ ├── RestAppImpl.scala
│ │ │ │ ├── RestServer.scala
│ │ │ │ ├── Subscriptions.scala
│ │ │ │ ├── auth
│ │ │ │ ├── CookieData.scala
│ │ │ │ ├── OpenId.scala
│ │ │ │ ├── RememberCookieData.scala
│ │ │ │ └── ShareCookieData.scala
│ │ │ │ ├── conv
│ │ │ │ ├── AddonValidationSupport.scala
│ │ │ │ ├── Conversions.scala
│ │ │ │ ├── MultiIdSupport.scala
│ │ │ │ └── NonEmptyListSupport.scala
│ │ │ │ ├── http4s
│ │ │ │ ├── BinaryUtil.scala
│ │ │ │ ├── ClientRequestInfo.scala
│ │ │ │ ├── ContentDisposition.scala
│ │ │ │ ├── EnvMiddleware.scala
│ │ │ │ ├── InternalHeader.scala
│ │ │ │ ├── NoCacheMiddleware.scala
│ │ │ │ ├── QueryParam.scala
│ │ │ │ ├── ResponseGenerator.scala
│ │ │ │ ├── Responses.scala
│ │ │ │ └── ThrowableResponseMapper.scala
│ │ │ │ ├── routes
│ │ │ │ ├── AddonArchiveRoutes.scala
│ │ │ │ ├── AddonRoutes.scala
│ │ │ │ ├── AddonRunConfigRoutes.scala
│ │ │ │ ├── AddonRunRoutes.scala
│ │ │ │ ├── AdminAuth.scala
│ │ │ │ ├── AttachmentMultiRoutes.scala
│ │ │ │ ├── AttachmentRoutes.scala
│ │ │ │ ├── Authenticate.scala
│ │ │ │ ├── BookmarkRoutes.scala
│ │ │ │ ├── CalEventCheckRoutes.scala
│ │ │ │ ├── CheckFileRoutes.scala
│ │ │ │ ├── ClientSettingsRoutes.scala
│ │ │ │ ├── CollectiveRoutes.scala
│ │ │ │ ├── CustomFieldRoutes.scala
│ │ │ │ ├── DownloadAllRoutes.scala
│ │ │ │ ├── EquipmentRoutes.scala
│ │ │ │ ├── FileRepositoryRoutes.scala
│ │ │ │ ├── FolderRoutes.scala
│ │ │ │ ├── FullTextIndexRoutes.scala
│ │ │ │ ├── InfoRoutes.scala
│ │ │ │ ├── IntegrationEndpointRoutes.scala
│ │ │ │ ├── ItemLinkRoutes.scala
│ │ │ │ ├── ItemMultiRoutes.scala
│ │ │ │ ├── ItemRoutes.scala
│ │ │ │ ├── ItemSearchPart.scala
│ │ │ │ ├── JobQueueRoutes.scala
│ │ │ │ ├── LoginRoutes.scala
│ │ │ │ ├── MailSendRoutes.scala
│ │ │ │ ├── MailSettingsRoutes.scala
│ │ │ │ ├── NotificationRoutes.scala
│ │ │ │ ├── NotifyDueItemsRoutes.scala
│ │ │ │ ├── OrganizationRoutes.scala
│ │ │ │ ├── PeriodicQueryRoutes.scala
│ │ │ │ ├── PersonRoutes.scala
│ │ │ │ ├── RegisterRoutes.scala
│ │ │ │ ├── ScanMailboxRoutes.scala
│ │ │ │ ├── SentMailRoutes.scala
│ │ │ │ ├── ShareAttachmentRoutes.scala
│ │ │ │ ├── ShareAuth.scala
│ │ │ │ ├── ShareItemRoutes.scala
│ │ │ │ ├── ShareRoutes.scala
│ │ │ │ ├── ShareSearchRoutes.scala
│ │ │ │ ├── SourceRoutes.scala
│ │ │ │ ├── TagRoutes.scala
│ │ │ │ ├── TotpRoutes.scala
│ │ │ │ ├── UploadRoutes.scala
│ │ │ │ └── UserRoutes.scala
│ │ │ │ ├── webapp
│ │ │ │ ├── Flags.scala
│ │ │ │ ├── TemplateRoutes.scala
│ │ │ │ ├── Templates.scala
│ │ │ │ └── WebjarRoutes.scala
│ │ │ │ └── ws
│ │ │ │ ├── Background.scala
│ │ │ │ ├── InputMessage.scala
│ │ │ │ ├── OutputEvent.scala
│ │ │ │ ├── OutputEventEncoder.scala
│ │ │ │ └── WebSocketRoutes.scala
│ │ └── templates
│ │ │ ├── doc.html
│ │ │ ├── index.html
│ │ │ └── sw.js
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── restserver
│ │ └── http4s
│ │ └── ContentDispositionTest.scala
├── scheduler
│ ├── api
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── docspell
│ │ │ │ └── scheduler
│ │ │ │ ├── Context.scala
│ │ │ │ ├── CountingScheme.scala
│ │ │ │ ├── FindJobOwner.scala
│ │ │ │ ├── Job.scala
│ │ │ │ ├── JobStore.scala
│ │ │ │ ├── JobStoreModule.scala
│ │ │ │ ├── JobTask.scala
│ │ │ │ ├── JobTaskRegistry.scala
│ │ │ │ ├── JobTaskResult.scala
│ │ │ │ ├── JobTaskResultEncoder.scala
│ │ │ │ ├── PeriodicScheduler.scala
│ │ │ │ ├── PeriodicSchedulerConfig.scala
│ │ │ │ ├── PermanentError.scala
│ │ │ │ ├── Scheduler.scala
│ │ │ │ ├── SchedulerConfig.scala
│ │ │ │ ├── SchedulerModule.scala
│ │ │ │ ├── Task.scala
│ │ │ │ ├── msg
│ │ │ │ ├── CancelJob.scala
│ │ │ │ ├── JobDone.scala
│ │ │ │ ├── JobSubmitted.scala
│ │ │ │ ├── JobsNotify.scala
│ │ │ │ └── PeriodicTaskNotify.scala
│ │ │ │ └── usertask
│ │ │ │ ├── UserTask.scala
│ │ │ │ ├── UserTaskScope.scala
│ │ │ │ └── UserTaskStore.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── docspell
│ │ │ └── scheduler
│ │ │ └── CountingSchemeSpec.scala
│ └── impl
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── scheduler
│ │ │ └── impl
│ │ │ ├── ContextImpl.scala
│ │ │ ├── JobQueue.scala
│ │ │ ├── JobStoreImpl.scala
│ │ │ ├── JobStoreModuleBuilder.scala
│ │ │ ├── JobStorePublish.scala
│ │ │ ├── LogEvent.scala
│ │ │ ├── LogSink.scala
│ │ │ ├── Marked.scala
│ │ │ ├── PeriodicSchedulerBuilder.scala
│ │ │ ├── PeriodicSchedulerImpl.scala
│ │ │ ├── PeriodicTaskStore.scala
│ │ │ ├── QJob.scala
│ │ │ ├── QUserTask.scala
│ │ │ ├── QueueLogger.scala
│ │ │ ├── SchedulerBuilder.scala
│ │ │ ├── SchedulerImpl.scala
│ │ │ ├── SchedulerModuleBuilder.scala
│ │ │ └── UserTaskStoreImpl.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── scheduler
│ │ └── impl
│ │ └── QJobTest.scala
├── store
│ └── src
│ │ ├── main
│ │ ├── resources
│ │ │ └── db
│ │ │ │ ├── fixups
│ │ │ │ ├── h2
│ │ │ │ │ └── V1.33.0__fix_reorganize_files.sql
│ │ │ │ ├── mariadb
│ │ │ │ │ └── V1.33.0__fix_reorganize_files.sql
│ │ │ │ └── postgresql
│ │ │ │ │ └── V1.33.0__fix_reorganize_files.sql
│ │ │ │ └── migration
│ │ │ │ ├── h2
│ │ │ │ ├── V1.0.0__initial_database.sql
│ │ │ │ ├── V1.1.0__useremail.sql
│ │ │ │ ├── V1.10.0__attachment_preview.sql
│ │ │ │ ├── V1.11.0__pdf_pages.sql
│ │ │ │ ├── V1.12.0__upload_data.sql
│ │ │ │ ├── V1.13.0__custom_fields.sql
│ │ │ │ ├── V1.14.0__person_org.sql
│ │ │ │ ├── V1.15.0__rememberme.sql
│ │ │ │ ├── V1.16.0__add_imap_oauth.sql
│ │ │ │ ├── V1.17.0__meta_language.sql
│ │ │ │ ├── V1.18.0__classifier_model.sql
│ │ │ │ ├── V1.19.0__add_classify_meta.sql
│ │ │ │ ├── V1.19.1__remove_enabled.sql
│ │ │ │ ├── V1.2.0__origin_source.sql
│ │ │ │ ├── V1.20.0__personuse.sql
│ │ │ │ ├── V1.20.1__equipment_description.sql
│ │ │ │ ├── V1.20.2__org_shortname.sql
│ │ │ │ ├── V1.20.3__node_seen.sql
│ │ │ │ ├── V1.20.4__source_lang.sql
│ │ │ │ ├── V1.21.0__cast_function.sql
│ │ │ │ ├── V1.21.1__equip_org_use.sql
│ │ │ │ ├── V1.22.0__add_task_name.sql
│ │ │ │ ├── V1.23.0__clientsettings.sql
│ │ │ │ ├── V1.24.0__drop_fts_migration.sql
│ │ │ │ ├── V1.25.0__add_empty_trash.sql
│ │ │ │ ├── V1.25.1__fix_periodic_submitter_value.sql
│ │ │ │ ├── V1.25.2__add_trash_min_age.sql
│ │ │ │ ├── V1.25.3__delete_corrupt_trash_task.sql
│ │ │ │ ├── V1.25.4__add_source_attachonly.sql
│ │ │ │ ├── V1.26.0__missing_indexes.sql
│ │ │ │ ├── V1.26.1__totp.sql
│ │ │ │ ├── V1.26.2__openid.sql
│ │ │ │ ├── V1.26.3__filestore.sql
│ │ │ │ ├── V1.27.0__collective_passwords.sql
│ │ │ │ ├── V1.27.1__item_share.sql
│ │ │ │ ├── V1.28.0__pubsub.sql
│ │ │ │ ├── V1.28.1__intern_settings.sql
│ │ │ │ ├── V1.29.0__reset_classifier_file.sql
│ │ │ │ ├── V1.29.1__notification.sql
│ │ │ │ ├── V1.3.0__periodic_job.sql
│ │ │ │ ├── V1.30.0__clientsettings_collective.sql
│ │ │ │ ├── V1.31.0__query_bookmark.sql
│ │ │ │ ├── V1.31.1__gotify_prio.sql
│ │ │ │ ├── V1.32.0__notification_channel_name.sql
│ │ │ │ ├── V1.32.1__notification_hook_multi_channel.sql
│ │ │ │ ├── V1.33.0__reorganize_file_ids.sql
│ │ │ │ ├── V1.34.0__item_relation.sql
│ │ │ │ ├── V1.35.0__download_query.sql
│ │ │ │ ├── V1.35.1__password_length.sql
│ │ │ │ ├── V1.36.0__addons.sql
│ │ │ │ ├── V1.38.0__more_indexes.sql
│ │ │ │ ├── V1.38.1__remove_unused_column.sql
│ │ │ │ ├── V1.38.2__rememberme.sql
│ │ │ │ ├── V1.39.0__collective_id.sql
│ │ │ │ ├── V1.39.1__file_meta_migration.sql
│ │ │ │ ├── V1.39.3__rename_value.sql
│ │ │ │ ├── V1.4.0__attachment_archive.sql
│ │ │ │ ├── V1.5.0__userimap.sql
│ │ │ │ ├── V1.6.0__integration_enabled.sql
│ │ │ │ ├── V1.7.0__fts-migration.sql
│ │ │ │ ├── V1.8.0__folders.sql
│ │ │ │ ├── V1.9.0__updated_column.sql
│ │ │ │ ├── V1.9.1__classifier.sql
│ │ │ │ ├── V1.9.3__joblog_counter.sql
│ │ │ │ └── V1.9.4__unique_equipments.sql
│ │ │ │ ├── mariadb
│ │ │ │ ├── V1.0.0__initial_database.sql
│ │ │ │ ├── V1.1.0__useremail.sql
│ │ │ │ ├── V1.10.0__attachment_preview.sql
│ │ │ │ ├── V1.11.0__pdf_pages.sql
│ │ │ │ ├── V1.12.0__upload_data.sql
│ │ │ │ ├── V1.13.0__custom_fields.sql
│ │ │ │ ├── V1.14.0__person_org.sql
│ │ │ │ ├── V1.15.0__rememberme.sql
│ │ │ │ ├── V1.16.0__add_imap_oauth.sql
│ │ │ │ ├── V1.17.0__meta_language.sql
│ │ │ │ ├── V1.18.0__classifier_model.sql
│ │ │ │ ├── V1.19.0__add_classify_meta.sql
│ │ │ │ ├── V1.19.1__remove_enabled.sql
│ │ │ │ ├── V1.2.0__origin_source.sql
│ │ │ │ ├── V1.20.0__personuse.sql
│ │ │ │ ├── V1.20.1__equipment_description.sql
│ │ │ │ ├── V1.20.2__org_shortname.sql
│ │ │ │ ├── V1.20.3__node_seen.sql
│ │ │ │ ├── V1.20.4__source_lang.sql
│ │ │ │ ├── V1.21.0__cast_function.sql
│ │ │ │ ├── V1.21.1__equip_org_use.sql
│ │ │ │ ├── V1.22.0__add_task_name.sql
│ │ │ │ ├── V1.23.0__clientsettings.sql
│ │ │ │ ├── V1.24.0__drop_fts_migration.sql
│ │ │ │ ├── V1.25.0__add_empty_trash.sql
│ │ │ │ ├── V1.25.1__fix_periodic_submitter_value.sql
│ │ │ │ ├── V1.25.2__add_trash_min_age.sql
│ │ │ │ ├── V1.25.3__delete_corrupt_trash_task.sql
│ │ │ │ ├── V1.25.4__add_source_attachonly.sql
│ │ │ │ ├── V1.26.0__missing_indexes.sql
│ │ │ │ ├── V1.26.1__totp.sql
│ │ │ │ ├── V1.26.2__openid.sql
│ │ │ │ ├── V1.26.3__filestore.sql
│ │ │ │ ├── V1.27.0__collective_passwords.sql
│ │ │ │ ├── V1.27.1__item_share.sql
│ │ │ │ ├── V1.28.0__pubsub.sql
│ │ │ │ ├── V1.28.1__intern_settings.sql
│ │ │ │ ├── V1.29.0__reset_classifier_file.sql
│ │ │ │ ├── V1.29.1__notification.sql
│ │ │ │ ├── V1.3.0__periodic_job.sql
│ │ │ │ ├── V1.30.0__clientsettings_collective.sql
│ │ │ │ ├── V1.31.0__query_bookmark.sql
│ │ │ │ ├── V1.31.1__gotify_prio.sql
│ │ │ │ ├── V1.32.0__notification_channel_name.sql
│ │ │ │ ├── V1.32.1__notification_hook_multi_channel.sql
│ │ │ │ ├── V1.33.0__reorganize_file_ids.sql
│ │ │ │ ├── V1.34.0__item_relation.sql
│ │ │ │ ├── V1.35.0__download_query.sql
│ │ │ │ ├── V1.35.1__password_length.sql
│ │ │ │ ├── V1.36.0__addons.sql
│ │ │ │ ├── V1.38.0__more_indexes.sql
│ │ │ │ ├── V1.38.1__remove_unused_column.sql
│ │ │ │ ├── V1.38.2__rememberme.sql
│ │ │ │ ├── V1.39.0__collective_id.sql
│ │ │ │ ├── V1.39.1__file_meta_migration.sql
│ │ │ │ ├── V1.39.3__rename_value.sql
│ │ │ │ ├── V1.4.0__attachment_archive.sql
│ │ │ │ ├── V1.5.0__userimap.sql
│ │ │ │ ├── V1.6.0__integration_enabled.sql
│ │ │ │ ├── V1.6.1__fix_timestamp_columns.sql
│ │ │ │ ├── V1.7.0__fts-migration.sql
│ │ │ │ ├── V1.7.1__fix_item_date.sql
│ │ │ │ ├── V1.8.0__folders.sql
│ │ │ │ ├── V1.9.0__updated_column.sql
│ │ │ │ ├── V1.9.1__classifier.sql
│ │ │ │ ├── V1.9.2__fix_text_length.sql
│ │ │ │ ├── V1.9.3__joblog_counter.sql
│ │ │ │ └── V1.9.4__unique_equipments.sql
│ │ │ │ └── postgresql
│ │ │ │ ├── V1.0.0__initial_database.sql
│ │ │ │ ├── V1.1.0__useremail.sql
│ │ │ │ ├── V1.10.0__attachment_preview.sql
│ │ │ │ ├── V1.11.0__pdf_pages.sql
│ │ │ │ ├── V1.12.0__upload_data.sql
│ │ │ │ ├── V1.13.0__custom_fields.sql
│ │ │ │ ├── V1.14.0__person_org.sql
│ │ │ │ ├── V1.15.0__rememberme.sql
│ │ │ │ ├── V1.16.0__add_imap_oauth.sql
│ │ │ │ ├── V1.17.0__meta_language.sql
│ │ │ │ ├── V1.18.0__classifier_model.sql
│ │ │ │ ├── V1.19.0__add_classify_meta.sql
│ │ │ │ ├── V1.19.1__remove_enabled.sql
│ │ │ │ ├── V1.2.0__origin_source.sql
│ │ │ │ ├── V1.20.0__personuse.sql
│ │ │ │ ├── V1.20.1__equipment_description.sql
│ │ │ │ ├── V1.20.2__org_shortname.sql
│ │ │ │ ├── V1.20.3__node_seen.sql
│ │ │ │ ├── V1.20.4__source_lang.sql
│ │ │ │ ├── V1.21.0__cast_function.sql
│ │ │ │ ├── V1.21.1__equip_org_use.sql
│ │ │ │ ├── V1.22.0__add_task_name.sql
│ │ │ │ ├── V1.23.0__clientsettings.sql
│ │ │ │ ├── V1.24.0__drop_fts_migration.sql
│ │ │ │ ├── V1.25.0__add_empty_trash.sql
│ │ │ │ ├── V1.25.1__fix_periodic_submitter_value.sql
│ │ │ │ ├── V1.25.2__add_trash_min_age.sql
│ │ │ │ ├── V1.25.3__delete_corrupt_trash_task.sql
│ │ │ │ ├── V1.25.4__add_source_attachonly.sql
│ │ │ │ ├── V1.26.0__missing_indexes.sql
│ │ │ │ ├── V1.26.1__totp.sql
│ │ │ │ ├── V1.26.2__openid.sql
│ │ │ │ ├── V1.26.3__filestore.sql
│ │ │ │ ├── V1.27.0__collective_passwords.sql
│ │ │ │ ├── V1.27.1__item_share.sql
│ │ │ │ ├── V1.28.0__pubsub.sql
│ │ │ │ ├── V1.28.1__intern_settings.sql
│ │ │ │ ├── V1.29.0__reset_classifier_file.sql
│ │ │ │ ├── V1.29.1__notification.sql
│ │ │ │ ├── V1.3.0__periodic_job.sql
│ │ │ │ ├── V1.30.0__clientsettings_collective.sql
│ │ │ │ ├── V1.31.0__query_bookmark.sql
│ │ │ │ ├── V1.31.1__gotify_prio.sql
│ │ │ │ ├── V1.32.0__notification_channel_name.sql
│ │ │ │ ├── V1.32.1__notification_hook_multi_channel.sql
│ │ │ │ ├── V1.33.0__reorganize_file_ids.sql
│ │ │ │ ├── V1.34.0__item_relation.sql
│ │ │ │ ├── V1.35.0__download_query.sql
│ │ │ │ ├── V1.35.1__password_length.sql
│ │ │ │ ├── V1.36.0__addons.sql
│ │ │ │ ├── V1.38.0__more_indexes.sql
│ │ │ │ ├── V1.38.1__remove_unused_column.sql
│ │ │ │ ├── V1.38.2__rememberme.sql
│ │ │ │ ├── V1.39.0__collective_id.sql
│ │ │ │ ├── V1.39.1__file_meta_migration.sql
│ │ │ │ ├── V1.39.3__rename_value.sql
│ │ │ │ ├── V1.4.0__attachment_archive.sql
│ │ │ │ ├── V1.5.0__userimap.sql
│ │ │ │ ├── V1.6.0__integration_enabled.sql
│ │ │ │ ├── V1.7.0__fts-migration.sql
│ │ │ │ ├── V1.8.0__folders.sql
│ │ │ │ ├── V1.9.0__updated_column.sql
│ │ │ │ ├── V1.9.1__classifier.sql
│ │ │ │ ├── V1.9.3__joblog_counter.sql
│ │ │ │ └── V1.9.4__unique_equipments.sql
│ │ └── scala
│ │ │ ├── db
│ │ │ └── migration
│ │ │ │ ├── common
│ │ │ │ ├── JsonCodecs.scala
│ │ │ │ ├── MigrateCollectiveIdTaskArgs.scala
│ │ │ │ ├── MigrateDueItemTasks.scala
│ │ │ │ ├── MigrateNotifyTasks.scala
│ │ │ │ └── TransactorSupport.scala
│ │ │ │ ├── data
│ │ │ │ ├── AllPreviewsArgs.scala
│ │ │ │ ├── ConvertAllPdfArgs.scala
│ │ │ │ ├── DownloadZipArgs.scala
│ │ │ │ ├── EmptyTrashArgs.scala
│ │ │ │ ├── FileIntegrityCheckArgs.scala
│ │ │ │ ├── ItemAddonTaskArgs.scala
│ │ │ │ ├── LearnClassifierArgs.scala
│ │ │ │ ├── NotifyDueItemsArgs.scala
│ │ │ │ ├── PeriodicDueItemsArgs.scala
│ │ │ │ ├── PeriodicDueItemsArgsOld.scala
│ │ │ │ ├── PeriodicQueryArgs.scala
│ │ │ │ ├── PeriodicQueryArgsOld.scala
│ │ │ │ ├── ProcessItemArgs.scala
│ │ │ │ ├── ReIndexTaskArgs.scala
│ │ │ │ ├── ScanMailboxArgs.scala
│ │ │ │ ├── ScheduledAddonTaskArgs.scala
│ │ │ │ └── package.scala
│ │ │ │ ├── h2
│ │ │ │ ├── V1_29_2__MigrateNotifyTask.scala
│ │ │ │ ├── V1_32_2__MigrateChannels.scala
│ │ │ │ └── V1_39_2__MigrateTasks.scala
│ │ │ │ ├── mariadb
│ │ │ │ ├── V1_29_2__MigrateNotifyTask.scala
│ │ │ │ ├── V1_32_2__MigrateChannels.scala
│ │ │ │ └── V1_39_2__MigrateTasks.scala
│ │ │ │ └── postgresql
│ │ │ │ ├── V1_29_2__MigrateNotifyTask.scala
│ │ │ │ ├── V1_32_2__MigrateChannels.scala
│ │ │ │ └── V1_39_2__MigrateTasks.scala
│ │ │ └── docspell
│ │ │ └── store
│ │ │ ├── AddResult.scala
│ │ │ ├── Db.scala
│ │ │ ├── JdbcConfig.scala
│ │ │ ├── SchemaMigrateConfig.scala
│ │ │ ├── Store.scala
│ │ │ ├── UpdateResult.scala
│ │ │ ├── file
│ │ │ ├── AttributeStore.scala
│ │ │ ├── BinnyUtils.scala
│ │ │ ├── FileMetadata.scala
│ │ │ ├── FileRepository.scala
│ │ │ ├── FileRepositoryConfig.scala
│ │ │ ├── FileRepositoryImpl.scala
│ │ │ └── FileUrlReader.scala
│ │ │ ├── fts
│ │ │ ├── ContextEntry.scala
│ │ │ ├── RFtsResult.scala
│ │ │ └── TempFtsOps.scala
│ │ │ ├── impl
│ │ │ ├── DoobieLogging.scala
│ │ │ ├── DoobieMeta.scala
│ │ │ ├── StoreImpl.scala
│ │ │ └── h2
│ │ │ │ └── CastNumericFun.scala
│ │ │ ├── migrate
│ │ │ └── FlywayMigrate.scala
│ │ │ ├── qb
│ │ │ ├── Batch.scala
│ │ │ ├── Column.scala
│ │ │ ├── Condition.scala
│ │ │ ├── CteBind.scala
│ │ │ ├── DBFunction.scala
│ │ │ ├── DML.scala
│ │ │ ├── DSL.scala
│ │ │ ├── FromExpr.scala
│ │ │ ├── GroupBy.scala
│ │ │ ├── Operator.scala
│ │ │ ├── OrderBy.scala
│ │ │ ├── Select.scala
│ │ │ ├── SelectExpr.scala
│ │ │ ├── Setter.scala
│ │ │ ├── TableDef.scala
│ │ │ ├── generator
│ │ │ │ ├── ItemQueryGenerator.scala
│ │ │ │ └── Tables.scala
│ │ │ └── impl
│ │ │ │ ├── CommonBuilder.scala
│ │ │ │ ├── ConditionBuilder.scala
│ │ │ │ ├── DBFunctionBuilder.scala
│ │ │ │ ├── FromExprBuilder.scala
│ │ │ │ ├── SelectBuilder.scala
│ │ │ │ └── SelectExprBuilder.scala
│ │ │ ├── queries
│ │ │ ├── AttachedFile.scala
│ │ │ ├── AttachmentLight.scala
│ │ │ ├── CategoryCount.scala
│ │ │ ├── ChannelMap.scala
│ │ │ ├── CustomValue.scala
│ │ │ ├── FieldStats.scala
│ │ │ ├── FolderCount.scala
│ │ │ ├── FtsSupport.scala
│ │ │ ├── IdRefCount.scala
│ │ │ ├── ItemData.scala
│ │ │ ├── ItemFieldValue.scala
│ │ │ ├── ItemFileMeta.scala
│ │ │ ├── ListItem.scala
│ │ │ ├── ListItemWithTags.scala
│ │ │ ├── QAttachment.scala
│ │ │ ├── QCollective.scala
│ │ │ ├── QCustomField.scala
│ │ │ ├── QFolder.scala
│ │ │ ├── QItem.scala
│ │ │ ├── QJobQueue.scala
│ │ │ ├── QLogin.scala
│ │ │ ├── QMails.scala
│ │ │ ├── QMoveAttachment.scala
│ │ │ ├── QNotification.scala
│ │ │ ├── QOrganization.scala
│ │ │ ├── QPeriodicTask.scala
│ │ │ ├── QUser.scala
│ │ │ ├── Query.scala
│ │ │ ├── QueryWildcard.scala
│ │ │ ├── SearchSummary.scala
│ │ │ ├── SelectedItem.scala
│ │ │ ├── TagCount.scala
│ │ │ └── TextAndTag.scala
│ │ │ ├── records
│ │ │ ├── AddonRunConfigData.scala
│ │ │ ├── AddonRunConfigResolved.scala
│ │ │ ├── RAddonArchive.scala
│ │ │ ├── RAddonRunConfig.scala
│ │ │ ├── RAddonRunConfigAddon.scala
│ │ │ ├── RAddonRunConfigTrigger.scala
│ │ │ ├── RAttachment.scala
│ │ │ ├── RAttachmentArchive.scala
│ │ │ ├── RAttachmentMeta.scala
│ │ │ ├── RAttachmentPreview.scala
│ │ │ ├── RAttachmentSource.scala
│ │ │ ├── RClassifierModel.scala
│ │ │ ├── RClassifierSetting.scala
│ │ │ ├── RClientSettingsCollective.scala
│ │ │ ├── RClientSettingsUser.scala
│ │ │ ├── RCollective.scala
│ │ │ ├── RCollectivePassword.scala
│ │ │ ├── RContact.scala
│ │ │ ├── RCustomField.scala
│ │ │ ├── RCustomFieldValue.scala
│ │ │ ├── RDownloadQuery.scala
│ │ │ ├── REmptyTrashSetting.scala
│ │ │ ├── REquipment.scala
│ │ │ ├── RFileMeta.scala
│ │ │ ├── RFolder.scala
│ │ │ ├── RFolderMember.scala
│ │ │ ├── RInternalSetting.scala
│ │ │ ├── RInvitation.scala
│ │ │ ├── RItem.scala
│ │ │ ├── RItemLink.scala
│ │ │ ├── RItemProposal.scala
│ │ │ ├── RJob.scala
│ │ │ ├── RJobGroupUse.scala
│ │ │ ├── RJobLog.scala
│ │ │ ├── RNode.scala
│ │ │ ├── RNotificationChannel.scala
│ │ │ ├── RNotificationChannelGotify.scala
│ │ │ ├── RNotificationChannelHttp.scala
│ │ │ ├── RNotificationChannelMail.scala
│ │ │ ├── RNotificationChannelMatrix.scala
│ │ │ ├── RNotificationHook.scala
│ │ │ ├── RNotificationHookChannel.scala
│ │ │ ├── RNotificationHookEvent.scala
│ │ │ ├── ROrganization.scala
│ │ │ ├── RPeriodicTask.scala
│ │ │ ├── RPerson.scala
│ │ │ ├── RPubSub.scala
│ │ │ ├── RQueryBookmark.scala
│ │ │ ├── RRememberMe.scala
│ │ │ ├── RSentMail.scala
│ │ │ ├── RSentMailItem.scala
│ │ │ ├── RShare.scala
│ │ │ ├── RSource.scala
│ │ │ ├── RTag.scala
│ │ │ ├── RTagItem.scala
│ │ │ ├── RTagSource.scala
│ │ │ ├── RTotp.scala
│ │ │ ├── RUser.scala
│ │ │ ├── RUserEmail.scala
│ │ │ ├── RUserImap.scala
│ │ │ ├── SourceData.scala
│ │ │ └── TagItemName.scala
│ │ │ └── syntax
│ │ │ └── MimeTypes.scala
│ │ └── test
│ │ ├── resources
│ │ └── docspell-0.24.0-dump-h2-1.24.0-2021-07-13-2307.sql
│ │ └── scala
│ │ └── docspell
│ │ └── store
│ │ ├── DatabaseTest.scala
│ │ ├── Docker.scala
│ │ ├── StoreFixture.scala
│ │ ├── fts
│ │ └── TempFtsOpsTest.scala
│ │ ├── generator
│ │ └── ItemQueryGeneratorTest.scala
│ │ ├── migrate
│ │ └── MigrateTest.scala
│ │ ├── qb
│ │ ├── QueryBuilderTest.scala
│ │ ├── impl
│ │ │ ├── ConditionBuilderTest.scala
│ │ │ ├── DSLTest.scala
│ │ │ └── SelectBuilderTest.scala
│ │ └── model
│ │ │ ├── CourseRecord.scala
│ │ │ └── PersonRecord.scala
│ │ └── queries
│ │ └── QueryWildcardTest.scala
├── totp
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── docspell
│ │ │ └── totp
│ │ │ ├── Key.scala
│ │ │ ├── Mac.scala
│ │ │ ├── OnetimePassword.scala
│ │ │ ├── PassLength.scala
│ │ │ ├── Settings.scala
│ │ │ └── Totp.scala
│ │ └── test
│ │ └── scala
│ │ └── docspell
│ │ └── totp
│ │ ├── KeyTest.scala
│ │ └── TotpTest.scala
└── webapp
│ ├── elm-analyse.json
│ ├── elm-package.json
│ ├── elm.json
│ ├── package-lock.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── src
│ └── main
│ │ ├── elm
│ │ ├── Api.elm
│ │ ├── App
│ │ │ ├── Data.elm
│ │ │ ├── Update.elm
│ │ │ └── View2.elm
│ │ ├── Comp
│ │ │ ├── AddonArchiveForm.elm
│ │ │ ├── AddonArchiveManage.elm
│ │ │ ├── AddonArchiveTable.elm
│ │ │ ├── AddonRunConfigForm.elm
│ │ │ ├── AddonRunConfigManage.elm
│ │ │ ├── AddonRunConfigTable.elm
│ │ │ ├── AddressForm.elm
│ │ │ ├── AttachmentMeta.elm
│ │ │ ├── Basic.elm
│ │ │ ├── BasicSizeField.elm
│ │ │ ├── BookmarkChooser.elm
│ │ │ ├── BookmarkDropdown.elm
│ │ │ ├── BookmarkManage.elm
│ │ │ ├── BookmarkQueryForm.elm
│ │ │ ├── BookmarkQueryManage.elm
│ │ │ ├── BookmarkTable.elm
│ │ │ ├── BoxEdit.elm
│ │ │ ├── BoxMessageEdit.elm
│ │ │ ├── BoxQueryEdit.elm
│ │ │ ├── BoxQueryView.elm
│ │ │ ├── BoxSearchQueryInput.elm
│ │ │ ├── BoxStatsEdit.elm
│ │ │ ├── BoxStatsView.elm
│ │ │ ├── BoxUploadEdit.elm
│ │ │ ├── BoxUploadView.elm
│ │ │ ├── BoxView.elm
│ │ │ ├── CalEventInput.elm
│ │ │ ├── ChangePasswordForm.elm
│ │ │ ├── ChannelForm.elm
│ │ │ ├── ChannelMenu.elm
│ │ │ ├── ChannelRefInput.elm
│ │ │ ├── ClassifierSettingsForm.elm
│ │ │ ├── CollectiveSettingsForm.elm
│ │ │ ├── ColorTagger.elm
│ │ │ ├── ConfirmModal.elm
│ │ │ ├── ContactField.elm
│ │ │ ├── CustomFieldForm.elm
│ │ │ ├── CustomFieldInput.elm
│ │ │ ├── CustomFieldManage.elm
│ │ │ ├── CustomFieldMultiInput.elm
│ │ │ ├── CustomFieldTable.elm
│ │ │ ├── DashboardEdit.elm
│ │ │ ├── DashboardManage.elm
│ │ │ ├── DashboardView.elm
│ │ │ ├── DatePicker.elm
│ │ │ ├── DetailEdit.elm
│ │ │ ├── DownloadAll.elm
│ │ │ ├── Dropdown.elm
│ │ │ ├── Dropzone.elm
│ │ │ ├── DueItemsTaskForm.elm
│ │ │ ├── DueItemsTaskList.elm
│ │ │ ├── DueItemsTaskManage.elm
│ │ │ ├── EmailInput.elm
│ │ │ ├── EmailSettingsForm.elm
│ │ │ ├── EmailSettingsManage.elm
│ │ │ ├── EmailSettingsTable.elm
│ │ │ ├── EmptyTrashForm.elm
│ │ │ ├── EquipmentForm.elm
│ │ │ ├── EquipmentManage.elm
│ │ │ ├── EquipmentTable.elm
│ │ │ ├── EventSample.elm
│ │ │ ├── ExpandCollapse.elm
│ │ │ ├── FieldListSelect.elm
│ │ │ ├── FixedDropdown.elm
│ │ │ ├── FolderDetail.elm
│ │ │ ├── FolderManage.elm
│ │ │ ├── FolderSelect.elm
│ │ │ ├── FolderTable.elm
│ │ │ ├── ImapSettingsForm.elm
│ │ │ ├── ImapSettingsManage.elm
│ │ │ ├── ImapSettingsTable.elm
│ │ │ ├── IntField.elm
│ │ │ ├── ItemCard.elm
│ │ │ ├── ItemCardList.elm
│ │ │ ├── ItemColumnDropdown.elm
│ │ │ ├── ItemColumnView.elm
│ │ │ ├── ItemDetail.elm
│ │ │ ├── ItemDetail
│ │ │ │ ├── AddFilesForm.elm
│ │ │ │ ├── ConfirmModalView.elm
│ │ │ │ ├── EditForm.elm
│ │ │ │ ├── FieldTabState.elm
│ │ │ │ ├── FormChange.elm
│ │ │ │ ├── ItemInfoHeader.elm
│ │ │ │ ├── Model.elm
│ │ │ │ ├── MultiEditMenu.elm
│ │ │ │ ├── Notes.elm
│ │ │ │ ├── RunAddonForm.elm
│ │ │ │ ├── ShowQrCode.elm
│ │ │ │ ├── SingleAttachment.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── ItemLinkForm.elm
│ │ │ ├── ItemMail.elm
│ │ │ ├── ItemMerge.elm
│ │ │ ├── ItemSearchInput.elm
│ │ │ ├── KeyInput.elm
│ │ │ ├── LinkTarget.elm
│ │ │ ├── MarkdownInput.elm
│ │ │ ├── MenuBar.elm
│ │ │ ├── NotificationChannelManage.elm
│ │ │ ├── NotificationChannelTable.elm
│ │ │ ├── NotificationGotifyForm.elm
│ │ │ ├── NotificationHookForm.elm
│ │ │ ├── NotificationHookManage.elm
│ │ │ ├── NotificationHookTable.elm
│ │ │ ├── NotificationHttpForm.elm
│ │ │ ├── NotificationMailForm.elm
│ │ │ ├── NotificationMatrixForm.elm
│ │ │ ├── NotificationTest.elm
│ │ │ ├── OrgForm.elm
│ │ │ ├── OrgManage.elm
│ │ │ ├── OrgTable.elm
│ │ │ ├── OtpSetup.elm
│ │ │ ├── PasswordInput.elm
│ │ │ ├── PeriodicQueryTaskForm.elm
│ │ │ ├── PeriodicQueryTaskList.elm
│ │ │ ├── PeriodicQueryTaskManage.elm
│ │ │ ├── PersonForm.elm
│ │ │ ├── PersonManage.elm
│ │ │ ├── PersonTable.elm
│ │ │ ├── PowerSearchInput.elm
│ │ │ ├── Progress.elm
│ │ │ ├── PublishItems.elm
│ │ │ ├── ScanMailboxForm.elm
│ │ │ ├── ScanMailboxList.elm
│ │ │ ├── ScanMailboxManage.elm
│ │ │ ├── SearchMenu.elm
│ │ │ ├── SearchStatsView.elm
│ │ │ ├── SentMails.elm
│ │ │ ├── ShareForm.elm
│ │ │ ├── ShareMail.elm
│ │ │ ├── ShareManage.elm
│ │ │ ├── SharePasswordForm.elm
│ │ │ ├── ShareTable.elm
│ │ │ ├── ShareView.elm
│ │ │ ├── SimpleTextInput.elm
│ │ │ ├── SourceForm.elm
│ │ │ ├── SourceManage.elm
│ │ │ ├── SourceTable.elm
│ │ │ ├── StringListInput.elm
│ │ │ ├── Tabs.elm
│ │ │ ├── TagDropdown.elm
│ │ │ ├── TagForm.elm
│ │ │ ├── TagManage.elm
│ │ │ ├── TagSelect.elm
│ │ │ ├── TagTable.elm
│ │ │ ├── UiSettingsForm.elm
│ │ │ ├── UiSettingsManage.elm
│ │ │ ├── UiSettingsMigrate.elm
│ │ │ ├── UploadForm.elm
│ │ │ ├── UrlCopy.elm
│ │ │ ├── UserForm.elm
│ │ │ ├── UserManage.elm
│ │ │ ├── UserTable.elm
│ │ │ └── YesNoDimmer.elm
│ │ ├── Data
│ │ │ ├── AccountScope.elm
│ │ │ ├── AddonTrigger.elm
│ │ │ ├── AppEvent.elm
│ │ │ ├── BasicSize.elm
│ │ │ ├── Bookmarks.elm
│ │ │ ├── Box.elm
│ │ │ ├── BoxContent.elm
│ │ │ ├── CalEvent.elm
│ │ │ ├── ChannelRef.elm
│ │ │ ├── ChannelType.elm
│ │ │ ├── Color.elm
│ │ │ ├── ContactType.elm
│ │ │ ├── CustomFieldChange.elm
│ │ │ ├── CustomFieldOrder.elm
│ │ │ ├── CustomFieldType.elm
│ │ │ ├── Dashboard.elm
│ │ │ ├── Dashboards.elm
│ │ │ ├── Direction.elm
│ │ │ ├── DownloadAllState.elm
│ │ │ ├── DownloadFileType.elm
│ │ │ ├── DropdownStyle.elm
│ │ │ ├── Environment.elm
│ │ │ ├── EquipmentOrder.elm
│ │ │ ├── EquipmentUse.elm
│ │ │ ├── EventType.elm
│ │ │ ├── Fields.elm
│ │ │ ├── Flags.elm
│ │ │ ├── FolderOrder.elm
│ │ │ ├── Icons.elm
│ │ │ ├── ItemArrange.elm
│ │ │ ├── ItemColumn.elm
│ │ │ ├── ItemIds.elm
│ │ │ ├── ItemNav.elm
│ │ │ ├── ItemQuery.elm
│ │ │ ├── ItemSelection.elm
│ │ │ ├── ItemTemplate.elm
│ │ │ ├── Items.elm
│ │ │ ├── Language.elm
│ │ │ ├── ListType.elm
│ │ │ ├── Money.elm
│ │ │ ├── NotificationChannel.elm
│ │ │ ├── OrgUse.elm
│ │ │ ├── OrganizationOrder.elm
│ │ │ ├── Pdf.elm
│ │ │ ├── PersonOrder.elm
│ │ │ ├── PersonUse.elm
│ │ │ ├── Priority.elm
│ │ │ ├── QueryParseResult.elm
│ │ │ ├── SSLType.elm
│ │ │ ├── SearchMode.elm
│ │ │ ├── ServerEvent.elm
│ │ │ ├── SourceState.elm
│ │ │ ├── TagOrder.elm
│ │ │ ├── TimeZone.elm
│ │ │ ├── UiSettings.elm
│ │ │ ├── UiTheme.elm
│ │ │ ├── UserState.elm
│ │ │ └── Validated.elm
│ │ ├── Main.elm
│ │ ├── Messages.elm
│ │ ├── Messages
│ │ │ ├── App.elm
│ │ │ ├── Basics.elm
│ │ │ ├── Comp
│ │ │ │ ├── AddonArchiveForm.elm
│ │ │ │ ├── AddonArchiveManage.elm
│ │ │ │ ├── AddonArchiveTable.elm
│ │ │ │ ├── AddonRunConfigForm.elm
│ │ │ │ ├── AddonRunConfigManage.elm
│ │ │ │ ├── AddonRunConfigTable.elm
│ │ │ │ ├── AddressForm.elm
│ │ │ │ ├── AttachmentMeta.elm
│ │ │ │ ├── BookmarkChooser.elm
│ │ │ │ ├── BookmarkDropdown.elm
│ │ │ │ ├── BookmarkManage.elm
│ │ │ │ ├── BookmarkQueryForm.elm
│ │ │ │ ├── BookmarkQueryManage.elm
│ │ │ │ ├── BookmarkTable.elm
│ │ │ │ ├── BoxEdit.elm
│ │ │ │ ├── BoxMessageEdit.elm
│ │ │ │ ├── BoxQueryEdit.elm
│ │ │ │ ├── BoxQueryView.elm
│ │ │ │ ├── BoxSearchQueryInput.elm
│ │ │ │ ├── BoxStatsEdit.elm
│ │ │ │ ├── BoxStatsView.elm
│ │ │ │ ├── BoxUploadEdit.elm
│ │ │ │ ├── BoxUploadView.elm
│ │ │ │ ├── BoxView.elm
│ │ │ │ ├── CalEventInput.elm
│ │ │ │ ├── ChangePasswordForm.elm
│ │ │ │ ├── ChannelForm.elm
│ │ │ │ ├── ChannelRefInput.elm
│ │ │ │ ├── ClassifierSettingsForm.elm
│ │ │ │ ├── CollectiveSettingsForm.elm
│ │ │ │ ├── CustomFieldForm.elm
│ │ │ │ ├── CustomFieldInput.elm
│ │ │ │ ├── CustomFieldManage.elm
│ │ │ │ ├── CustomFieldMultiInput.elm
│ │ │ │ ├── CustomFieldTable.elm
│ │ │ │ ├── DashboardEdit.elm
│ │ │ │ ├── DashboardManage.elm
│ │ │ │ ├── DashboardView.elm
│ │ │ │ ├── DetailEdit.elm
│ │ │ │ ├── DownloadAll.elm
│ │ │ │ ├── Dropzone.elm
│ │ │ │ ├── DueItemsTaskForm.elm
│ │ │ │ ├── DueItemsTaskList.elm
│ │ │ │ ├── DueItemsTaskManage.elm
│ │ │ │ ├── EmailSettingsForm.elm
│ │ │ │ ├── EmailSettingsManage.elm
│ │ │ │ ├── EmailSettingsTable.elm
│ │ │ │ ├── EmptyTrashForm.elm
│ │ │ │ ├── EquipmentForm.elm
│ │ │ │ ├── EquipmentManage.elm
│ │ │ │ ├── EquipmentTable.elm
│ │ │ │ ├── EventSample.elm
│ │ │ │ ├── ExpandCollapse.elm
│ │ │ │ ├── FolderDetail.elm
│ │ │ │ ├── FolderManage.elm
│ │ │ │ ├── FolderSelect.elm
│ │ │ │ ├── FolderTable.elm
│ │ │ │ ├── HttpError.elm
│ │ │ │ ├── ImapSettingsForm.elm
│ │ │ │ ├── ImapSettingsManage.elm
│ │ │ │ ├── ImapSettingsTable.elm
│ │ │ │ ├── ItemCard.elm
│ │ │ │ ├── ItemCardList.elm
│ │ │ │ ├── ItemColumnDropdown.elm
│ │ │ │ ├── ItemDetail.elm
│ │ │ │ ├── ItemDetail
│ │ │ │ │ ├── AddFilesForm.elm
│ │ │ │ │ ├── ConfirmModal.elm
│ │ │ │ │ ├── EditForm.elm
│ │ │ │ │ ├── ItemInfoHeader.elm
│ │ │ │ │ ├── MultiEditMenu.elm
│ │ │ │ │ ├── Notes.elm
│ │ │ │ │ ├── RunAddonForm.elm
│ │ │ │ │ └── SingleAttachment.elm
│ │ │ │ ├── ItemLinkForm.elm
│ │ │ │ ├── ItemMail.elm
│ │ │ │ ├── ItemMerge.elm
│ │ │ │ ├── ItemSearchInput.elm
│ │ │ │ ├── NotificationChannelManage.elm
│ │ │ │ ├── NotificationChannelTable.elm
│ │ │ │ ├── NotificationGotifyForm.elm
│ │ │ │ ├── NotificationHookForm.elm
│ │ │ │ ├── NotificationHookManage.elm
│ │ │ │ ├── NotificationHookTable.elm
│ │ │ │ ├── NotificationHttpForm.elm
│ │ │ │ ├── NotificationMailForm.elm
│ │ │ │ ├── NotificationMatrixForm.elm
│ │ │ │ ├── OrgForm.elm
│ │ │ │ ├── OrgManage.elm
│ │ │ │ ├── OrgTable.elm
│ │ │ │ ├── OtpSetup.elm
│ │ │ │ ├── PeriodicQueryTaskForm.elm
│ │ │ │ ├── PeriodicQueryTaskList.elm
│ │ │ │ ├── PeriodicQueryTaskManage.elm
│ │ │ │ ├── PersonForm.elm
│ │ │ │ ├── PersonManage.elm
│ │ │ │ ├── PersonTable.elm
│ │ │ │ ├── PublishItems.elm
│ │ │ │ ├── ScanMailboxForm.elm
│ │ │ │ ├── ScanMailboxManage.elm
│ │ │ │ ├── ScanMailboxTable.elm
│ │ │ │ ├── SearchMenu.elm
│ │ │ │ ├── SearchStatsView.elm
│ │ │ │ ├── SentMails.elm
│ │ │ │ ├── ShareForm.elm
│ │ │ │ ├── ShareMail.elm
│ │ │ │ ├── ShareManage.elm
│ │ │ │ ├── SharePasswordForm.elm
│ │ │ │ ├── ShareTable.elm
│ │ │ │ ├── ShareView.elm
│ │ │ │ ├── SourceForm.elm
│ │ │ │ ├── SourceManage.elm
│ │ │ │ ├── SourceTable.elm
│ │ │ │ ├── TagDropdown.elm
│ │ │ │ ├── TagForm.elm
│ │ │ │ ├── TagManage.elm
│ │ │ │ ├── TagSelect.elm
│ │ │ │ ├── TagTable.elm
│ │ │ │ ├── UiSettingsForm.elm
│ │ │ │ ├── UiSettingsManage.elm
│ │ │ │ ├── UploadForm.elm
│ │ │ │ ├── UserForm.elm
│ │ │ │ ├── UserManage.elm
│ │ │ │ └── UserTable.elm
│ │ │ ├── Data
│ │ │ │ ├── AccountScope.elm
│ │ │ │ ├── BoxContent.elm
│ │ │ │ ├── ChannelType.elm
│ │ │ │ ├── Color.elm
│ │ │ │ ├── ContactType.elm
│ │ │ │ ├── CustomFieldType.elm
│ │ │ │ ├── Direction.elm
│ │ │ │ ├── DownloadFileType.elm
│ │ │ │ ├── EquipmentUse.elm
│ │ │ │ ├── EventType.elm
│ │ │ │ ├── Fields.elm
│ │ │ │ ├── ItemColumn.elm
│ │ │ │ ├── Language.elm
│ │ │ │ ├── OrgUse.elm
│ │ │ │ ├── PdfMode.elm
│ │ │ │ ├── PersonUse.elm
│ │ │ │ └── SSLType.elm
│ │ │ ├── DateFormat.elm
│ │ │ ├── Page
│ │ │ │ ├── CollectiveSettings.elm
│ │ │ │ ├── Dashboard.elm
│ │ │ │ ├── DefaultDashboard.elm
│ │ │ │ ├── ItemDetail.elm
│ │ │ │ ├── Login.elm
│ │ │ │ ├── ManageData.elm
│ │ │ │ ├── NewInvite.elm
│ │ │ │ ├── Queue.elm
│ │ │ │ ├── Register.elm
│ │ │ │ ├── Search.elm
│ │ │ │ ├── SearchSideMenu.elm
│ │ │ │ ├── Share.elm
│ │ │ │ ├── ShareDetail.elm
│ │ │ │ ├── Upload.elm
│ │ │ │ └── UserSettings.elm
│ │ │ └── UiLanguage.elm
│ │ ├── Page.elm
│ │ ├── Page
│ │ │ ├── CollectiveSettings
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Dashboard
│ │ │ │ ├── Data.elm
│ │ │ │ ├── DefaultDashboard.elm
│ │ │ │ ├── SideMenu.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View.elm
│ │ │ ├── ItemDetail
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Login
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── ManageData
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── NewInvite
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Queue
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Register
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Search
│ │ │ │ ├── Data.elm
│ │ │ │ ├── SideMenu.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ ├── Share
│ │ │ │ ├── Data.elm
│ │ │ │ ├── LoadMore.elm
│ │ │ │ ├── Menubar.elm
│ │ │ │ ├── Results.elm
│ │ │ │ ├── Sidebar.elm
│ │ │ │ ├── TopContent.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View.elm
│ │ │ ├── ShareDetail
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View.elm
│ │ │ ├── Upload
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ │ └── UserSettings
│ │ │ │ ├── Data.elm
│ │ │ │ ├── Update.elm
│ │ │ │ └── View2.elm
│ │ ├── Ports.elm
│ │ ├── Styles.elm
│ │ └── Util
│ │ │ ├── Address.elm
│ │ │ ├── Contact.elm
│ │ │ ├── CustomField.elm
│ │ │ ├── Duration.elm
│ │ │ ├── File.elm
│ │ │ ├── Folder.elm
│ │ │ ├── Html.elm
│ │ │ ├── Http.elm
│ │ │ ├── Item.elm
│ │ │ ├── ItemDragDrop.elm
│ │ │ ├── List.elm
│ │ │ ├── Maybe.elm
│ │ │ ├── Person.elm
│ │ │ ├── Result.elm
│ │ │ ├── Size.elm
│ │ │ ├── String.elm
│ │ │ ├── Tag.elm
│ │ │ └── Update.elm
│ │ ├── styles
│ │ ├── custom-components.css
│ │ ├── custom-utilities.css
│ │ ├── index.css
│ │ └── keep.txt
│ │ └── webjar
│ │ ├── docspell.css
│ │ ├── docspell.js
│ │ ├── favicon
│ │ ├── android-icon-144x144.png
│ │ ├── android-icon-192x192.png
│ │ ├── android-icon-36x36.png
│ │ ├── android-icon-48x48.png
│ │ ├── android-icon-512x512.png
│ │ ├── android-icon-72x72.png
│ │ ├── android-icon-96x96.png
│ │ ├── apple-icon-114x114.png
│ │ ├── apple-icon-120x120.png
│ │ ├── apple-icon-144x144.png
│ │ ├── apple-icon-152x152.png
│ │ ├── apple-icon-180x180.png
│ │ ├── apple-icon-57x57.png
│ │ ├── apple-icon-60x60.png
│ │ ├── apple-icon-72x72.png
│ │ ├── apple-icon-76x76.png
│ │ ├── apple-icon-precomposed.png
│ │ ├── apple-icon.png
│ │ ├── browserconfig.xml
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon-96x96.png
│ │ ├── favicon.ico
│ │ ├── manifest.json
│ │ ├── ms-icon-144x144.png
│ │ ├── ms-icon-150x150.png
│ │ ├── ms-icon-310x310.png
│ │ └── ms-icon-70x70.png
│ │ └── img
│ │ ├── logo-400.png
│ │ ├── logo-96.png
│ │ ├── logo-mc-400.png
│ │ ├── logo-mc-96.png
│ │ ├── logo-only-mc.svg
│ │ └── logo-only.svg
│ └── tailwind.config.js
├── nix
├── checks
│ ├── configuration-test.nix
│ ├── default.nix
│ └── testScript.py
├── docker.nix
├── modules
│ ├── joex.nix
│ └── server.nix
├── pkg.nix
└── test-vm.nix
├── project
├── Cmd.scala
├── Dependencies.scala
├── ElmCompileMode.scala
├── EnvConfig.scala
├── NerModelsPlugin.scala
├── StylesPlugin.scala
├── TestSettings.scala
├── ZolaPlugin.scala
├── build.properties
├── build.sbt
├── change-version.sh
├── dev-ui-build.sh
├── plugins.sbt
└── redocly.yml
├── tools
├── README.md
├── exim
│ ├── README.md
│ ├── docker-compose.yml
│ ├── exim.conf
│ └── exim.dockerfile
├── h2-util.sh
├── import-paperless
│ ├── README.md
│ └── import-paperless.sh
├── start-local
│ ├── README.md
│ └── start-local.sh
└── webextension
│ ├── README.md
│ ├── _locales
│ ├── de
│ │ └── messages.json
│ └── en
│ │ └── messages.json
│ ├── docspell.js
│ ├── icons
│ ├── logo-48.png
│ └── logo-96.png
│ ├── make-xpi.sh
│ ├── manifest.json
│ └── native
│ ├── app_manifest.json
│ └── native.py
├── version.sbt
└── website
├── README.md
├── elm-analyse.json
├── elm.json
├── elm
├── Demo.elm
├── ExtraAttr.elm
├── Feature.elm
├── GetStarted.elm
├── Icons.elm
├── Main.elm
└── Search.elm
├── package.json
├── postcss.config.js
├── push-docs.sh
├── scripts
├── build.sh
├── run-elm.sh
├── run-styles.sh
├── screenshot.sh
└── screenshot2.sh
├── site
├── config.toml
├── content
│ ├── blog
│ │ ├── 2021-01-09_scan-and-process-from-adf.md
│ │ ├── 2022-01-17_alternative_upload_from_browser.md
│ │ ├── 2022-01-31_create_post.md
│ │ ├── 2022-05-16_audio_file_addon.md
│ │ └── _index.md
│ └── docs
│ │ ├── _index.md
│ │ ├── addons
│ │ ├── _index.md
│ │ ├── addon-install-01.png
│ │ ├── addon-install-01_dark.png
│ │ ├── addon-install-02.png
│ │ ├── addon-install-02_dark.png
│ │ ├── addon-install-03.png
│ │ ├── addon-install-03_dark.png
│ │ ├── addon-install-04.png
│ │ ├── addon-install-04_dark.png
│ │ ├── basics.md
│ │ ├── control.md
│ │ ├── using.md
│ │ └── writing.md
│ │ ├── api
│ │ ├── _index.md
│ │ ├── intro.md
│ │ └── upload.md
│ │ ├── configure
│ │ ├── _index.md
│ │ ├── admin-endpoint.md
│ │ ├── authentication.md
│ │ ├── baseurl.md
│ │ ├── bind.md
│ │ ├── custom-mapping.md
│ │ ├── database.md
│ │ ├── defaults.md
│ │ ├── file-backends.md
│ │ ├── file-processing.md
│ │ ├── fulltext-search.md
│ │ ├── main.md
│ │ └── registration.md
│ │ ├── dev
│ │ ├── _index.md
│ │ ├── add-language.md
│ │ ├── adr
│ │ │ ├── 0000_use_markdown_architectural_decision_records.md
│ │ │ ├── 0001_components.md
│ │ │ ├── 0002_component_interaction.md
│ │ │ ├── 0003_encryption.md
│ │ │ ├── 0004_iso8601vsEpoch.md
│ │ │ ├── 0005_job-executor.md
│ │ │ ├── 0006_more-file-types.md
│ │ │ ├── 0007_convert_html_files.md
│ │ │ ├── 0008_convert_plain_text.md
│ │ │ ├── 0009_convert_office_docs.md
│ │ │ ├── 0010_convert_image_files.md
│ │ │ ├── 0011_extract_text.md
│ │ │ ├── 0012_periodic_tasks.md
│ │ │ ├── 0013_archive_files.md
│ │ │ ├── 0014_fulltext_search_engine.md
│ │ │ ├── 0015_convert_pdf_files.md
│ │ │ ├── 0016_custom_fields.md
│ │ │ ├── _index.md
│ │ │ ├── example-docx-pandoc-context.jpg
│ │ │ ├── example-docx-pandoc-html.jpg
│ │ │ ├── example-docx-pandoc-latex.jpg
│ │ │ ├── example-docx-pandoc-ms.jpg
│ │ │ ├── example-docx-unoconv.jpg
│ │ │ ├── example-html-native.jpg
│ │ │ ├── example-html-pandoc-html.jpg
│ │ │ ├── example-html-pandoc-latex.jpg
│ │ │ ├── example-html-unoconv.jpg
│ │ │ ├── example-html-wkhtmltopdf.jpg
│ │ │ ├── example-md-java.jpg
│ │ │ ├── example-md-pandoc-html.jpg
│ │ │ ├── example-md-pandoc-latex.jpg
│ │ │ ├── example-odt-abiword.jpg
│ │ │ ├── example-odt-native.jpg
│ │ │ ├── example-odt-pandoc-context.jpg
│ │ │ ├── example-odt-pandoc-html.jpg
│ │ │ ├── example-odt-pandoc-latex.jpg
│ │ │ ├── example-odt-pandoc-ms.jpg
│ │ │ ├── example-odt-unoconv.jpg
│ │ │ ├── example-txt-java.jpg
│ │ │ ├── example-txt-pandoc-html.jpg
│ │ │ ├── example-txt-pandoc-latex.jpg
│ │ │ ├── process-files.png
│ │ │ ├── process-files.puml
│ │ │ └── template.md
│ │ ├── building.md
│ │ ├── development.md
│ │ ├── documentation.md
│ │ └── translation.md
│ │ ├── faq
│ │ └── _index.md
│ │ ├── features
│ │ └── _index.md
│ │ ├── feed
│ │ ├── _index.md
│ │ ├── scanmailbox.png
│ │ ├── scanmailbox_dark.png
│ │ ├── web-upload.png
│ │ └── web-upload_dark.png
│ │ ├── install
│ │ ├── _index.md
│ │ ├── docker.md
│ │ ├── downgrading.md
│ │ ├── download_run.md
│ │ ├── nix.md
│ │ ├── prereq.md
│ │ ├── quickstart.md
│ │ ├── reverseproxy.md
│ │ └── rpi.md
│ │ ├── intro
│ │ └── _index.md
│ │ ├── joex
│ │ ├── _index.md
│ │ ├── file-processing.md
│ │ └── intro.md
│ │ ├── jsonminiquery
│ │ └── _index.md
│ │ ├── query
│ │ ├── _index.md
│ │ └── enable-powersearch.png
│ │ ├── tools
│ │ ├── _index.md
│ │ ├── android.md
│ │ ├── cli.md
│ │ ├── ds4e-01.png
│ │ ├── ds4e-01_light.png
│ │ ├── ds4e.md
│ │ ├── exim-mail.png
│ │ ├── get-it-on.png
│ │ ├── paperless-import.md
│ │ ├── screenshot-choose.jpg
│ │ ├── screenshot-create.jpg
│ │ ├── screenshot-default.jpg
│ │ ├── screenshot-options.jpg
│ │ ├── screenshot-share.jpg
│ │ ├── screenshot-uploading.jpg
│ │ └── smtpgateway.md
│ │ └── webapp
│ │ ├── _index.md
│ │ ├── autotagging.md
│ │ ├── bookmarks-01.png
│ │ ├── bookmarks-01_dark.png
│ │ ├── bookmarks-02.png
│ │ ├── bookmarks-02_dark.png
│ │ ├── bookmarks-03.png
│ │ ├── bookmarks-03_dark.png
│ │ ├── bookmarks-04.png
│ │ ├── bookmarks-04_dark.png
│ │ ├── bookmarks.md
│ │ ├── collective-settings-autotag.png
│ │ ├── collective-settings-autotag_dark.png
│ │ ├── curate.md
│ │ ├── custom-fields-01-dark.png
│ │ ├── custom-fields-01.png
│ │ ├── custom-fields-01_dark.png
│ │ ├── custom-fields-02-dark.png
│ │ ├── custom-fields-02.png
│ │ ├── custom-fields-02_dark.png
│ │ ├── custom-fields-03.png
│ │ ├── custom-fields-03_dark.png
│ │ ├── custom-fields-04.png
│ │ ├── custom-fields-04_dark.png
│ │ ├── custom-fields-05.png
│ │ ├── custom-fields-05_dark.png
│ │ ├── custom-fields-06.png
│ │ ├── custom-fields-06_dark.png
│ │ ├── custom-fields-07.png
│ │ ├── custom-fields-07_dark.png
│ │ ├── customfields.md
│ │ ├── dashboards-01.png
│ │ ├── dashboards-01_dark.png
│ │ ├── dashboards-01d.png
│ │ ├── dashboards-02.png
│ │ ├── dashboards-02_dark.png
│ │ ├── dashboards-03.png
│ │ ├── dashboards-03_dark.png
│ │ ├── dashboards-04.png
│ │ ├── dashboards-04_dark.png
│ │ ├── dashboards-05.png
│ │ ├── dashboards-05_dark.png
│ │ ├── dashboards.md
│ │ ├── docspell-curate-1.png
│ │ ├── docspell-curate-1_dark.png
│ │ ├── docspell-curate-3.png
│ │ ├── docspell-curate-3_dark.png
│ │ ├── docspell-curate-5.png
│ │ ├── docspell-curate-5_dark.png
│ │ ├── docspell-curate-6.png
│ │ ├── docspell-curate-6_dark.png
│ │ ├── download-all-01-dark.png
│ │ ├── download-all-01.png
│ │ ├── download-all-02-dark.png
│ │ ├── download-all-02.png
│ │ ├── download-all-03-dark.png
│ │ ├── download-all-03.png
│ │ ├── download-all-04-dark.png
│ │ ├── download-all-04.png
│ │ ├── download-all.md
│ │ ├── drop-tag.png
│ │ ├── drop-tag_dark.png
│ │ ├── emailsettings.md
│ │ ├── finding.md
│ │ ├── itemcard-customize-01.png
│ │ ├── itemcard-customize-01_dark.png
│ │ ├── itemcard-customize-02.png
│ │ ├── itemcard-customize-03.png
│ │ ├── itemcard-customize-04.png
│ │ ├── itemcard-customize.md
│ │ ├── mail-item-1.png
│ │ ├── mail-item-1_dark.png
│ │ ├── mail-item-2.png
│ │ ├── mail-item-2_dark.png
│ │ ├── mail-item-4.png
│ │ ├── mail-item-4_dark.png
│ │ ├── mail-settings-1.png
│ │ ├── mail-settings-1_dark.png
│ │ ├── mail-settings-2.png
│ │ ├── mail-settings-2_dark.png
│ │ ├── mailitem.md
│ │ ├── merge-01.png
│ │ ├── merge-01_dark.png
│ │ ├── merge-02.png
│ │ ├── merge-02_dark.png
│ │ ├── merge-04.png
│ │ ├── merge-04_dark.png
│ │ ├── merge.md
│ │ ├── metadata.md
│ │ ├── multiedit-01.png
│ │ ├── multiedit-01_dark.png
│ │ ├── multiedit-02.png
│ │ ├── multiedit-02_dark.png
│ │ ├── multiedit-03.png
│ │ ├── multiedit-03_dark.png
│ │ ├── multiedit-04.png
│ │ ├── multiedit-04_dark.png
│ │ ├── multiedit.md
│ │ ├── notification-01.png
│ │ ├── notification-01_dark.png
│ │ ├── notification-02.png
│ │ ├── notification-02_dark.png
│ │ ├── notification-03.png
│ │ ├── notification-03_dark.png
│ │ ├── notification-04.png
│ │ ├── notification-04_dark.png
│ │ ├── notification-05.png
│ │ ├── notification-05_dark.png
│ │ ├── notification-06.png
│ │ ├── notification-06_dark.png
│ │ ├── notification-07.png
│ │ ├── notification-07_dark.png
│ │ ├── notification.md
│ │ ├── notifydueitems.md
│ │ ├── processing-queue.png
│ │ ├── processing.md
│ │ ├── scanmailbox-detail-01.png
│ │ ├── scanmailbox-detail-01_dark.png
│ │ ├── scanmailbox-detail-02.png
│ │ ├── scanmailbox-detail-02_dark.png
│ │ ├── scanmailbox-detail-03.png
│ │ ├── scanmailbox-detail-03_dark.png
│ │ ├── scanmailbox-detail-04.png
│ │ ├── scanmailbox-detail-04_dark.png
│ │ ├── scanmailbox-detail-05.png
│ │ ├── scanmailbox-detail-05_dark.png
│ │ ├── scanmailbox-detail-06.png
│ │ ├── scanmailbox-detail-06_dark.png
│ │ ├── scanmailbox-list.png
│ │ ├── scanmailbox-list_dark.png
│ │ ├── scanmailbox.md
│ │ ├── search-menu.png
│ │ ├── search-menu_dark.png
│ │ ├── share-01.png
│ │ ├── share-01_dark.png
│ │ ├── share-02.png
│ │ ├── share-02_dark.png
│ │ ├── share-03.png
│ │ ├── share-03_dark.png
│ │ ├── share-04.png
│ │ ├── share-04_dark.png
│ │ ├── share-05.png
│ │ ├── share-06.png
│ │ ├── share-06_dark.png
│ │ ├── share-07.png
│ │ ├── share-07_dark.png
│ │ ├── share-08.png
│ │ ├── share-08_dark.png
│ │ ├── share-09.png
│ │ ├── share-09_dark.png
│ │ ├── share-10.png
│ │ ├── share-10_dark.png
│ │ ├── share-11.png
│ │ ├── share-11_dark.png
│ │ ├── share-12.png
│ │ ├── share-12_dark.png
│ │ ├── share.md
│ │ ├── totp-01.png
│ │ ├── totp-01_dark.png
│ │ ├── totp-02.png
│ │ ├── totp-02_dark.png
│ │ ├── totp-03.png
│ │ ├── totp-03_dark.png
│ │ ├── totp.md
│ │ ├── uploading-01.png
│ │ ├── uploading-01_dark.png
│ │ ├── uploading-02.png
│ │ ├── uploading-02_dark.png
│ │ └── uploading.md
├── static
│ ├── CNAME
│ ├── favicon-mc.ico
│ ├── favicon.ico
│ ├── icons
│ │ ├── home-40.svg
│ │ ├── logo-only-36.svg
│ │ ├── logo-only-mc.svg
│ │ └── logo-only.svg
│ ├── img
│ │ ├── analyze-feature.png
│ │ ├── back-master-small.jpg
│ │ ├── cassie-boca-x-tbVqkfQCU-unsplash.jpg
│ │ ├── convertpdf-feature.svg
│ │ ├── filetype-feature.svg
│ │ ├── fts-feature.png
│ │ ├── fts-feature_dark.png
│ │ ├── jesse-gardner-EqdpXeemf58-unsplash.jpg
│ │ ├── jf-martin-Ofs3LjEUcrk-unsplash.jpg
│ │ ├── josh-rose-trYl7JYATH0-unsplash.jpg
│ │ ├── notify-feature.png
│ │ ├── ocr-feature.png
│ │ ├── poster.png
│ │ ├── scanmailbox-feature.png
│ │ ├── sendmail-feature.png
│ │ ├── tersius-van-rhyn-xcQWMPm9fG8-unsplash.jpg
│ │ └── user-feature.png
│ ├── js
│ │ ├── light-switch.js
│ │ └── searchhelper.js
│ ├── screenshots
│ │ └── mobile
│ │ │ ├── Screenshot_2021-02-14-01-small.jpg
│ │ │ ├── Screenshot_2021-02-14-01.jpg
│ │ │ ├── Screenshot_2021-02-14-02-small.jpg
│ │ │ ├── Screenshot_2021-02-14-02.jpg
│ │ │ ├── Screenshot_2021-02-14-03-small.jpg
│ │ │ ├── Screenshot_2021-02-14-03.jpg
│ │ │ ├── Screenshot_2021-02-14-04-small.jpg
│ │ │ ├── Screenshot_2021-02-14-04.jpg
│ │ │ ├── Screenshot_2021-02-14-05-small.jpg
│ │ │ ├── Screenshot_2021-02-14-05.jpg
│ │ │ ├── Screenshot_2021-02-14-06-small.jpg
│ │ │ ├── Screenshot_2021-02-14-06.jpg
│ │ │ ├── Screenshot_2021-02-14-07-small.jpg
│ │ │ ├── Screenshot_2021-02-14-07.jpg
│ │ │ ├── Screenshot_2021-02-14-08-small.jpg
│ │ │ ├── Screenshot_2021-02-14-08.jpg
│ │ │ ├── Screenshot_2021-02-14-09-small.jpg
│ │ │ ├── Screenshot_2021-02-14-09.jpg
│ │ │ ├── Screenshot_2021-02-14-10-small.jpg
│ │ │ └── Screenshot_2021-02-14-10.jpg
│ └── videos
│ │ ├── docspell-navigate-2020-11-14.mp4
│ │ ├── docspell-navigate-2021-01-11.mp4
│ │ ├── docspell-navigate-2021-02-19.mp4
│ │ ├── docspell-process-2020-11-14.mp4
│ │ ├── docspell-process-2021-01-11.mp4
│ │ ├── docspell-process-2021-02-19-dark.mp4
│ │ └── docspell-process-2021-02-19.mp4
└── templates
│ ├── 404.html
│ ├── base.html
│ ├── blog.html
│ ├── blog_page.html
│ ├── docs.html
│ ├── index.html
│ ├── parts
│ ├── fathom.html
│ ├── footer.html
│ ├── meta.html
│ ├── search-head.html
│ ├── search-part.html
│ └── topnav.html
│ └── shortcodes
│ ├── buttonright.html
│ ├── deb_files.html
│ ├── figure.html
│ ├── figure2.html
│ ├── imgnormal.html
│ ├── imgnormal2.html
│ ├── imgright.html
│ ├── imgright2.html
│ ├── incl_conf.md
│ ├── incl_json.md
│ ├── infobubble.html
│ ├── pversion.html
│ ├── version.html
│ ├── warningbubble.html
│ └── zip_files.html
├── src
└── main
│ └── scala
│ └── docspell
│ └── website
│ ├── AddonOutputExample.scala
│ ├── AddonOutputMiniExample.scala
│ ├── FileMetaExample.scala
│ ├── Helper.scala
│ ├── ItemArgsExample.scala
│ ├── ItemDataExample.scala
│ └── Main.scala
├── styles
├── content.css
├── custom-components.css
├── custom-utilities.css
└── input.css
├── tailwind.config.js
└── yarn.lock
/.git-blame-ignore-revs:
--------------------------------------------------------------------------------
1 | # Scala Steward: Reformat with scalafmt 3.8.2
2 | 1c566cd5182d41f4cc06040fc347ddb4be617779
3 |
4 | # Scala Steward: Reformat with scalafmt 3.8.4
5 | f90502399d78e7a3eb07bd7a1d130e6ae9ba498c
6 |
7 | # Scala Steward: Reformat with scalafmt 3.9.0
8 | 4e66b2f9f7ffe02dd065ceeebb7060ed3478c6e7
9 |
--------------------------------------------------------------------------------
/.github/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "automerge": true,
3 | "labels": ["dependencies"],
4 | "packageRules": [
5 | {
6 | "matchManagers": [
7 | "sbt"
8 | ],
9 | "enabled": false
10 | }
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------
/.github/workflows/auto-approve.yml:
--------------------------------------------------------------------------------
1 | name: Auto approve
2 |
3 | on:
4 | pull_request_target
5 |
6 | jobs:
7 | auto-approve:
8 | runs-on: ubuntu-24.04
9 | steps:
10 | - uses: hmarr/auto-approve-action@v4.0.0
11 | if: github.actor == 'eikek-scala-steward'
12 | with:
13 | github-token: ${{ secrets.GITHUB_TOKEN }}
14 |
--------------------------------------------------------------------------------
/.github/workflows/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name: Release Drafter
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 |
8 | jobs:
9 | update_release_draft:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: release-drafter/release-drafter@v6
13 | env:
14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
15 |
--------------------------------------------------------------------------------
/.projectile:
--------------------------------------------------------------------------------
1 | !/local
2 | !/local/dev.conf
3 | !/local/test.rest
4 | !/modules/restapi/target/scala-2.13
5 | !/modules/webapp/target/elm-src/Api/Model
6 |
--------------------------------------------------------------------------------
/.redocly.lint-ignore.yaml:
--------------------------------------------------------------------------------
1 | # This file instructs Redocly's linter to ignore the rules contained for specific parts of your API.
2 | # See https://redoc.ly/docs/cli/ for more information.
3 | modules/restapi/src/main/resources/docspell-openapi.yml:
4 | spec:
5 | - '#/extraSchemas'
6 |
--------------------------------------------------------------------------------
/.scala-steward.conf:
--------------------------------------------------------------------------------
1 | updates.ignore = [
2 | { groupId = "org.apache.poi" },
3 | ]
4 |
--------------------------------------------------------------------------------
/.scalafix.conf:
--------------------------------------------------------------------------------
1 | rules = [
2 | ProcedureSyntax
3 | OrganizeImports
4 | ]
5 | OrganizeImports {
6 | coalesceToWildcardImportThreshold = 3
7 | expandRelative = true
8 | groupedImports = Keep
9 | importsOrder = Ascii
10 | groups = ["re:javax?\\.", "scala.", "re:(cats|fs2)\\.", "docspell.", "*"]
11 | importSelectorsOrder = Ascii
12 | removeUnused = true
13 | }
--------------------------------------------------------------------------------
/.scalafmt.conf:
--------------------------------------------------------------------------------
1 | version = "3.9.6"
2 |
3 | preset = default
4 | align.preset = some
5 | runner.dialect = scala213source3
6 |
7 | maxColumn = 90
8 |
9 | rewrite.rules = [
10 | AvoidInfix
11 | RedundantBraces
12 | RedundantParens
13 | AsciiSortImports
14 | PreferCurlyFors
15 | SortModifiers
16 | ]
17 |
18 | assumeStandardLibraryStripMargin = true
19 | align.stripMargin = true
20 |
21 | docstrings.style = SpaceAsterisk
22 | docstrings.oneline = fold
23 | docstrings.wrap = "yes"
--------------------------------------------------------------------------------
/artwork/logo-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/artwork/logo-400.png
--------------------------------------------------------------------------------
/artwork/logo-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/artwork/logo-48.png
--------------------------------------------------------------------------------
/artwork/logo-96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/artwork/logo-96.png
--------------------------------------------------------------------------------
/artwork/logo-mc-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/artwork/logo-mc-400.png
--------------------------------------------------------------------------------
/artwork/logo-mc-96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/artwork/logo-mc-96.png
--------------------------------------------------------------------------------
/artwork/make-png.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | inkscape -z -e logo-48.png -w 48 -h 48 logo-only.svg
4 | inkscape -z -e logo-96.png -w 96 -h 96 logo-only.svg
5 | inkscape -z -e logo-400.png -w 400 -h 400 logo-only.svg
6 |
7 | inkscape -z -e logo-mc-96.png -w 96 -h 96 logo-only-mc.svg
8 | inkscape -z -e logo-mc-400.png -w 400 -h 400 logo-only-mc.svg
9 |
--------------------------------------------------------------------------------
/modules/addonlib/src/main/scala/docspell/addons/AddonRef.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.addons
8 |
9 | case class AddonRef(archive: AddonArchive, args: String)
10 |
--------------------------------------------------------------------------------
/modules/addonlib/src/main/scala/docspell/addons/package.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell
8 |
9 | import cats.data.Kleisli
10 |
11 | package object addons {
12 |
13 | type AddonExec[F[_]] = Kleisli[F, InputEnv, AddonExecutionResult]
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/modules/addonlib/src/test/resources/docspell-addon-single-file.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/addonlib/src/test/resources/docspell-addon-single-file.zip
--------------------------------------------------------------------------------
/modules/addonlib/src/test/resources/docspell-dummy-addon-master.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/addonlib/src/test/resources/docspell-dummy-addon-master.zip
--------------------------------------------------------------------------------
/modules/addonlib/src/test/resources/minimal-addon.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/addonlib/src/test/resources/minimal-addon.zip
--------------------------------------------------------------------------------
/modules/analysis/src/main/scala/docspell/analysis/NlpSettings.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.analysis
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common._
12 |
13 | case class NlpSettings(lang: Language, highRecall: Boolean, regexNer: Option[Path])
14 |
--------------------------------------------------------------------------------
/modules/analysis/src/main/scala/docspell/analysis/classifier/ClassifierModel.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.analysis.classifier
8 |
9 | import fs2.io.file.Path
10 |
11 | case class ClassifierModel(model: Path)
12 |
--------------------------------------------------------------------------------
/modules/analysis/src/main/scala/docspell/analysis/classifier/TextClassifierConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.analysis.classifier
8 |
9 | import cats.data.NonEmptyList
10 | import fs2.io.file.Path
11 |
12 | case class TextClassifierConfig(
13 | workingDir: Path,
14 | classifierConfigs: NonEmptyList[Map[String, String]]
15 | )
16 |
--------------------------------------------------------------------------------
/modules/analysis/src/test/resources/test.ser.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/analysis/src/test/resources/test.ser.gz
--------------------------------------------------------------------------------
/modules/analysis/src/test/scala/docspell/analysis/Env.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.analysis
8 |
9 | object Env {
10 |
11 | def isCI = bool("CI")
12 |
13 | def bool(key: String): Boolean =
14 | string(key).contains("true")
15 |
16 | def string(key: String): Option[String] =
17 | Option(System.getenv(key)).filter(_.nonEmpty)
18 | }
19 |
--------------------------------------------------------------------------------
/modules/backend/src/main/scala/docspell/backend/Common.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.backend
8 |
9 | import cats.effect._
10 |
11 | import org.mindrot.jbcrypt.BCrypt
12 |
13 | object Common {
14 |
15 | def genSaltString[F[_]: Sync]: F[String] =
16 | Sync[F].delay(BCrypt.gensalt())
17 | }
18 |
--------------------------------------------------------------------------------
/modules/backend/src/main/scala/docspell/backend/joex/AddonEnvConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.backend.joex
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.addons.AddonExecutorConfig
12 |
13 | final case class AddonEnvConfig(
14 | workingDir: Path,
15 | cacheDir: Path,
16 | executorConfig: AddonExecutorConfig
17 | )
18 |
--------------------------------------------------------------------------------
/modules/backend/src/main/scala/docspell/backend/signup/RegisterData.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.backend.signup
8 | import docspell.common._
9 |
10 | case class RegisterData(
11 | collName: Ident,
12 | login: Ident,
13 | password: Password,
14 | invite: Option[Ident]
15 | )
16 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/MailSendConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common
8 |
9 | case class MailSendConfig(listId: String)
10 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/NerDateLabel.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common
8 |
9 | import java.time.LocalDate
10 |
11 | case class NerDateLabel(date: LocalDate, label: NerLabel) {}
12 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/Pools.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common
8 |
9 | import scala.concurrent.ExecutionContext
10 |
11 | /** Captures thread pools to use in an application. */
12 | case class Pools(
13 | connectEC: ExecutionContext
14 | // httpClientEC: ExecutionContext,
15 | // restEC: ExecutionContext
16 | )
17 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/TaskArguments.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common
8 |
9 | /** A marker trait for task arguments.
10 | *
11 | * Arguments for tasks are stored as a JSON blob in the database. Changes in structure
12 | * requires a corresponding database migration.
13 | */
14 | trait TaskArguments
15 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/bc/BackendCommandRunner.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common.bc
8 |
9 | import docspell.common.CollectiveId
10 |
11 | trait BackendCommandRunner[F[_], A] {
12 |
13 | def run(collective: CollectiveId, cmd: BackendCommand): F[A]
14 |
15 | def runAll(collective: CollectiveId, cmds: List[BackendCommand]): F[A]
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/modules/common/src/main/scala/docspell/common/syntax/package.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.common
8 |
9 | package object syntax {
10 |
11 | val either = EitherSyntax
12 | val stream = StreamSyntax
13 | val string = StringSyntax
14 | val file = FileSyntax
15 |
16 | object all extends EitherSyntax with StreamSyntax with StringSyntax with FileSyntax
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/modules/config/src/test/resources/reference.conf:
--------------------------------------------------------------------------------
1 | docspell.server {
2 | bind {
3 | port = 7880
4 | }
5 | }
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/extern/OcrMyPdfConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.extern
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common.exec.ExternalCommand
12 |
13 | case class OcrMyPdfConfig(
14 | enabled: Boolean,
15 | command: ExternalCommand,
16 | workingDir: Path
17 | )
18 |
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/extern/TesseractConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.extern
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common.exec.ExternalCommand
12 |
13 | case class TesseractConfig(command: ExternalCommand, workingDir: Path)
14 |
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/extern/UnoconvConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.extern
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common.exec.ExternalCommand
12 |
13 | case class UnoconvConfig(command: ExternalCommand, workingDir: Path)
14 |
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/extern/WeasyprintConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.extern
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common.exec.ExternalCommand
12 |
13 | case class WeasyprintConfig(command: ExternalCommand, workingDir: Path)
14 |
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/extern/WkHtmlPdfConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.extern
8 |
9 | import fs2.io.file.Path
10 |
11 | import docspell.common.exec.ExternalCommand
12 |
13 | case class WkHtmlPdfConfig(command: ExternalCommand, workingDir: Path)
14 |
--------------------------------------------------------------------------------
/modules/convert/src/main/scala/docspell/convert/flexmark/MarkdownConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.convert.flexmark
8 |
9 | case class MarkdownConfig(internalCss: String)
10 |
--------------------------------------------------------------------------------
/modules/extract/src/main/scala/docspell/extract/ExtractConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.extract
8 |
9 | import docspell.extract.ocr.OcrConfig
10 | import docspell.extract.pdfbox.PreviewConfig
11 |
12 | case class ExtractConfig(ocr: OcrConfig, pdf: PdfConfig, preview: PreviewConfig)
13 |
--------------------------------------------------------------------------------
/modules/extract/src/main/scala/docspell/extract/PdfConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.extract
8 |
9 | case class PdfConfig(minTextLen: Int)
10 |
--------------------------------------------------------------------------------
/modules/extract/src/main/scala/docspell/extract/pdfbox/PreviewConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.extract.pdfbox
8 |
9 | case class PreviewConfig(dpi: Float)
10 |
--------------------------------------------------------------------------------
/modules/files/src/main/java/org/apache/tika/parser/txt/IOUtils.java:
--------------------------------------------------------------------------------
1 | package org.apache.tika.parser.txt;
2 |
3 | import java.io.InputStream;
4 | import java.io.IOException;
5 |
6 | public final class IOUtils {
7 |
8 | public static long readFully(InputStream in, byte[] buffer) throws IOException {
9 | return in.read(buffer, 0, buffer.length);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/modules/files/src/main/scala/docspell/files/Dimension.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.files
8 |
9 | case class Dimension(width: Int, height: Int) {
10 |
11 | def product = width * height
12 |
13 | def toAwtDimension: java.awt.Dimension =
14 | new java.awt.Dimension(width, height)
15 | }
16 |
--------------------------------------------------------------------------------
/modules/files/src/test/resources/bombs/20K-gray.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/bombs/20K-gray.jpeg
--------------------------------------------------------------------------------
/modules/files/src/test/resources/bombs/20K-gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/bombs/20K-gray.png
--------------------------------------------------------------------------------
/modules/files/src/test/resources/bombs/20K-rgb.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/bombs/20K-rgb.jpeg
--------------------------------------------------------------------------------
/modules/files/src/test/resources/bombs/20K-rgb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/bombs/20K-rgb.png
--------------------------------------------------------------------------------
/modules/files/src/test/resources/camera/letter-en.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/camera/letter-en.jpg
--------------------------------------------------------------------------------
/modules/files/src/test/resources/camera/letter-en.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/camera/letter-en.png
--------------------------------------------------------------------------------
/modules/files/src/test/resources/camera/letter-en.tiff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/camera/letter-en.tiff
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/letter-ita.txt:
--------------------------------------------------------------------------------
1 | Pontremoli, 9 aprile 2013
2 |
3 | Spettabile Villa Albicocca
4 | Via Francigena, 9
5 | 55100 Pontetetto (LU)
6 |
7 | Oggetto: Prenotazione
8 |
9 | Gentile Direttore,
10 |
11 | Vorrei prenotare una camera matrimoniale …….
12 |
13 | In attesa di una Sua pronta risposta, La saluto cordialmente
14 |
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.doc
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.docx
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.ods:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.ods
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.odt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.odt
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.xls
--------------------------------------------------------------------------------
/modules/files/src/test/resources/examples/sample.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/examples/sample.xlsx
--------------------------------------------------------------------------------
/modules/files/src/test/resources/keywords.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/keywords.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/large-file.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/large-file.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/letter-de.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/letter-de.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/letter-en.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/letter-en.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/letters.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/letters.zip
--------------------------------------------------------------------------------
/modules/files/src/test/resources/scanner/jfif.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/scanner/jfif.jpg
--------------------------------------------------------------------------------
/modules/files/src/test/resources/scanner/pdf13.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/scanner/pdf13.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/scanner/pdfa14.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/scanner/pdfa14.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/secured/encrypted-test123.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/secured/encrypted-test123.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/secured/protected-test123.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/secured/protected-test123.pdf
--------------------------------------------------------------------------------
/modules/files/src/test/resources/zip-dirs-one.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/zip-dirs-one.zip
--------------------------------------------------------------------------------
/modules/files/src/test/resources/zip-dirs.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/files/src/test/resources/zip-dirs.zip
--------------------------------------------------------------------------------
/modules/files/src/test/scala/docspell/files/ExampleFilesSupport.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.files
8 |
9 | import docspell.common._
10 |
11 | trait ExampleFilesSupport {
12 |
13 | def createUrl(resource: String): LenientUri =
14 | Option(getClass.getResource("/" + resource)) match {
15 | case Some(u) => LenientUri.fromJava(u)
16 | case None => sys.error(s"Resource '$resource' not found")
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/modules/fts-psql/src/main/scala/docspell/ftspsql/SearchSummary.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftspsql
8 |
9 | case class SearchSummary(count: Long, maxScore: Double)
10 |
--------------------------------------------------------------------------------
/modules/fts-solr/src/main/scala/docspell/ftssolr/DocIdResult.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftssolr
8 |
9 | import docspell.common._
10 |
11 | final case class DocIdResult(ids: List[Ident]) {
12 |
13 | def toSetFolder(folder: Option[Ident]): List[SetFolder] =
14 | ids.map(id => SetFolder(id, folder))
15 | }
16 |
--------------------------------------------------------------------------------
/modules/fts-solr/src/main/scala/docspell/ftssolr/SetFields.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftssolr
8 |
9 | import docspell.ftsclient._
10 |
11 | final case class SetFields(td: TextData)
12 |
--------------------------------------------------------------------------------
/modules/fts-solr/src/main/scala/docspell/ftssolr/SetFolder.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftssolr
8 |
9 | import docspell.common._
10 |
11 | final case class SetFolder(docId: Ident, folder: Option[Ident])
12 |
--------------------------------------------------------------------------------
/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftssolr
8 |
9 | import docspell.common._
10 |
11 | final case class SolrConfig(
12 | url: LenientUri,
13 | commitWithin: Int,
14 | logVerbose: Boolean,
15 | defType: String,
16 | qOp: String
17 | )
18 |
19 | object SolrConfig {}
20 |
--------------------------------------------------------------------------------
/modules/fts-solr/src/main/scala/docspell/ftssolr/VersionDoc.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.ftssolr
8 |
9 | final case class VersionDoc(id: String, currentVersion: Int)
10 |
11 | object VersionDoc {
12 |
13 | object Fields {
14 | val id = Field("id")
15 | val currentVersion = Field("current_version_i")
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/modules/joex/src/main/scala/docspell/joex/fts/package.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.joex
8 |
9 | import cats.data.Kleisli
10 |
11 | package object fts {
12 |
13 | /** Some work that must be done to advance the schema of the fulltext index. */
14 | type FtsWork[F[_]] = Kleisli[F, FtsContext[F], Unit]
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/modules/notification/api/src/main/scala/docspell/notification/api/EventMessage.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.notification.api
8 |
9 | final case class EventMessage(title: String, body: String)
10 |
11 | object EventMessage {
12 | val empty: EventMessage = EventMessage("", "")
13 | }
14 |
--------------------------------------------------------------------------------
/modules/notification/api/src/main/scala/docspell/notification/api/EventReader.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.notification.api
8 |
9 | import cats.data.Kleisli
10 | import fs2.Stream
11 |
12 | trait EventReader[F[_]] {
13 |
14 | /** Stream to allow processing of events offered via a `EventSink` */
15 | def consume(maxConcurrent: Int)(run: Kleisli[F, Event, Unit]): Stream[F, Nothing]
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/modules/notification/impl/src/main/scala/docspell/notification/impl/context/Syntax.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.notification.impl.context
8 |
9 | import docspell.notification.api.Event
10 |
11 | object Syntax {
12 |
13 | implicit final class EventOps(ev: Event) {
14 |
15 | def itemUrl: Option[String] =
16 | ev.baseUrl.map(_ / "app" / "item").map(_.asString)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/modules/pubsub/naive/src/main/scala/docspell/pubsub/naive/PubSubConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.pubsub.naive
8 |
9 | import docspell.common.{Ident, LenientUri}
10 |
11 | import org.http4s.Header
12 |
13 | case class PubSubConfig(
14 | nodeId: Ident,
15 | url: LenientUri,
16 | subscriberQueueSize: Int,
17 | reqHeader: Header.Raw
18 | )
19 |
--------------------------------------------------------------------------------
/modules/restserver/src/main/scala/docspell/restserver/http4s/EnvMiddleware.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.restserver.http4s
8 |
9 | import cats.Functor
10 |
11 | import docspell.common._
12 |
13 | import org.http4s._
14 |
15 | object EnvMiddleware {
16 |
17 | def apply[F[_]: Functor](in: HttpRoutes[F]): HttpRoutes[F] =
18 | NoCacheMiddleware.route(EnvMode.current.isDev)(in)
19 | }
20 |
--------------------------------------------------------------------------------
/modules/restserver/src/main/scala/docspell/restserver/ws/InputMessage.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.restserver.ws
8 |
9 | sealed trait InputMessage
10 |
11 | object InputMessage {}
12 |
--------------------------------------------------------------------------------
/modules/restserver/src/main/scala/docspell/restserver/ws/OutputEventEncoder.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.restserver.ws
8 |
9 | trait OutputEventEncoder[A] {
10 | def encode(a: A): OutputEvent
11 | }
12 |
13 | object OutputEventEncoder {
14 | def apply[A](implicit e: OutputEventEncoder[A]): OutputEventEncoder[A] = e
15 |
16 | def instance[A](f: A => OutputEvent): OutputEventEncoder[A] =
17 | (a: A) => f(a)
18 | }
19 |
--------------------------------------------------------------------------------
/modules/scheduler/api/src/main/scala/docspell/scheduler/JobStoreModule.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.scheduler
8 |
9 | import docspell.scheduler.usertask.UserTaskStore
10 |
11 | trait JobStoreModule[F[_]] {
12 |
13 | def userTasks: UserTaskStore[F]
14 | def jobs: JobStore[F]
15 | }
16 |
--------------------------------------------------------------------------------
/modules/scheduler/api/src/main/scala/docspell/scheduler/PeriodicSchedulerConfig.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.scheduler
8 |
9 | import docspell.common._
10 |
11 | case class PeriodicSchedulerConfig(
12 | name: Ident,
13 | wakeupPeriod: Duration
14 | )
15 |
16 | object PeriodicSchedulerConfig {
17 | def default(id: Ident): PeriodicSchedulerConfig =
18 | PeriodicSchedulerConfig(id, Duration.minutes(10))
19 | }
20 |
--------------------------------------------------------------------------------
/modules/scheduler/api/src/main/scala/docspell/scheduler/SchedulerModule.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.scheduler
8 |
9 | trait SchedulerModule[F[_]] {
10 | def scheduler: Scheduler[F]
11 | def periodicScheduler: PeriodicScheduler[F]
12 | }
13 |
--------------------------------------------------------------------------------
/modules/scheduler/api/src/main/scala/docspell/scheduler/msg/JobsNotify.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.scheduler.msg
8 |
9 | import docspell.pubsub.api.{Topic, TypedTopic}
10 |
11 | /** A generic notification to the job executors to look for new work. */
12 | object JobsNotify {
13 | def apply(): TypedTopic[Unit] =
14 | TypedTopic[Unit](Topic("jobs-notify"))
15 | }
16 |
--------------------------------------------------------------------------------
/modules/scheduler/api/src/main/scala/docspell/scheduler/msg/PeriodicTaskNotify.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.scheduler.msg
8 |
9 | import docspell.pubsub.api.{Topic, TypedTopic}
10 |
11 | /** A generic notification to the periodic task scheduler to look for new work. */
12 | object PeriodicTaskNotify {
13 | def apply(): TypedTopic[Unit] =
14 | TypedTopic[Unit](Topic("periodic-task-notify"))
15 | }
16 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.10.0__attachment_preview.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_preview" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "created" timestamp not null,
6 | foreign key ("file_id") references "filemeta"("id"),
7 | foreign key ("id") references "attachment"("attachid")
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.11.0__pdf_pages.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "attachmentmeta"
2 | ADD COLUMN "page_count" smallint;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.12.0__upload_data.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "file_filter" varchar(254) NULL;
3 |
4 | CREATE TABLE "tagsource" (
5 | "id" varchar(254) not null primary key,
6 | "source_id" varchar(254) not null,
7 | "tag_id" varchar(254) not null,
8 | unique ("source_id", "tag_id"),
9 | foreign key ("source_id") references "source"("sid"),
10 | foreign key ("tag_id") references "tag"("tid")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.14.0__person_org.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "person"
2 | ADD COLUMN "oid" varchar(254);
3 |
4 | ALTER TABLE "person"
5 | ADD CONSTRAINT fk_person_organization
6 | FOREIGN KEY ("oid")
7 | REFERENCES "organization"("oid");
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.15.0__rememberme.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "rememberme" (
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "login" varchar(254) not null,
5 | "created" timestamp not null,
6 | "uses" int not null,
7 | FOREIGN KEY ("cid","login") REFERENCES "user_"("cid","login")
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.16.0__add_imap_oauth.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "userimap"
2 | ADD COLUMN "imap_oauth2" boolean NULL;
3 |
4 | UPDATE "userimap" SET "imap_oauth2" = false;
5 |
6 | ALTER TABLE "userimap"
7 | ALTER COLUMN "imap_oauth2" SET NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.19.0__add_classify_meta.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "item_proposal" (
2 | "itemid" varchar(254) not null primary key,
3 | "classifier_proposals" text not null,
4 | "classifier_tags" text not null,
5 | "created" timestamp not null,
6 | foreign key ("itemid") references "item"("itemid")
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.19.1__remove_enabled.sql:
--------------------------------------------------------------------------------
1 | alter table "classifier_setting"
2 | drop column "enabled";
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.2.0__origin_source.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_source" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "created" timestamp not null,
6 | foreign key ("file_id") references "filemeta"("id"),
7 | foreign key ("id") references "attachment"("attachid")
8 | );
9 |
10 | INSERT INTO "attachment_source"
11 | SELECT "attachid","filemetaid","name","created" FROM "attachment";
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.20.0__personuse.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "person"
2 | ADD COLUMN "person_use" varchar(254);
3 |
4 | UPDATE "person" SET "person_use" = 'concerning' where "concerning" = true;
5 | UPDATE "person" SET "person_use" = 'correspondent' where "concerning" = false;
6 | UPDATE "person" SET "person_use" = 'both' where "concerning" is null;
7 |
8 | ALTER TABLE "person"
9 | DROP COLUMN "concerning";
10 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.20.1__equipment_description.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD COLUMN "notes" text;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.20.2__org_shortname.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "organization"
2 | ADD COLUMN "short_name" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.20.3__node_seen.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "node"
2 | ADD COLUMN "not_found" int not null default 0;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.20.4__source_lang.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "doc_lang" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.21.0__cast_function.sql:
--------------------------------------------------------------------------------
1 | DROP ALIAS IF EXISTS CAST_TO_NUMERIC;
2 | CREATE ALIAS CAST_TO_NUMERIC FOR "docspell.store.impl.h2.CastNumericFun.castToNumeric";
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.21.1__equip_org_use.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD COLUMN "equip_use" varchar(254);
3 |
4 | UPDATE "equipment" SET "equip_use" = 'concerning';
5 |
6 | ALTER TABLE "equipment"
7 | ALTER COLUMN "equip_use" SET NOT NULL;
8 |
9 |
10 | ALTER TABLE "organization"
11 | ADD COLUMN "org_use" varchar(254);
12 |
13 | UPDATE "organization" SET "org_use" = 'correspondent';
14 |
15 | ALTER TABLE "organization"
16 | ALTER COLUMN "org_use" SET NOT NULL;
17 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.22.0__add_task_name.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "periodic_task"
2 | ADD COLUMN "summary" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.23.0__clientsettings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "client_settings" (
2 | "id" varchar(254) not null primary key,
3 | "client_id" varchar(254) not null,
4 | "user_id" varchar(254) not null,
5 | "settings_data" text not null,
6 | "created" timestamp not null,
7 | "updated" timestamp not null,
8 | foreign key ("user_id") references "user_"("uid") on delete cascade,
9 | unique ("client_id", "user_id")
10 | );
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.24.0__drop_fts_migration.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE "fts_migration";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.25.0__add_empty_trash.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "empty_trash_setting" (
2 | "cid" varchar(254) not null primary key,
3 | "schedule" varchar(254) not null,
4 | "created" timestamp not null,
5 | foreign key ("cid") references "collective"("cid")
6 | );
7 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.25.1__fix_periodic_submitter_value.sql:
--------------------------------------------------------------------------------
1 | UPDATE "periodic_task"
2 | SET submitter = group_
3 | WHERE submitter = 'learn-classifier';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.25.2__add_trash_min_age.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "empty_trash_setting"
2 | ADD COLUMN "min_age" bigint;
3 |
4 | UPDATE "empty_trash_setting"
5 | SET "min_age" = 604800000;
6 |
7 | ALTER TABLE "empty_trash_setting"
8 | ALTER COLUMN "min_age" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.25.3__delete_corrupt_trash_task.sql:
--------------------------------------------------------------------------------
1 | -- note this is only for users of nightly releases
2 | DELETE FROM "periodic_task"
3 | WHERE "task" = 'empty-trash';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.25.4__add_source_attachonly.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "attachments_only" BOOLEAN NULL;
3 |
4 | UPDATE "source"
5 | SET "attachments_only" = FALSE;
6 |
7 | ALTER TABLE "source"
8 | ALTER COLUMN "attachments_only" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.26.0__missing_indexes.sql:
--------------------------------------------------------------------------------
1 | CREATE INDEX "joblog_id_created_idx" ON "joblog"("jid", "created");
2 | -- H2 doesn't support coalesce in create index
3 | --CREATE INDEX "item_itemdate_created_idx" ON "item"(coalesce("itemdate", "created"));
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.26.1__totp.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "totp" (
2 | "user_id" varchar(254) not null primary key,
3 | "enabled" boolean not null,
4 | "secret" varchar(254) not null,
5 | "created" timestamp not null,
6 | FOREIGN KEY ("user_id") REFERENCES "user_"("uid") ON DELETE CASCADE
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.26.2__openid.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "user_"
2 | ADD COLUMN "account_source" varchar(254);
3 |
4 | UPDATE "user_"
5 | SET "account_source" = 'local';
6 |
7 | ALTER TABLE "user_"
8 | ALTER COLUMN "account_source" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.27.0__collective_passwords.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "collective_password" (
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "pass" varchar(254) not null,
5 | "created" timestamp not null,
6 | foreign key ("cid") references "collective"("cid") on delete cascade
7 | )
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.27.1__item_share.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "item_share" (
2 | "id" varchar(254) not null primary key,
3 | "user_id" varchar(254) not null,
4 | "name" varchar(254),
5 | "query" varchar(2000) not null,
6 | "enabled" boolean not null,
7 | "pass" varchar(254),
8 | "publish_at" timestamp not null,
9 | "publish_until" timestamp not null,
10 | "views" int not null,
11 | "last_access" timestamp,
12 | foreign key ("user_id") references "user_"("uid") on delete cascade
13 | )
14 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.28.0__pubsub.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "pubsub" (
2 | "id" varchar(254) not null primary key,
3 | "node_id" varchar(254) not null,
4 | "url" varchar(254) not null,
5 | "topic" varchar(254) not null,
6 | "counter" int not null,
7 | unique("url", "topic")
8 | )
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.28.1__intern_settings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "internal_setting" (
2 | "id" varchar(254) not null primary key,
3 | "internal_route_key" varchar(254) not null
4 | )
5 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.30.0__clientsettings_collective.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "client_settings" RENAME TO "client_settings_user";
2 |
3 | CREATE TABLE "client_settings_collective" (
4 | "id" varchar(254) not null primary key,
5 | "client_id" varchar(254) not null,
6 | "cid" varchar(254) not null,
7 | "settings_data" text not null,
8 | "created" timestamp not null,
9 | "updated" timestamp not null,
10 | foreign key ("cid") references "collective"("cid") on delete cascade,
11 | unique ("client_id", "cid")
12 | );
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.31.1__gotify_prio.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "notification_channel_gotify"
2 | ADD COLUMN "priority" integer;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.32.0__notification_channel_name.sql:
--------------------------------------------------------------------------------
1 | alter table "notification_channel_mail"
2 | add column "name" varchar(254);
3 |
4 | alter table "notification_channel_gotify"
5 | add column "name" varchar(254);
6 |
7 | alter table "notification_channel_matrix"
8 | add column "name" varchar(254);
9 |
10 | alter table "notification_channel_http"
11 | add column "name" varchar(254);
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.35.0__download_query.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "download_query"(
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "file_id" varchar(254) not null,
5 | "file_count" int not null,
6 | "created" timestamp not null,
7 | "last_access" timestamp,
8 | "access_count" int not null,
9 | foreign key ("cid") references "collective"("cid"),
10 | foreign key ("file_id") references "filemeta"("file_id")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.35.1__password_length.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "userimap"
2 | ALTER COLUMN "imap_password" TYPE varchar;
3 |
4 | ALTER TABLE "useremail"
5 | ALTER COLUMN "smtp_password" TYPE varchar;
6 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.38.1__remove_unused_column.sql:
--------------------------------------------------------------------------------
1 | alter table "item" drop column "inreplyto";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.39.3__rename_value.sql:
--------------------------------------------------------------------------------
1 | alter table "contact" rename column "value" to "value_";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.4.0__attachment_archive.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_archive" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "message_id" varchar(254),
6 | "created" timestamp not null,
7 | foreign key ("file_id") references "filemeta"("id"),
8 | foreign key ("id") references "attachment"("attachid")
9 | );
10 |
11 | CREATE INDEX "attachment_archive_message_id_idx"
12 | ON "attachment_archive"("message_id");
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.5.0__userimap.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "userimap" (
2 | "id" varchar(254) not null primary key,
3 | "uid" varchar(254) not null,
4 | "name" varchar(254) not null,
5 | "imap_host" varchar(254) not null,
6 | "imap_port" int,
7 | "imap_user" varchar(254),
8 | "imap_password" varchar(254),
9 | "imap_ssl" varchar(254) not null,
10 | "imap_certcheck" boolean not null,
11 | "created" timestamp not null,
12 | unique ("uid", "name"),
13 | foreign key ("uid") references "user_"("uid")
14 | );
15 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.6.0__integration_enabled.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "collective"
2 | ADD COLUMN "integration_enabled" BOOLEAN;
3 |
4 | UPDATE "collective" SET "integration_enabled" = true;
5 |
6 | ALTER TABLE "collective"
7 | ALTER COLUMN "integration_enabled" SET NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.7.0__fts-migration.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "fts_migration" (
2 | "id" varchar(254) not null primary key,
3 | "version" int not null,
4 | "fts_engine" varchar(254) not null,
5 | "description" varchar(254) not null,
6 | "created" timestamp not null
7 | );
8 |
9 | CREATE UNIQUE INDEX "fts_migration_version_engine_idx"
10 | ON "fts_migration"("version", "fts_engine");
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.9.1__classifier.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "classifier_setting" (
2 | "cid" varchar(254) not null primary key,
3 | "enabled" boolean not null,
4 | "schedule" varchar(254) not null,
5 | "category" varchar(254) not null,
6 | "item_count" int not null,
7 | "file_id" varchar(254),
8 | "created" timestamp not null,
9 | foreign key ("cid") references "collective"("cid"),
10 | foreign key ("file_id") references "filemeta"("id")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.9.3__joblog_counter.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "joblog"
2 | ADD COLUMN "counter" bigint generated always as identity;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/h2/V1.9.4__unique_equipments.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD CONSTRAINT "equipment_cid_name_key"
3 | UNIQUE ("cid", "name");
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.10.0__attachment_preview.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `attachment_preview` (
2 | `id` varchar(254) not null primary key,
3 | `file_id` varchar(254) not null,
4 | `filename` varchar(254),
5 | `created` timestamp not null,
6 | foreign key (`file_id`) references `filemeta`(`id`),
7 | foreign key (`id`) references `attachment`(`attachid`)
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.11.0__pdf_pages.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `attachmentmeta`
2 | ADD COLUMN (`page_count` SMALLINT);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.12.0__upload_data.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `source`
2 | ADD COLUMN `file_filter` varchar(254) NULL;
3 |
4 | CREATE TABLE `tagsource` (
5 | `id` varchar(254) not null primary key,
6 | `source_id` varchar(254) not null,
7 | `tag_id` varchar(254) not null,
8 | unique (`source_id`, `tag_id`),
9 | foreign key (`source_id`) references `source`(`sid`),
10 | foreign key (`tag_id`) references `tag`(`tid`)
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.14.0__person_org.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `person`
2 | ADD COLUMN `oid` varchar(254);
3 |
4 | ALTER TABLE `person`
5 | ADD CONSTRAINT fk_person_organization
6 | FOREIGN KEY (`oid`)
7 | REFERENCES `organization`(`oid`);
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.15.0__rememberme.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `rememberme` (
2 | `id` varchar(254) not null primary key,
3 | `cid` varchar(254) not null,
4 | `login` varchar(254) not null,
5 | `created` timestamp not null,
6 | `uses` int not null,
7 | FOREIGN KEY (`cid`,`login`) REFERENCES `user_`(`cid`,`login`)
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.16.0__add_imap_oauth.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `userimap`
2 | ADD COLUMN (`imap_oauth2` boolean);
3 |
4 | UPDATE `userimap` SET `imap_oauth2` = false;
5 |
6 | ALTER TABLE `userimap`
7 | MODIFY `imap_oauth2` boolean NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.19.0__add_classify_meta.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `item_proposal` (
2 | `itemid` varchar(254) not null primary key,
3 | `classifier_proposals` mediumtext not null,
4 | `classifier_tags` mediumtext not null,
5 | `created` timestamp not null,
6 | foreign key (`itemid`) references `item`(`itemid`)
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.19.1__remove_enabled.sql:
--------------------------------------------------------------------------------
1 | alter table `classifier_setting`
2 | drop column `enabled`;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.2.0__origin_source.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `attachment_source` (
2 | `id` varchar(254) not null primary key,
3 | `file_id` varchar(254) not null,
4 | `filename` varchar(254),
5 | `created` timestamp not null,
6 | foreign key (`file_id`) references `filemeta`(`id`),
7 | foreign key (`id`) references `attachment`(`attachid`)
8 | );
9 |
10 | INSERT INTO `attachment_source`
11 | SELECT `attachid`,`filemetaid`,`name`,`created` FROM `attachment`;
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.20.0__personuse.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `person`
2 | ADD COLUMN `person_use` varchar(254);
3 |
4 | UPDATE `person` SET `person_use` = 'concerning' where `concerning` = true;
5 | UPDATE `person` SET `person_use` = 'correspondent' where `concerning` = false;
6 | UPDATE `person` SET `person_use` = 'both' where `concerning` is null;
7 |
8 | ALTER TABLE `person`
9 | DROP COLUMN `concerning`;
10 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.20.1__equipment_description.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `equipment`
2 | ADD COLUMN `notes` mediumtext;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.20.2__org_shortname.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `organization`
2 | ADD COLUMN `short_name` varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.20.3__node_seen.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `node`
2 | ADD COLUMN `not_found` int not null default 0;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.20.4__source_lang.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `source`
2 | ADD COLUMN `doc_lang` varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.21.0__cast_function.sql:
--------------------------------------------------------------------------------
1 | -- Create a function to cast to a numeric, if an error occurs return null
2 | -- Could not get it working with decimal type, so using double
3 | create or replace function CAST_TO_NUMERIC (s char(255))
4 | returns double deterministic
5 | return cast(s as double);
6 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.21.1__equip_org_use.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `equipment`
2 | ADD COLUMN `equip_use` varchar(254);
3 |
4 | UPDATE `equipment` SET `equip_use` = 'concerning';
5 |
6 | ALTER TABLE `equipment`
7 | MODIFY COLUMN `equip_use` varchar(254) NOT NULL;
8 |
9 |
10 | ALTER TABLE `organization`
11 | ADD COLUMN `org_use` varchar(254);
12 |
13 | UPDATE `organization` SET `org_use` = 'correspondent';
14 |
15 | ALTER TABLE `organization`
16 | MODIFY COLUMN `org_use` varchar(254) NOT NULL;
17 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.22.0__add_task_name.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `periodic_task`
2 | ADD COLUMN `summary` varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.23.0__clientsettings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `client_settings` (
2 | `id` varchar(254) not null primary key,
3 | `client_id` varchar(254) not null,
4 | `user_id` varchar(254) not null,
5 | `settings_data` longtext not null,
6 | `created` timestamp not null,
7 | `updated` timestamp not null,
8 | foreign key (`user_id`) references `user_`(`uid`) on delete cascade,
9 | unique (`client_id`, `user_id`)
10 | );
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.24.0__drop_fts_migration.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE `fts_migration`;
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.25.0__add_empty_trash.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `empty_trash_setting` (
2 | `cid` varchar(254) not null primary key,
3 | `schedule` varchar(254) not null,
4 | `created` timestamp not null,
5 | foreign key (`cid`) references `collective`(`cid`)
6 | );
7 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.25.1__fix_periodic_submitter_value.sql:
--------------------------------------------------------------------------------
1 | UPDATE `periodic_task`
2 | SET submitter = group_
3 | WHERE submitter = 'learn-classifier';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.25.2__add_trash_min_age.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `empty_trash_setting`
2 | ADD COLUMN (`min_age` bigint);
3 |
4 | UPDATE `empty_trash_setting`
5 | SET `min_age` = 604800000;
6 |
7 | ALTER TABLE `empty_trash_setting`
8 | MODIFY `min_age` bigint NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.25.3__delete_corrupt_trash_task.sql:
--------------------------------------------------------------------------------
1 | -- note this is only for users of nightly releases
2 | DELETE FROM `periodic_task`
3 | WHERE `task` = 'empty-trash';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.25.4__add_source_attachonly.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `source`
2 | ADD COLUMN (`attachments_only` BOOLEAN);
3 |
4 | UPDATE `source`
5 | SET `attachments_only` = false;
6 |
7 | ALTER TABLE `source`
8 | MODIFY `attachments_only` BOOLEAN NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.26.0__missing_indexes.sql:
--------------------------------------------------------------------------------
1 | CREATE INDEX `joblog_id_created_idx` ON `joblog`(`jid`, `created`);
2 | -- MariaDB doesn't support coalesce in index
3 | --CREATE INDEX `item_itemdate_created_idx` ON `item`(coalesce(`itemdate`, `created`));
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.26.1__totp.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `totp` (
2 | `user_id` varchar(254) not null primary key,
3 | `enabled` boolean not null,
4 | `secret` varchar(254) not null,
5 | `created` timestamp not null,
6 | FOREIGN KEY (`user_id`) REFERENCES `user_`(`uid`) ON DELETE CASCADE
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.26.2__openid.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `user_`
2 | ADD COLUMN (`account_source` varchar(254));
3 |
4 | UPDATE `user_`
5 | SET `account_source` = 'local';
6 |
7 | ALTER TABLE `user_`
8 | MODIFY `account_source` varchar(254) NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.27.0__collective_passwords.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `collective_password` (
2 | `id` varchar(254) not null primary key,
3 | `cid` varchar(254) not null,
4 | `pass` varchar(254) not null,
5 | `created` timestamp not null,
6 | foreign key (`cid`) references `collective`(`cid`) on delete cascade
7 | )
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.27.1__item_share.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `item_share` (
2 | `id` varchar(254) not null primary key,
3 | `user_id` varchar(254) not null,
4 | `name` varchar(254),
5 | `query` varchar(2000) not null,
6 | `enabled` boolean not null,
7 | `pass` varchar(254),
8 | `publish_at` timestamp not null,
9 | `publish_until` timestamp not null,
10 | `views` int not null,
11 | `last_access` timestamp,
12 | foreign key (`user_id`) references `user_`(`uid`) on delete cascade
13 | )
14 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.28.0__pubsub.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `pubsub` (
2 | `id` varchar(254) not null primary key,
3 | `node_id` varchar(254) not null,
4 | `url` varchar(254) not null,
5 | `topic` varchar(254) not null,
6 | `counter` int not null,
7 | unique(`url`, `topic`)
8 | )
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.28.1__intern_settings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `internal_setting` (
2 | `id` varchar(254) not null primary key,
3 | `internal_route_key` varchar(254) not null
4 | )
5 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.30.0__clientsettings_collective.sql:
--------------------------------------------------------------------------------
1 | RENAME TABLE `client_settings` TO `client_settings_user`;
2 |
3 | CREATE TABLE `client_settings_collective` (
4 | `id` varchar(254) not null primary key,
5 | `client_id` varchar(254) not null,
6 | `cid` varchar(254) not null,
7 | `settings_data` text not null,
8 | `created` timestamp not null,
9 | `updated` timestamp not null,
10 | foreign key (`cid`) references `collective`(`cid`) on delete cascade,
11 | unique (`client_id`, `cid`)
12 | );
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.31.1__gotify_prio.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `notification_channel_gotify`
2 | ADD COLUMN `priority` tinyint unsigned;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.32.0__notification_channel_name.sql:
--------------------------------------------------------------------------------
1 | alter table `notification_channel_mail`
2 | add column `name` varchar(254);
3 |
4 | alter table `notification_channel_gotify`
5 | add column `name` varchar(254);
6 |
7 | alter table `notification_channel_matrix`
8 | add column `name` varchar(254);
9 |
10 | alter table `notification_channel_http`
11 | add column `name` varchar(254);
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.35.0__download_query.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `download_query`(
2 | `id` varchar(254) not null primary key,
3 | `cid` varchar(254) not null,
4 | `file_id` varchar(254) not null,
5 | `file_count` int not null,
6 | `created` timestamp not null,
7 | `last_access` timestamp,
8 | `access_count` int not null,
9 | foreign key (`cid`) references `collective`(`cid`),
10 | foreign key (`file_id`) references `filemeta`(`file_id`)
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.35.1__password_length.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `userimap`
2 | MODIFY `imap_password` mediumtext;
3 |
4 | ALTER TABLE `useremail`
5 | MODIFY `smtp_password` mediumtext;
6 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.38.1__remove_unused_column.sql:
--------------------------------------------------------------------------------
1 | alter table `item` drop foreign key item_ibfk_1;
2 | alter table `item` drop column `inreplyto` cascade;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.39.3__rename_value.sql:
--------------------------------------------------------------------------------
1 | alter table `contact` rename column `value` to `value_`;
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.4.0__attachment_archive.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `attachment_archive` (
2 | `id` varchar(254) not null primary key,
3 | `file_id` varchar(254) not null,
4 | `filename` varchar(254),
5 | `message_id` varchar(254),
6 | `created` timestamp not null,
7 | foreign key (`file_id`) references `filemeta`(`id`),
8 | foreign key (`id`) references `attachment`(`attachid`)
9 | );
10 |
11 | CREATE INDEX `attachment_archive_message_id_idx`
12 | ON `attachment_archive`(`message_id`);
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.6.0__integration_enabled.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `collective`
2 | ADD COLUMN (`integration_enabled` BOOLEAN);
3 |
4 | UPDATE `collective` SET `integration_enabled` = true;
5 |
6 | ALTER TABLE `collective`
7 | MODIFY `integration_enabled` BOOLEAN NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.6.1__fix_timestamp_columns.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `item`
2 | MODIFY `itemdate` TIMESTAMP NULL;
3 |
4 | ALTER TABLE `item`
5 | MODIFY `duedate` TIMESTAMP NULL;
6 |
7 | ALTER TABLE `user_`
8 | MODIFY `lastlogin` TIMESTAMP NULL;
9 |
10 | ALTER TABLE `job`
11 | MODIFY `started` TIMESTAMP NULL;
12 |
13 | ALTER TABLE `job`
14 | MODIFY `finished` TIMESTAMP NULL;
15 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.7.0__fts-migration.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `fts_migration` (
2 | `id` varchar(254) not null primary key,
3 | `version` int not null,
4 | `fts_engine` varchar(254) not null,
5 | `description` varchar(254) not null,
6 | `created` timestamp not null
7 | );
8 |
9 | CREATE UNIQUE INDEX `fts_migration_version_engine_idx`
10 | ON `fts_migration`(`version`, `fts_engine`);
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.7.1__fix_item_date.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `item`
2 | MODIFY `itemdate` DATETIME NULL;
3 |
4 | ALTER TABLE `item`
5 | MODIFY `duedate` DATETIME NULL;
6 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.9.1__classifier.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE `classifier_setting` (
2 | `cid` varchar(254) not null primary key,
3 | `enabled` boolean not null,
4 | `schedule` varchar(254) not null,
5 | `category` varchar(254) not null,
6 | `item_count` int not null,
7 | `file_id` varchar(254),
8 | `created` timestamp not null,
9 | foreign key (`cid`) references `collective`(`cid`),
10 | foreign key (`file_id`) references `filemeta`(`id`)
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.9.2__fix_text_length.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `attachmentmeta`
2 | MODIFY COLUMN `content` longtext;
3 |
4 | ALTER TABLE `attachmentmeta`
5 | MODIFY COLUMN `nerlabels` longtext;
6 |
7 | ALTER TABLE `attachmentmeta`
8 | MODIFY COLUMN `itemproposals` longtext;
9 |
10 | ALTER TABLE `job`
11 | MODIFY COLUMN `args` mediumtext;
12 |
13 | ALTER TABLE `joblog`
14 | MODIFY COLUMN `message` mediumtext;
15 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.9.3__joblog_counter.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `joblog`
2 | ADD COLUMN `counter` mediumint auto_increment unique;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/mariadb/V1.9.4__unique_equipments.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `equipment`
2 | ADD CONSTRAINT `equipment_cid_name_key`
3 | UNIQUE (`cid`, `name`);
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.10.0__attachment_preview.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_preview" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "created" timestamp not null,
6 | foreign key ("file_id") references "filemeta"("id"),
7 | foreign key ("id") references "attachment"("attachid")
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.11.0__pdf_pages.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "attachmentmeta"
2 | ADD COLUMN "page_count" smallint;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.12.0__upload_data.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "file_filter" varchar(254) NULL;
3 |
4 | CREATE TABLE "tagsource" (
5 | "id" varchar(254) not null primary key,
6 | "source_id" varchar(254) not null,
7 | "tag_id" varchar(254) not null,
8 | unique ("source_id", "tag_id"),
9 | foreign key ("source_id") references "source"("sid"),
10 | foreign key ("tag_id") references "tag"("tid")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.14.0__person_org.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "person"
2 | ADD COLUMN "oid" varchar(254);
3 |
4 | ALTER TABLE "person"
5 | ADD CONSTRAINT fk_person_organization
6 | FOREIGN KEY ("oid")
7 | REFERENCES "organization"("oid");
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.15.0__rememberme.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "rememberme" (
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "login" varchar(254) not null,
5 | "created" timestamp not null,
6 | "uses" int not null,
7 | FOREIGN KEY ("cid","login") REFERENCES "user_"("cid","login")
8 | );
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.16.0__add_imap_oauth.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "userimap"
2 | ADD COLUMN "imap_oauth2" boolean NULL;
3 |
4 | UPDATE "userimap" SET "imap_oauth2" = false;
5 |
6 | ALTER TABLE "userimap"
7 | ALTER COLUMN "imap_oauth2" SET NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.19.0__add_classify_meta.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "item_proposal" (
2 | "itemid" varchar(254) not null primary key,
3 | "classifier_proposals" text not null,
4 | "classifier_tags" text not null,
5 | "created" timestamp not null,
6 | foreign key ("itemid") references "item"("itemid")
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.19.1__remove_enabled.sql:
--------------------------------------------------------------------------------
1 | alter table "classifier_setting"
2 | drop column "enabled";
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.2.0__origin_source.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_source" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "created" timestamp not null,
6 | foreign key ("file_id") references "filemeta"("id"),
7 | foreign key ("id") references "attachment"("attachid")
8 | );
9 |
10 | INSERT INTO "attachment_source"
11 | SELECT "attachid","filemetaid","name","created" FROM "attachment";
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.20.0__personuse.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "person"
2 | ADD COLUMN "person_use" varchar(254);
3 |
4 | UPDATE "person" SET "person_use" = 'concerning' where "concerning" = true;
5 | UPDATE "person" SET "person_use" = 'correspondent' where "concerning" = false;
6 | UPDATE "person" SET "person_use" = 'both' where "concerning" is null;
7 |
8 | ALTER TABLE "person"
9 | DROP COLUMN "concerning";
10 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.20.1__equipment_description.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD COLUMN "notes" text;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.20.2__org_shortname.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "organization"
2 | ADD COLUMN "short_name" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.20.3__node_seen.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "node"
2 | ADD COLUMN "not_found" int not null default 0;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.20.4__source_lang.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "doc_lang" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.21.0__cast_function.sql:
--------------------------------------------------------------------------------
1 | -- Create a function to cast to a numeric, if an error occurs return null
2 | create or replace function CAST_TO_NUMERIC(text) returns numeric as $$
3 | begin
4 | return cast($1 as numeric);
5 | exception
6 | when invalid_text_representation then
7 | return null;
8 | end;
9 | $$ language plpgsql immutable;
10 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.21.1__equip_org_use.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD COLUMN "equip_use" varchar(254);
3 |
4 | UPDATE "equipment" SET "equip_use" = 'concerning';
5 |
6 | ALTER TABLE "equipment"
7 | ALTER COLUMN "equip_use" SET NOT NULL;
8 |
9 |
10 | ALTER TABLE "organization"
11 | ADD COLUMN "org_use" varchar(254);
12 |
13 | UPDATE "organization" SET "org_use" = 'correspondent';
14 |
15 | ALTER TABLE "organization"
16 | ALTER COLUMN "org_use" SET NOT NULL;
17 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.22.0__add_task_name.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "periodic_task"
2 | ADD COLUMN "summary" varchar(254);
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.23.0__clientsettings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "client_settings" (
2 | "id" varchar(254) not null primary key,
3 | "client_id" varchar(254) not null,
4 | "user_id" varchar(254) not null,
5 | "settings_data" text not null,
6 | "created" timestamp not null,
7 | "updated" timestamp not null,
8 | foreign key ("user_id") references "user_"("uid") on delete cascade,
9 | unique ("client_id", "user_id")
10 | );
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.24.0__drop_fts_migration.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE "fts_migration";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.25.0__add_empty_trash.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "empty_trash_setting" (
2 | "cid" varchar(254) not null primary key,
3 | "schedule" varchar(254) not null,
4 | "created" timestamp not null,
5 | foreign key ("cid") references "collective"("cid")
6 | );
7 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.25.1__fix_periodic_submitter_value.sql:
--------------------------------------------------------------------------------
1 | UPDATE "periodic_task"
2 | SET submitter = group_
3 | WHERE submitter = 'learn-classifier';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.25.2__add_trash_min_age.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "empty_trash_setting"
2 | ADD COLUMN "min_age" bigint;
3 |
4 | UPDATE "empty_trash_setting"
5 | SET "min_age" = 604800000;
6 |
7 | ALTER TABLE "empty_trash_setting"
8 | ALTER COLUMN "min_age" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.25.3__delete_corrupt_trash_task.sql:
--------------------------------------------------------------------------------
1 | -- note this is only for users of nightly releases
2 | DELETE FROM "periodic_task"
3 | WHERE "task" = 'empty-trash';
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.25.4__add_source_attachonly.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "source"
2 | ADD COLUMN "attachments_only" BOOLEAN NULL;
3 |
4 | UPDATE "source"
5 | SET "attachments_only" = FALSE;
6 |
7 | ALTER TABLE "source"
8 | ALTER COLUMN "attachments_only" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.26.0__missing_indexes.sql:
--------------------------------------------------------------------------------
1 | CREATE INDEX "joblog_id_created_idx" ON "joblog"("jid", "created");
2 | CREATE INDEX "item_itemdate_created_idx" ON "item"(coalesce("itemdate", "created"));
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.26.1__totp.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "totp" (
2 | "user_id" varchar(254) not null primary key,
3 | "enabled" boolean not null,
4 | "secret" varchar(254) not null,
5 | "created" timestamp not null,
6 | FOREIGN KEY ("user_id") REFERENCES "user_"("uid") ON DELETE CASCADE
7 | );
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.26.2__openid.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "user_"
2 | ADD COLUMN "account_source" varchar(254);
3 |
4 | UPDATE "user_"
5 | SET "account_source" = 'local';
6 |
7 | ALTER TABLE "user_"
8 | ALTER COLUMN "account_source" SET NOT NULL;
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.27.0__collective_passwords.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "collective_password" (
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "pass" varchar(254) not null,
5 | "created" timestamp not null,
6 | foreign key ("cid") references "collective"("cid") on delete cascade
7 | )
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.27.1__item_share.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "item_share" (
2 | "id" varchar(254) not null primary key,
3 | "user_id" varchar(254) not null,
4 | "name" varchar(254),
5 | "query" varchar(2000) not null,
6 | "enabled" boolean not null,
7 | "pass" varchar(254),
8 | "publish_at" timestamp not null,
9 | "publish_until" timestamp not null,
10 | "views" int not null,
11 | "last_access" timestamp,
12 | foreign key ("user_id") references "user_"("uid") on delete cascade
13 | )
14 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.28.0__pubsub.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "pubsub" (
2 | "id" varchar(254) not null primary key,
3 | "node_id" varchar(254) not null,
4 | "url" varchar(254) not null,
5 | "topic" varchar(254) not null,
6 | "counter" int not null,
7 | unique("url", "topic")
8 | )
9 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.28.1__intern_settings.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "internal_setting" (
2 | "id" varchar(254) not null primary key,
3 | "internal_route_key" varchar(254) not null
4 | )
5 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.31.1__gotify_prio.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "notification_channel_gotify"
2 | ADD COLUMN "priority" smallint;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.32.0__notification_channel_name.sql:
--------------------------------------------------------------------------------
1 | alter table "notification_channel_mail"
2 | add column "name" varchar(254);
3 |
4 | alter table "notification_channel_gotify"
5 | add column "name" varchar(254);
6 |
7 | alter table "notification_channel_matrix"
8 | add column "name" varchar(254);
9 |
10 | alter table "notification_channel_http"
11 | add column "name" varchar(254);
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.35.0__download_query.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "download_query"(
2 | "id" varchar(254) not null primary key,
3 | "cid" varchar(254) not null,
4 | "file_id" varchar(254) not null,
5 | "file_count" int not null,
6 | "created" timestamp not null,
7 | "last_access" timestamp,
8 | "access_count" int not null,
9 | foreign key ("cid") references "collective"("cid"),
10 | foreign key ("file_id") references "filemeta"("file_id")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.35.1__password_length.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "userimap"
2 | ALTER COLUMN "imap_password" TYPE varchar;
3 |
4 | ALTER TABLE "useremail"
5 | ALTER COLUMN "smtp_password" TYPE varchar;
6 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.38.1__remove_unused_column.sql:
--------------------------------------------------------------------------------
1 | alter table "item" drop column "inreplyto";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.39.3__rename_value.sql:
--------------------------------------------------------------------------------
1 | alter table "contact" rename column "value" to "value_";
2 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.4.0__attachment_archive.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "attachment_archive" (
2 | "id" varchar(254) not null primary key,
3 | "file_id" varchar(254) not null,
4 | "filename" varchar(254),
5 | "message_id" varchar(254),
6 | "created" timestamp not null,
7 | foreign key ("file_id") references "filemeta"("id"),
8 | foreign key ("id") references "attachment"("attachid")
9 | );
10 |
11 | CREATE INDEX "attachment_archive_message_id_idx"
12 | ON "attachment_archive"("message_id");
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.6.0__integration_enabled.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "collective"
2 | ADD COLUMN "integration_enabled" BOOLEAN;
3 |
4 | UPDATE "collective" SET "integration_enabled" = true;
5 |
6 | ALTER TABLE "collective"
7 | ALTER COLUMN "integration_enabled" SET NOT NULL;
8 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.7.0__fts-migration.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "fts_migration" (
2 | "id" varchar(254) not null primary key,
3 | "version" int not null,
4 | "fts_engine" varchar(254) not null,
5 | "description" varchar(254) not null,
6 | "created" timestamp not null
7 | );
8 |
9 | CREATE UNIQUE INDEX "fts_migration_version_engine_idx"
10 | ON "fts_migration"("version", "fts_engine");
11 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.9.1__classifier.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "classifier_setting" (
2 | "cid" varchar(254) not null primary key,
3 | "enabled" boolean not null,
4 | "schedule" varchar(254) not null,
5 | "category" varchar(254) not null,
6 | "item_count" int not null,
7 | "file_id" varchar(254),
8 | "created" timestamp not null,
9 | foreign key ("cid") references "collective"("cid"),
10 | foreign key ("file_id") references "filemeta"("id")
11 | );
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.9.3__joblog_counter.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "joblog"
2 | ADD COLUMN "counter" bigserial;
3 |
--------------------------------------------------------------------------------
/modules/store/src/main/resources/db/migration/postgresql/V1.9.4__unique_equipments.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE "equipment"
2 | ADD CONSTRAINT "equipment_cid_name_key"
3 | UNIQUE ("cid", "name");
4 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/file/FileMetadata.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.file
8 |
9 | import docspell.common._
10 |
11 | import scodec.bits.ByteVector
12 |
13 | final case class FileMetadata(
14 | id: FileKey,
15 | created: Timestamp,
16 | mimetype: MimeType,
17 | length: ByteSize,
18 | checksum: ByteVector
19 | )
20 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/impl/h2/CastNumericFun.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.impl.h2
8 |
9 | import java.math.BigDecimal
10 |
11 | /** This is used from within the H2 database! */
12 | object CastNumericFun {
13 | def castToNumeric(str: String): BigDecimal =
14 | try new BigDecimal(str)
15 | catch {
16 | case _: Throwable => null
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/qb/Column.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.qb
8 |
9 | case class Column[A](name: String, table: TableDef) {
10 | def inTable(t: TableDef): Column[A] =
11 | copy(table = t)
12 |
13 | def cast[B]: Column[B] =
14 | this.asInstanceOf[Column[B]]
15 |
16 | }
17 |
18 | object Column {}
19 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/AttachmentLight.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | case class AttachmentLight(
12 | id: Ident,
13 | position: Int,
14 | name: Option[String],
15 | pageCount: Option[Int]
16 | )
17 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/CategoryCount.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | final case class CategoryCount(category: Option[String], count: Int)
10 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/CustomValue.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | case class CustomValue(field: Ident, value: String)
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/FolderCount.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | case class FolderCount(id: Ident, name: String, owner: IdRef, count: Int)
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/IdRefCount.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | final case class IdRefCount(ref: IdRef, count: Int) {}
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/ItemFieldValue.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | case class ItemFieldValue(
12 | fieldId: Ident,
13 | fieldName: Ident,
14 | fieldLabel: Option[String],
15 | fieldType: CustomFieldType,
16 | value: String
17 | )
18 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/ListItemWithTags.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common.Ident
10 | import docspell.store.records.RTag
11 |
12 | case class ListItemWithTags(
13 | item: ListItem,
14 | tags: List[RTag],
15 | attachments: List[AttachmentLight],
16 | customfields: List[ItemFieldValue],
17 | relatedItems: List[Ident]
18 | )
19 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/SelectedItem.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | /** Some preselected item from a fulltext search. */
12 | case class SelectedItem(itemId: Ident, weight: Double)
13 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/TagCount.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.store.records.RTag
10 |
11 | final case class TagCount(tag: RTag, count: Int)
12 |
--------------------------------------------------------------------------------
/modules/store/src/main/scala/docspell/store/queries/TextAndTag.scala:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2020 Eike K. & Contributors
3 | *
4 | * SPDX-License-Identifier: AGPL-3.0-or-later
5 | */
6 |
7 | package docspell.store.queries
8 |
9 | import docspell.common._
10 |
11 | case class TextAndTag(itemId: Ident, text: String, tag: Option[TextAndTag.TagName])
12 |
13 | object TextAndTag {
14 | case class TagName(id: Ident, name: String)
15 | }
16 |
--------------------------------------------------------------------------------
/modules/webapp/elm-analyse.json:
--------------------------------------------------------------------------------
1 | {
2 | "excludedPaths": [
3 | "modules/webapp/target/elm-src/"
4 | ],
5 | "checks" : {
6 | "ImportAll": false,
7 | "SingleFieldRecord": false
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/modules/webapp/elm-package.json:
--------------------------------------------------------------------------------
1 | elm.json
--------------------------------------------------------------------------------
/modules/webapp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "docspell-css",
3 | "version": "1.0.0",
4 | "private": true,
5 | "devDependencies": {
6 | "@fortawesome/fontawesome-free": "^6.0.0",
7 | "@tailwindcss/forms": "^0.5.0",
8 | "flag-icons": "^7.2.0"
9 | },
10 | "dependencies": {
11 | "tailwindcss": "^3.4.1"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/modules/webapp/postcss.config.js:
--------------------------------------------------------------------------------
1 | //postcss.config.js
2 |
3 | module.exports = (ctx) => ({
4 | plugins: [
5 | require('postcss-import'),
6 | require('tailwindcss'),
7 | require('autoprefixer'),
8 | require('cssnano'),
9 | ]
10 | })
11 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Data/AppEvent.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Data.AppEvent exposing (AppEvent(..))
9 |
10 |
11 | type AppEvent
12 | = AppNothing
13 | | AppReloadUiSettings
14 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Data/EquipmentOrder.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Data.EquipmentOrder exposing (EquipmentOrder(..), asString)
9 |
10 |
11 | type EquipmentOrder
12 | = NameAsc
13 | | NameDesc
14 |
15 |
16 | asString : EquipmentOrder -> String
17 | asString order =
18 | case order of
19 | NameAsc ->
20 | "name"
21 |
22 | NameDesc ->
23 | "-name"
24 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Data/OrganizationOrder.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Data.OrganizationOrder exposing (OrganizationOrder(..), asString)
9 |
10 |
11 | type OrganizationOrder
12 | = NameAsc
13 | | NameDesc
14 |
15 |
16 | asString : OrganizationOrder -> String
17 | asString order =
18 | case order of
19 | NameAsc ->
20 | "name"
21 |
22 | NameDesc ->
23 | "-name"
24 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Data/QueryParseResult.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Data.QueryParseResult exposing (QueryParseResult, success)
9 |
10 |
11 | type alias QueryParseResult =
12 | { success : Bool
13 | , input : String
14 | , index : Int
15 | , messages : List String
16 | }
17 |
18 |
19 | success : QueryParseResult
20 | success =
21 | QueryParseResult True "" 0 []
22 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Messages/UiLanguage.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Messages.UiLanguage exposing
9 | ( UiLanguage(..)
10 | , all
11 | )
12 |
13 | {-| This module defines the languages supported in the web app.
14 | -}
15 |
16 |
17 | type UiLanguage
18 | = English
19 | | German
20 | | French
21 |
22 |
23 | all : List UiLanguage
24 | all =
25 | [ English
26 | , German
27 | , French
28 | ]
29 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Util/Address.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Util.Address exposing (toString)
9 |
10 | import Api.Model.Address exposing (Address)
11 |
12 |
13 | toString : Address -> String
14 | toString a =
15 | [ a.street, a.zip, a.city, a.country ]
16 | |> List.filter (String.isEmpty >> not)
17 | |> List.intersperse ", "
18 | |> String.concat
19 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Util/Contact.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Util.Contact exposing (toString)
9 |
10 | import Api.Model.Contact exposing (Contact)
11 |
12 |
13 | toString : List Contact -> String
14 | toString contacts =
15 | List.map (\c -> c.kind ++ ": " ++ c.value) contacts
16 | |> List.intersperse ", "
17 | |> String.concat
18 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/elm/Util/File.elm:
--------------------------------------------------------------------------------
1 | {-
2 | Copyright 2020 Eike K. & Contributors
3 |
4 | SPDX-License-Identifier: AGPL-3.0-or-later
5 | -}
6 |
7 |
8 | module Util.File exposing (makeFileId)
9 |
10 | import File exposing (File)
11 | import Util.String
12 |
13 |
14 | makeFileId : File -> String
15 | makeFileId file =
16 | File.name file
17 | ++ "-"
18 | ++ (File.size file |> String.fromInt)
19 | |> Util.String.crazyEncode
20 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/styles/index.css:
--------------------------------------------------------------------------------
1 | @import "@fortawesome/fontawesome-free/css/all";
2 | @import "flag-icons/css/flag-icons.min";
3 |
4 | @import "tailwindcss/base";
5 | @import "tailwindcss/components";
6 | @import "tailwindcss/utilities";
7 |
8 | @import "./custom-components.css";
9 | @import "./custom-utilities.css";
10 |
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-144x144.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-192x192.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-36x36.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-48x48.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-512x512.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-72x72.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/android-icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/android-icon-96x96.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-114x114.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-120x120.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-144x144.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-152x152.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-180x180.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-57x57.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-60x60.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-72x72.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-76x76.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon-precomposed.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eikek/docspell/7f2ce7d58457844c6856c5c354736732369d9263/modules/webapp/src/main/webjar/favicon/apple-icon.png
--------------------------------------------------------------------------------
/modules/webapp/src/main/webjar/favicon/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |