Compare commits

..
970 Commits
Author SHA1 Message Date
kolaente 2b8c9c698d 0.15.0 release preparations 2020-10-19 21:06:31 +02:00
kolaente 80367d60d4 Fix release trigger in drone 2020-10-19 20:35:23 +02:00
renovateandkonrad 688ca65edf Update module go-testfixtures/testfixtures/v3 to v3.4.1 (#693)
Update module go-testfixtures/testfixtures/v3 to v3.4.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/693
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-19 15:39:08 +00:00
freaktechnikandkonrad dcefc18b98 Add app support info for DAV (#692)
Add app support info for DAV

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/692
Co-Authored-By: freaktechnik <martin@humanoids.be>
Co-Committed-By: freaktechnik <martin@humanoids.be>
2020-10-19 12:17:08 +00:00
freaktechnikandkonrad 214f2f008e Support absolute iCal timestamps in CalDAV requests (#691)
no need to export from there I think

parse absolute ical timestamps

Co-authored-by: konrad <konrad@kola-entertainments.de>
Co-authored-by: Martin Giger <martin@humanoids.be>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/691
Co-Authored-By: freaktechnik <martin@humanoids.be>
Co-Committed-By: freaktechnik <martin@humanoids.be>
2020-10-19 09:11:15 +00:00
kolaente 004e432e7c Fix nfpm command in drone 2020-10-19 07:58:24 +02:00
renovateandkonrad 47486af06d Update module spf13/cobra to v1.1.1 (#690)
Update module spf13/cobra to v1.1.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/690
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-18 20:16:25 +00:00
kolaente 8b9b1984fc Make sure we have go installed when building os packages (for build step dependencies) 2020-10-18 21:28:33 +02:00
kolaente 6dd7bcb0fe Make sure we have git installed when building os packages 2020-10-18 20:29:54 +02:00
kolaente b94950d7c2 Fix trigger for pushing release artifacts to drone 2020-10-18 13:59:26 +02:00
konradandkolaente 618353bf95 Use nfpm to build deb, rpm and apk packages (#689)
Cleanup

Update docs for deb

Add building os packages to drone

Add apk packages

Replace version and binlocation strings in nfpm config

Make nfpm config replacable

Fix nfpm config

Add nfpm config

go mod tidy

Add nfpm mage target

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/689
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-10-18 11:41:27 +00:00
1555081939 fetch tasks for caldav lists (#641)
Fix shadowed error

Panic if a TaskCollection.ReadAll does not return []*models.Task

Fetch tasks for caldav lists

Co-authored-by: kolaente <k@knt.li>
Co-authored-by: konrad <konrad@kola-entertainments.de>
Co-authored-by: Martin Giger <martin@humanoids.be>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/641
Co-Authored-By: freaktechnik <martin@humanoids.be>
Co-Committed-By: freaktechnik <martin@humanoids.be>
2020-10-18 10:40:50 +00:00
7fe9e6d3f6 Update module swaggo/swag to v1.6.8 (#680)
Regenerate swagger docs with new swaggo

Update module swaggo/swag to v1.6.8

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/680
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-17 18:03:05 +00:00
renovateandkonrad cbba0695a8 Update module fzipp/gocyclo to v0.3.0 (#687)
Update module fzipp/gocyclo to v0.3.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/687
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-17 10:26:52 +00:00
renovateandkonrad 921526e086 Update golang.org/x/crypto commit hash to 9e8e0b3 (#685)
Update golang.org/x/crypto commit hash to 9e8e0b3

Co-authored-by: konrad <konrad@kola-entertainments.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/685
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-17 09:34:23 +00:00
konradandkolaente 1b21339bf8 Generate config docs from sample config (#684)
Add docs todo to PR template

Clarify docs

Fix parsing of descriptions and multi-level values

Add method to write out the file

Only render default value for non-top-level values

Remove comment headings from yaml comments

Add printing config

Add basic parsing of sample config with comments

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/684
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-10-17 08:07:39 +00:00
renovateandkonrad e9d6daa1a3 Update module fzipp/gocyclo to v0.2.0 (#686)
Update module fzipp/gocyclo to v0.2.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/686
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-17 08:06:20 +00:00
renovateandkonrad 8b001313f4 Update golang.org/x/crypto commit hash to 84dcc77 (#678)
Update golang.org/x/crypto commit hash to 84dcc77

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/678
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-16 19:55:20 +00:00
renovateandkonrad e0c8eca669 Update module prometheus/client_golang to v1.8.0 (#681)
Update module prometheus/client_golang to v1.8.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/681
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-15 20:24:03 +00:00
renovateandkonrad c629130b3b Update module spf13/cobra to v1.1.0 (#679)
Update module spf13/cobra to v1.1.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/679
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-14 19:16:18 +00:00
kolaente 9252225d7f Disable gocyclo for migration modules
Signed-off-by: kolaente <k@knt.li>
2020-10-13 08:05:55 +02:00
kolaente 38b5c7fb6c Add checks if tasks exist in maps before trying to access them
Signed-off-by: kolaente <k@knt.li>
2020-10-12 19:33:17 +02:00
kolaente e26df26f78 Fix migrating items with large items from todoist
see #266
2020-10-12 08:08:52 +02:00
renovateandkonrad 158e07e581 Update module go-errors/errors to v1.1.1 (#677)
Update module go-errors/errors to v1.1.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/677
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-11 21:27:42 +00:00
konradandkolaente 699d3d6060 Add Golangci Lint (#676)
Increase golangci timeout

Fix installing golangci-lint in ci

Remove mage targets replaced by golangci

Run golint in ci

Add goheader linter

Enable & fix more linters

Fix lint issues

Add mage target to automagically fix issues found by golangci

golangci-lint run --fix

Add golangci config

Add golangci mage target

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/676
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-10-11 20:10:03 +00:00
konradandkolaente d56a611be7 Key-Value Storages (#674)
Fix lint

Add docs for keyvalue config options

Use keyvalue store to cache unsplash photo results

Cleanup

Use keyvalue store for upload avatar

Use keyvalue store for initials avatar

Fix initializing metrics

Use keyvalue for metrics

Add IncryBy and DecrBy methods to increase or decrease a value

Fix lint

Return custom error if a key does not exist

Init keyvalue storage

Follow the keyvalue storage setting for things like cache and other

Add docs

Add configuration of the storage backend

Add redis keyvalue storage implementation

Add doc comments

Add methods to use storage through the package itself

Add memory implementation for keyvalue store

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/674
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-10-10 16:53:59 +00:00
kolaente bf5d8af3f6 Fix docs index links 2020-10-10 12:12:54 +02:00
renovateandkonrad 0769098357 Update golang.org/x/sync commit hash to b3e1573 (#675)
Update golang.org/x/sync commit hash to b3e1573

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/675
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-10 07:04:40 +00:00
renovateandkonrad 71094d981f Update module spf13/afero to v1.4.1 (#673)
Update module spf13/afero to v1.4.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/673
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-06 12:03:14 +00:00
renovateandkonrad 32d97f1451 Update golang.org/x/crypto commit hash to 7f63de1 (#672)
Update golang.org/x/crypto commit hash to 7f63de1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/672
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-02 18:19:39 +00:00
renovateandkonrad bf9d1c634a Update module mattn/go-sqlite3 to v1.14.4 (#670)
Update module mattn/go-sqlite3 to v1.14.4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/670
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-02 15:05:51 +00:00
renovateandkonrad ebd96d7766 Update golang.org/x/crypto commit hash to c90954c (#671)
Update golang.org/x/crypto commit hash to c90954c

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/671
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-02 15:05:32 +00:00
renovateandkonrad 089d156259 Update golang.org/x/crypto commit hash to eb9a90e (#669)
Update golang.org/x/crypto commit hash to eb9a90e

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/669
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-10-01 21:09:37 +00:00
renovateandkonrad dd589022e4 Update golang.org/x/crypto commit hash to afb6bcd (#668)
Update golang.org/x/crypto commit hash to afb6bcd

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/668
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-30 17:18:49 +00:00
renovateandkonrad b850f65295 Update golang.org/x/sync commit hash to 3042136 (#667)
Update golang.org/x/sync commit hash to 3042136

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/667
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-30 14:44:18 +00:00
kolaente b3d09cd2d4 Fix loading list background information for uploaded backgrounds
Signed-off-by: kolaente <k@knt.li>
2020-09-28 20:53:17 +02:00
konradandkolaente 64d125afd9 Testing improvements (#666)
Change method names to avoid doubling db

Assert team test exists

Assert team member test exists

Assert task test exists

Assert task relation test exists

Assert task comment test exists

Better tests for team namespaces

Assert exists in namespace users tests

Assert exists in namespace tests

Assert exists in user list tests

Assert exists in list tests

Better team list tests

Assert label tests exist in db

Assert label task tests exist in db

Assert label task tests exist in db

Assert kanban tests exist in db

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/666
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-09-27 15:45:17 +00:00
renovateandkonrad dd5d64da3e Update golang.org/x/image commit hash to e162460 (#665)
Update golang.org/x/image commit hash to e162460

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/665
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-27 13:35:07 +00:00
kolaente 1776eb56fe Fix upload avatar not working
Signed-off-by: kolaente <k@knt.li>
2020-09-27 12:50:52 +02:00
renovateandkonrad f8c135f22e Update golang.org/x/image commit hash to a67d67e (#664)
Update golang.org/x/image commit hash to a67d67e

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/664
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-27 07:12:14 +00:00
konradandkolaente 0fb2edf051 Saved filters (#655)
Fix updating saved filters

Fix filter not loadable because of missing param declaration

Add fancy special cases for postgres exists in db

Add special case for postgrs json

Add read one test

Add rights tests

Fix lint

Fixed getting a single saved filter from db

Add tests for the usual crud methods

Add test stubs and TODOs

Add test for converting saved filter ids to list ids and vice versa

Add test fixture for saved filters and fix existing tests

Fix exposed json variables of filters

Fix creating saved filters table for tests

Add getting saved filters as pseudo namespace

Cleanup

Refactor getting all namespaces to use a map for easier handling of pseudo namespaces

Add custom erros for saved filters

Swagger docs

Fix lint

Add routes for saved filters

Add alias for mage build

Add method to get a saved filter from the lists endpoint

Add getting tasks from a saved filter

Add create, update, delete, read one methods

Add rights methods for saved filters

Fix docs minLength

Add saved filters column

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/655
Co-Authored-By: konrad <konrad@kola-entertainments.de>
Co-Committed-By: konrad <konrad@kola-entertainments.de>
2020-09-26 21:02:17 +00:00
renovateandkonrad a6fdf114d1 Update golang.org/x/image commit hash to 4578eab (#663)
Update golang.org/x/image commit hash to 4578eab

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/663
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-24 09:01:34 +00:00
renovateandkonrad ca1b33d24d Update github.com/asaskevich/govalidator commit hash to 7a23bdc (#657)
Update github.com/asaskevich/govalidator commit hash to 7a23bdc

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/657
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 11:27:58 +00:00
renovateandkonrad c98b9bbee6 Update golang.org/x/image commit hash to e59bae6 (#659)
Update golang.org/x/image commit hash to e59bae6

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/659
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 11:27:43 +00:00
renovateandkonrad 19a0a85c73 Update github.com/jgautheron/goconst commit hash to 8f5268c (#658)
Update github.com/jgautheron/goconst commit hash to 8f5268c

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/658
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 10:25:10 +00:00
renovateandkonrad 77122b8f1b Update module iancoleman/strcase to v0.1.2 (#660)
Update module iancoleman/strcase to v0.1.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/660
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 07:59:24 +00:00
renovateandkonrad 436af467d6 Update module mattn/go-sqlite3 to v1.14.3 (#661)
Update module mattn/go-sqlite3 to v1.14.3

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/661
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 07:12:18 +00:00
renovateandkonrad 04130e4ea3 Update module spf13/afero to v1.4.0 (#662)
Update module spf13/afero to v1.4.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/662
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-09-23 05:05:58 +00:00
kolaente 7e6e44e787 Replace renovate tokens with env 2020-09-22 22:25:23 +02:00
kolaente 9e7ca8df51 Update renovate token 2020-09-22 21:42:40 +02:00
konradandkolaente 6bdddd462a Favorite lists (#654)
Add tests

Remove the favorites pseudo namespace if there are no lists or tasks favorited

Regenerate swagger docs

Fix favorite lists not being updated because of nonexisting users (the favorite list does not have one)

Make the pseudo favorites list always favorited

Add favorited lists to the favorites pseudo namespace

Add favorite field to list

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/654
2020-09-06 14:20:16 +00:00
konradandkolaente e5559137dd Favorite tasks (#653)
Fixed namespace tests

Add test for favorite tasks

Fix favorite tasks not being updated

Fix integration tests

Fix lint

Return a pseudo namespace and list for favorites

Make sure users can only see their favorites

Add condition show tasks from the favorites list

Regenerate swagger docs

Add favorite field to task

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/653
2020-09-05 20:16:02 +00:00
kolaente ecf09e17a8 Only check if a bucket limit is exceeded when moving a task between buckets 2020-09-04 22:01:33 +02:00
konradandkolaente 14d706c91e Kanban bucket limits (#652)
Fix integration tests

Generate swagger docs

Add test for moving a task between buckets

Add check for bucket limit when updating a task

Add fixture to ensure a bucket with a high limit will never exceed the limit

Refactor bucket limit check into seperate function

Add test for creating and fix

Fix unexported field

Add error in case a task was added to a bucket which has its limit already exceeded

Add migration to add new task field

Add limit field to buckets

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/652
2020-09-04 14:37:56 +00:00
kolaente 5317a89623 Make sure to copy the permissions as well when moving files 2020-09-04 14:00:54 +02:00
kolaente e9b1786188 Regenerate swagger docs 2020-09-04 13:15:46 +02:00
kolaente 313289d28d Add rootpath to deb command to not include everything in the deb file 2020-09-04 10:42:32 +02:00
kolaente 05e237560d Add mage command to create a new migration 2020-09-04 10:15:33 +02:00
kolaente e4dd314079 Add caldav enabled/disabled to /info endpoint 2020-09-04 09:58:42 +02:00
kolaente 118c7f25b5 Fix release commands in drone 2020-09-03 22:46:41 +02:00
kolaente b64a80da0b Make sure built binary files are executable when compressing with upx 2020-09-03 22:45:04 +02:00
kolaente bb26c9d97c Make sure to only initialize all variables when needed 2020-09-03 22:14:30 +02:00
kolaente edf3854632 Add github sponsor link 2020-09-03 21:59:17 +02:00
kolaente 19a66450ec Fix building for darwin with mage 2020-09-03 21:22:41 +02:00
kolaente 3a839dfb86 Add util function to move files 2020-09-03 20:42:26 +02:00
kolaente 78b261e440 Skip directories when moving build release artefacts in drone 2020-09-03 18:08:57 +02:00
kolaente 471d1b0ec5 Fix dockerimage build 2020-09-03 18:08:26 +02:00
kolaente 58dfbe13ed Add FreeBSD guide to installation docs 2020-09-03 17:44:44 +02:00
kolaente 1a4eef1056 Add toc to docs 2020-09-03 17:34:44 +02:00
kolaente 8da7db3e26 Cleanup references to make 2020-09-03 17:18:41 +02:00
konradandkolaente d359130bcf Switch to mage (#651)
Add comment about magefile compile

Switch make to mage commands in drone

Fix misspell

Update docs

Add general release command

Add reprepro command

Make sure the filename contains the proper version

Add deb package building

Add zip command

Preserve file permissions when copying files

Fix release:os-package

Make sure to not create checksums of directories

Cleanup

Only compress what upx is able to compress

Add check command

Add release:os-package command

Add copy command

Add comments

Add compress step

Move releasing binaries to a more general function and add ones of linux + darwin

Add release:windows command

Add release:dir command

Add namespaces for commands

Reorder

Add command to run all checks at once

Add goconst-check

Add gosec-check

Add static-check

Add gocyclo-check

Add ineffasign-check

Add misspell-check

Add command to check for swagger docs regeneration

Add comments

Add command to generate swagger docs

Reorder

Add check for installing golint before running it

Add fmt check command

Add fmt command

Use runAndStreamOutput everywhere

Add aliases and comments

Add todo

Reorder

Add test coverage command

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/651
2020-09-03 15:13:19 +00:00
renovateandkonrad 05099e1784 Update module spf13/afero to v1.3.5 (#650)
Update module spf13/afero to v1.3.5

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/650
2020-09-02 21:19:34 +00:00
renovateandkonrad 79970ebb4a Update module labstack/echo/v4 to v4.1.17 (#646)
Update module labstack/echo/v4 to v4.1.17

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/646
2020-08-31 09:19:49 +00:00
renovateandkonrad 27b4086351 Update module iancoleman/strcase to v0.1.1 (#645)
Update module iancoleman/strcase to v0.1.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/645
2020-08-30 08:18:18 +00:00
renovateandkonrad ae7eafd6ad Update module mattn/go-sqlite3 to v1.14.2 (#647)
Update module mattn/go-sqlite3 to v1.14.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/647
2020-08-30 08:17:50 +00:00
renovateandkonrad 21b5aee054 Update github.com/c2h5oh/datasize commit hash to 48ed595 (#644)
Update github.com/c2h5oh/datasize commit hash to 48ed595

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/644
2020-08-25 16:06:32 +00:00
renovateandkonrad 2b34a8d4e6 Update github.com/shurcooL/vfsgen commit hash to 0d455de (#642)
Update github.com/shurcooL/vfsgen commit hash to 0d455de

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/642
2020-08-24 20:00:48 +00:00
renovateandkonrad b4771c1bce Update golang.org/x/crypto commit hash to 5c72a88 (#640)
Update golang.org/x/crypto commit hash to 5c72a88

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/640
2020-08-20 23:09:04 +00:00
renovateandkonrad c83858bf7e Update module mattn/go-sqlite3 to v1.14.1 (#638)
Update module mattn/go-sqlite3 to v1.14.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/638
2020-08-20 20:46:16 +00:00
renovateandkonrad 08b8964b3d Update github.com/asaskevich/govalidator commit hash to 29e1ff8 (#639)
Update github.com/asaskevich/govalidator commit hash to 29e1ff8

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/639
2020-08-20 12:10:36 +00:00
kolaente d88551e99d Add dav proxy directions to example proxy configurations
Signed-off-by: kolaente <k@knt.li>
2020-08-20 14:08:35 +02:00
renovateandkonrad ebd71d1f04 Update module iancoleman/strcase to v0.1.0 (#636)
Update module iancoleman/strcase to v0.1.0

Co-authored-by: konrad <konrad@kola-entertainments.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/636
2020-08-19 08:31:41 +00:00
renovateandkonrad a61ab0c5cf Update github.com/asaskevich/govalidator commit hash to 50839af (#637)
Update github.com/asaskevich/govalidator commit hash to 50839af

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/637
2020-08-18 18:07:45 +00:00
kolaente fa718e2576 Fix token renew for link shares
Signed-off-by: kolaente <k@knt.li>
2020-08-18 16:55:44 +02:00
kolaente c517a87b85 Don't add a subtask to the top level of tasks to not add it twice in the list 2020-08-17 22:30:24 +02:00
kolaente 28fd0e91ee Mention client_max_body_size in nginx proxy settings 2020-08-17 22:15:48 +02:00
renovateandkonrad 14c27600d8 Update github.com/asaskevich/govalidator commit hash to df4adff (#552)
Update github.com/asaskevich/govalidator commit hash to df4adff

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/552
2020-08-17 13:48:12 +00:00
kolaente dedce20780 "Fix" gocyclo 2020-08-16 23:48:34 +02:00
kolaente a58b932743 Work around tasks with attachments not being duplicated 2020-08-16 23:44:16 +02:00
kolaente 301bebf8d3 Only try to download attachments from todoist when there is a url
Credit: freaktechnik
2020-08-16 23:26:19 +02:00
kolaente d192c36c39 Add better tests for namespaces 2020-08-15 22:16:36 +02:00
kolaente bdfb804bb2 Fix reading passwords on windows 2020-08-13 17:59:10 +02:00
konradandkolaente 16dbcfda7e Manage users via cli (#632)
Add users cli commands to docs

Fix checking for changing username or user email

Add user status change command

Make sure only one user exists with a particular email when updating

Add password reset

Add user id to help

Remove user delete (too many possible side effects, postponed until later)

Make sure to fail on any errors

Fail if changing the username would result in duplicate users

Add user update command

Add user create command

Add command stubs for all commands

Render users in a beautiful table

Started adding user list command

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/632
2020-08-13 15:34:02 +00:00
renovateandkonrad 0169ecc37e Update module 4d63.com/tz to v1.2.0 (#631)
Update module 4d63.com/tz to v1.2.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/631
2020-08-13 08:38:01 +00:00
kolaente 4a70c81b33 Make sure to require admin rights when modifying list/namespace users to be consistent with teams
Signed-off-by: kolaente <k@knt.li>
2020-08-12 18:20:47 +02:00
renovateandkonrad 5e84ce639f Update module src.techknowlogick.com/xgo to v1.1.0+1.15.0 (#630)
Update module src.techknowlogick.com/xgo to v1.1.0+1.15.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/630
2020-08-12 09:27:43 +00:00
renovateandkonrad 6c45388da9 Update module imdario/mergo to v0.3.11 (#629)
Update module imdario/mergo to v0.3.11

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/629
2020-08-11 20:12:50 +00:00
konradandkolaente bd8c1c3bb7 Return rights when reading a single item (#626)
Fix lint

Update docs

Fix loading all rights (list & namespace)

Add tests

Update web framework

Make tests run again

Update all calls to CanRead methods

Update task attachment & task comment & task rights to return the max right

Update team rights to return the max right

Update namespace rights to return the max right

Update list rights to return the max right

Update link share rights to return the max right

Update label rights to return the max right

Update web dependency

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/626
2020-08-10 12:11:43 +00:00
renovateandkonrad 28b8cabea5 Update module spf13/afero to v1.3.4 (#628)
Update module spf13/afero to v1.3.4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/628
2020-08-10 07:26:50 +00:00
renovateandkonrad 7c91803056 Update module go-testfixtures/testfixtures/v3 to v3.4.0 (#627)
Update module go-testfixtures/testfixtures/v3 to v3.4.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/627
2020-08-09 20:18:27 +00:00
renovateandkonrad b375e1d043 Update github.com/gordonklaus/ineffassign commit hash to e36bfde (#625)
Update github.com/gordonklaus/ineffassign commit hash to e36bfde

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/625
2020-08-09 09:18:55 +00:00
kolaente d718d247c8 Fix users with disabled totp but not enrolled being unable to login 2020-08-07 16:41:35 +02:00
kolaente 6a82d4e2af Fix updating team admin status 2020-08-05 17:28:11 +02:00
kolaente 11722bf029 Add update route to toggle team member admin status 2020-08-05 17:21:17 +02:00
konradandkolaente dfb7730b63 More avatar providers (#622)
Don't fail if the last avatar file does not exist when deleting it

Fix lint

Remove old global avatar setting and update docs

Generate docs

Invalidate the avatar cache when uploading a new one

Add debug logs

Add caching for upload avatars

Add cache locks

Fix encoding

Resize the uploaded image to a max of 1024 pixels

Remove the old uploaded avatar if one already exists

Add mimetype check for images

Set avatar provider to upload when uploading an avatar

Add upload avatar provider

Make font size smaller to let the initials still look good in smaller sizes

Add debug log

Add cache and resizing of initials avatars

Make font size depend on avatar size

Add drawing initials avatar

Add initials provider

Make the initials avatar provider the default

Add routes

Add user avatar settings handler methods

Add user avatar provider field

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/622
2020-08-02 17:16:58 +00:00
renovateandkonrad c9117dd037 Update module spf13/afero to v1.3.3 (#623)
Update module spf13/afero to v1.3.3

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/623
2020-08-02 14:11:50 +00:00
konradandkolaente e4539ef232 Use db sessions for task-related things (#621)
Use db sessions for task-related things

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/621
2020-08-01 16:54:38 +00:00
renovateandkonrad 0ba6ae7a18 Update module spf13/viper to v1.7.1 (#620)
Update module spf13/viper to v1.7.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/620
2020-08-01 06:24:46 +00:00
renovateandkonrad 25ecc4a510 Update golang.org/x/crypto commit hash to 123391f (#619)
Update golang.org/x/crypto commit hash to 123391f

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/619
2020-07-29 06:39:36 +00:00
renovateandkonrad 259c2195dc Update module lib/pq to v1.8.0 (#618)
Update module lib/pq to v1.8.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/618
2020-07-28 06:44:54 +00:00
kolaente 7bdc9dd428 Pin telegram notification plugin in drone 2020-07-24 18:32:18 +02:00
renovateandkonrad 5f8872f8cc Update module getsentry/sentry-go to v0.7.0 (#617)
Update module getsentry/sentry-go to v0.7.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/617
2020-07-21 13:02:45 +00:00
renovateandkonrad 5794ede6f6 Update module lib/pq to v1.7.1 (#616)
Update module lib/pq to v1.7.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/616
2020-07-20 17:37:08 +00:00
kolaente 41cf73a473 Add option to configure legal urls 2020-07-18 18:53:56 +02:00
renovateandkonrad f8d84139fa Update module imdario/mergo to v0.3.10 (#615)
Update module imdario/mergo to v0.3.10

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/615
2020-07-18 16:52:05 +00:00
kolaente d3964ff4bd Update xgo to v1.0.0+1.14.6 2020-07-18 18:42:34 +02:00
kolaente 9acba7d3f0 Fix duplicating a list with background 2020-07-17 14:16:59 +02:00
kolaente 2d567bfe0f Make sure lists which would have a duplicate identifier can still be duplicated
+ debug logging for duplicating lists
2020-07-17 13:26:49 +02:00
renovateandkonrad 7207aa60fb Update module src.techknowlogick.com/xgo to v1 (#613)
Update module src.techknowlogick.com/xgo to v1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/613
2020-07-15 06:32:48 +00:00
renovateandkonrad 2b9af951bf Update src.techknowlogick.com/xgo commit hash to 96de19c (#612)
Update src.techknowlogick.com/xgo commit hash to 96de19c

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/612
2020-07-14 19:58:42 +00:00
renovateandkonrad c84efcbbcc Update src.techknowlogick.com/xgo commit hash to 7c2e3c9 (#611)
Update src.techknowlogick.com/xgo commit hash to 7c2e3c9

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/611
2020-07-14 17:59:50 +00:00
kolaente 092aae3260 Add config option to force ssl connections to connect with the mailer 2020-07-14 17:30:39 +02:00
renovateandkonrad 222582fb0c Update module spf13/afero to v1.3.2 (#610)
Update module spf13/afero to v1.3.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/610
2020-07-14 13:19:46 +00:00
kolaente a99367bc5f Fix release trigger 2020-07-14 14:45:16 +02:00
kolaente c47d5c7228 Switch s3 release bucket to scaleway 2020-07-14 13:43:35 +02:00
kolaente 3d709e3bb7 Update docs with testmail command + reorder 2020-07-14 09:34:32 +02:00
renovateandkonrad 3a9360a57b Update golang.org/x/crypto commit hash to 948cd5f (#609)
Update golang.org/x/crypto commit hash to 948cd5f

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/609
2020-07-10 08:21:21 +00:00
renovateandkonrad dd3c4cd032 Update golang.org/x/crypto commit hash to ab33eee (#608)
Update golang.org/x/crypto commit hash to ab33eee

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/608
2020-07-08 07:12:16 +00:00
kolaente 2a4a622518 0.14.1 release preparations 2020-07-07 10:58:03 +02:00
konradandkolaente 4db06ba9a1 Fix creating lists with non ascii characters (#607)
Fix test name

Fix migrating lists with non utf-8 characters in their name

Fix creating lists with non utf-8 characters

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/607
2020-07-07 07:48:12 +00:00
kolaente 96f366f5e7 Add docs about using vikunja with utf-8 characters 2020-07-06 21:53:26 +02:00
kolaente 78791f31a4 Fix parsing todoist reminder dates 2020-07-05 20:49:29 +02:00
kolaente ec3fa9300b Fix parsing todoist reminder dates 2020-07-05 17:48:36 +02:00
kolaente 9fa7e30a0a update theme 2020-07-05 15:25:25 +02:00
jtojnarandkonrad 158d98c2bd Makefile: make add EXTRA_GOFLAG to GOFLAGS (#605)
Makefile: make add EXTRA_GOFLAG to GOFLAGS

Some commands (`go generate`) only support taking `GOFLAGS` from the environment
but setting `GOFLAGS` environment variable is ineffectual because the variable
of the same name defined in the Makefile shadows it.

We also have a custom `EXTRA_GOFLAGS` variable but we only pass that to `go build`.

Let’s add `EXTRA_GOFLAGS` to the `GOFLAGS` variable in the Makefile to allow passing
custom flags to Go through `EXTRA_GOFLAGS` environment variable.

Co-authored-by: Jan Tojnar <jtojnar@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/605
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-07-04 16:55:45 +00:00
kolaente ae12871bd7 Fix decoding active users from redis 2020-07-02 23:19:03 +02:00
kolaente 7141050f8b Make sure the metrics map accesses only happen explicitly 2020-07-02 21:16:39 +02:00
kolaente 5d900fd40d 0.14.0 release preparations 2020-07-01 17:12:49 +02:00
kolaente f57b7e989f Fix updating the index when moving a task 2020-07-01 16:54:18 +02:00
kolaente 556ccd68c1 Set the list identifier when creating a new task 2020-07-01 11:17:18 +02:00
konradandkolaente 1181039249 Duplicate Lists (#603)
Fix buckets not being duplicated correctly

Fix list id param not working

Add api endpoint

Add swagger docs

Add comment about test

Make duplicating actually work

Add copying link shares

Add copying list backgrounds

Add copying task relations

Add copying task comments

Add copying assignees

Add copying task task label relations

Add copying task attachments

Add duplicating tasks

Add basic struct and methods

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/603
2020-06-30 20:53:14 +00:00
kolaente 6da137cd4a Remove go mod vendor todo from pr template now that we don't keep dependencies in the repo anymore 2020-06-30 17:09:18 +02:00
kolaente 9750a23dbe Make the db timezone migration mysql compatible 2020-06-30 11:29:47 +02:00
kolaente 1c93aab7e0 Fix not loading timezones on all operating systems 2020-06-30 09:55:46 +02:00
renovateandkonrad 53c4637fb6 Update module spf13/afero to v1.3.1 (#602)
Update module spf13/afero to v1.3.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/602
2020-06-28 18:25:51 +00:00
kolaente 3b2289c8fa Fix swagger docs 2020-06-28 16:25:46 +02:00
renovateandkonrad b55b21373c Update module swaggo/swag to v1.6.7 (#601)
Update module swaggo/swag to v1.6.7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/601
2020-06-28 14:11:17 +00:00
kolaente 53cfa99912 Remove vendored dependencies 2020-06-28 14:00:10 +02:00
kolaente f30e720c7b Update dependency github.com/mattn/go-sqlite3 to v1.14.0 2020-06-28 13:05:33 +02:00
renovateandkonrad 57c84f3adc Update module go-testfixtures/testfixtures/v3 to v3.3.0 (#600)
Update module go-testfixtures/testfixtures/v3 to v3.3.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/600
2020-06-28 07:23:55 +00:00
kolaente 2820d92ab3 Expose namespace id when querying lists 2020-06-27 23:00:15 +02:00
renovateandkonrad 780a654f65 Update github.com/shurcooL/vfsgen commit hash to 92b8a71 (#599)
Update github.com/shurcooL/vfsgen commit hash to 92b8a71

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/599
2020-06-27 18:50:08 +00:00
konradandkolaente 08205008e7 Migrate all timestamps to real iso dates (#594)
Fix query param name

Add option to include null results when filtering

Always set db time to gmt

Fix null filter

Fix timezone setting for todoist parsing

Fix timezone setting for wunderlist parsing

Fix import

Fix caldav reminder parsing

Use timezone from config

Add error and test for invalid filter values

Fix integration tests

Remove task collection date hack

Fix task filter

Fix lint

Fix tests and fixtures for date timezone stuff

Properly set timezone

Change fixtures time zone to gmt

Set db timezone

Set created and updated timestamps for all fixtures

Fix lint

Fix test fixtures

Fix misspell

Fix test fixtures

Partially fix tests

Remove timeutil package

Remove adding _unix suffix hack

Remove _unix suffix

Move all timeutil.TimeStamp to time.Time

Remove all Unix suffixes in field names

Add better error messages when running migrations

Make sure to not migrate 0 unix timestamps to 1970 iso dates

Add migration script for sqlite

Add converting sqlite values

Convert 0 unix timestamps to null in postgres

Convert 0 to null in timestamps

Automatically rename _unix suffix

Add all tables and columns for migration

Fix sql migration query for mysql

Fail with an error if trying to use an unsupported dbms

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/594
2020-06-27 17:04:01 +00:00
kolaente e17cac854a Fix removing existing sqlite files 2020-06-27 16:34:53 +02:00
kolaente 974d028e51 Fix sqlite db not working when creating a new one 2020-06-26 19:45:19 +02:00
kolaente be11362533 Fix searching for unsplash pictures with words that contain a space 2020-06-26 00:37:10 +02:00
kolaente 912abb3a10 Fix namespace title not being updated 2020-06-26 00:03:28 +02:00
kolaente 0add1dce01 Add go version to version command 2020-06-25 15:59:06 +02:00
renovateandkonrad 922c41236c Update module prometheus/client_golang to v1.7.1 (#597)
Update module prometheus/client_golang to v1.7.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/597
2020-06-24 05:41:09 +00:00
kolaente c8605d6b3d Enable upload backgrounds by default 2020-06-23 22:53:23 +02:00
kolaente caee123f9d Add better errors if the sqlite db file is not writable 2020-06-23 11:21:42 +02:00
renovateandkonrad 7b31301f09 Update golang.org/x/crypto commit hash to 75b2880 (#596)
Update golang.org/x/crypto commit hash to 75b2880

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/596
2020-06-23 05:55:37 +00:00
kolaente f2025c2658 Fix sqlite path in default config 2020-06-22 23:13:41 +02:00
kolaente f324e3fb28 Fix docker multiarch build 2020-06-22 21:33:55 +02:00
kolaente 894d35e4fe Fix docker manifest build 2020-06-22 20:54:38 +02:00
kolaente 1d9cd82d68 Simplify pipeline & add docker manifest step 2020-06-22 19:23:52 +02:00
kolaente 2bc26fe4fa Make sure docker images are only built when tests pass 2020-06-22 16:40:41 +02:00
kolaente 4168b9ac26 Add seperate docker pipeline for amd64 and arm 2020-06-22 16:16:19 +02:00
leggettc18andkonrad 8b030135de Added section to full-docker-example.md for Caddy v2. (#595)
Fixed one more leftover formatting oddity.

Fixed some leftovers from copy-paste.

Added section to full-docker-example.md for Caddy v2.

Co-authored-by: Christopher Leggett <chris@leggett.dev>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/595
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-22 04:48:00 +00:00
kolaente 150c3f032c Prevent crashing when trying to register with an empty payload 2020-06-21 20:54:46 +02:00
kolaente bfc4dd05ed Add docs for restore 2020-06-21 17:34:34 +02:00
kolaente cd812b4232 update theme 2020-06-21 17:32:38 +02:00
konradandkolaente e4f150bbe3 Restore command (#593)
Add waiting for changes to config file

Add max size for config files

Restore files

Restore database file

Expose migrate to

Move init stuff to seperate package

Add restoring config file

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/593
2020-06-21 15:30:48 +00:00
kolaente db0126968a Improve memory usage of dump by not loading all files in memory prior to adding them to the zip 2020-06-20 11:48:45 +02:00
kolaente c12bac0c96 Return errors when dumping 2020-06-20 11:37:51 +02:00
konradandkolaente fba333866d Add dump command (#592)
Fix files location in dump

Fix gitignore

Add docs

Add dumps to gitignore

Move dump to seperate package

logging

Dump files

Dump version

Dump database

Dump config

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/592
2020-06-19 21:29:02 +00:00
konradandkolaente d02d413c5e Sentry integration (#591)
Use sentry echo integration to send errors

Only capture errors not already handled by echo

Add sentry panic handler

Add sentry library

Add sentry init

Add sentry config

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/591
2020-06-19 18:47:15 +00:00
renovateandkonrad c51662c270 Update module src.techknowlogick.com/xormigrate to v1.3.0 (#590)
Update module src.techknowlogick.com/xormigrate to v1.3.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/590
2020-06-18 18:51:06 +00:00
kolaente 021e3e307b Remove build date from binary 2020-06-18 19:26:53 +02:00
kolaente b4cdb75d15 Update xorm.io/xorm 1.0.1 -> 1.0.2 2020-06-18 19:22:58 +02:00
kolaente ad6ef03c0c Update xorm.io/xorm 1.0.1 -> 1.0.2 2020-06-18 19:22:43 +02:00
kolaente 5930d5aabf Update web handler 2020-06-18 18:48:48 +02:00
kolaente 3c5925c827 Add plausible to docs 2020-06-18 18:33:30 +02:00
renovateandkonrad b7c8c1f533 Update module prometheus/client_golang to v1.7.0 (#589)
Update module prometheus/client_golang to v1.7.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/589
2020-06-17 21:24:13 +00:00
renovateandkonrad bf41b2ed9f Update module spf13/afero to v1.3.0 (#588)
Update module spf13/afero to v1.3.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/588
2020-06-17 16:52:36 +00:00
kolaente 525a547500 Remove min length for labels, lists, namespaces, tasks and teams 2020-06-17 18:52:23 +02:00
kolaente ca4d5000ed Add list background information when getting all lists 2020-06-16 18:57:08 +02:00
kolaente 24c1098736 Fix resetting list, label & namespace colors 2020-06-15 11:32:07 +02:00
konradandkolaente 47d7e713af Repeat tasks after completion (#587)
Fix integration tests

Add updating start and end date from current date

Add updating reminders from current date

Add updating reminders from current date

Add updating due date from current date

Add updating flag

Add tests

Add field to repeat a task after current date

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/587
2020-06-14 11:04:38 +00:00
kolaente 3ba26ce67e Fix docs theme build 2020-06-13 23:44:05 +02:00
konradandkolaente ab1d58959f Ensure task dates are in the future if a task has a repeating interval (#586)
Ensure task dates are in the future if a task has a repeating interval

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/586
2020-06-13 21:32:31 +00:00
konradandkolaente f17e378a93 Add migration test in drone (#585)
Add test migration for postgres & mysql

More logging

Set database type explicitly to sqlite

Only extract vikunja binary

Add seperate build step to speed up tests

Add migration test in drone

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/585
2020-06-13 20:45:18 +00:00
kolaente f5e44d9eb3 Reorganize cmd init functions 2020-06-13 19:44:45 +02:00
kolaente d9d00ba60c Fix migration 20200516123847 2020-06-13 19:33:48 +02:00
kolaente a15b1bebba Fix migration 20200425182634 2020-06-13 19:27:12 +02:00
kolaente 980be0e4e0 update theme 2020-06-12 23:37:47 +02:00
konradandkolaente a0ffe89056 List Background upload (#582)
Add filesize check when uploading a new file

Fix error 500 if the uploaded background was not an unsplash one

Add upload background setting to info endpoint

Add config docs

Fix lint

Return list background type if it was uploaded

Add file upload

Add docs

Save uploaded backgrounds as file

Add background upload handler

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/582
2020-06-11 17:31:37 +00:00
renovateandkonrad bd11c9650e Update module lib/pq to v1.7.0 (#581)
Update module lib/pq to v1.7.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/581
2020-06-08 21:17:38 +00:00
kolaente 32a5dff78d Fix migration to add position to task
Signed-off-by: kolaente <k@knt.li>
2020-06-07 18:28:49 +02:00
renovateandkonrad 8ef2da8f5f Update module stretchr/testify to v1.6.1 (#580)
Update module stretchr/testify to v1.6.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/580
2020-06-05 13:26:48 +00:00
renovateandkonrad 60e802d77f Update module go-redis/redis/v7 to v7.4.0 (#579)
Update module go-redis/redis/v7 to v7.4.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/579
2020-06-05 13:26:35 +00:00
renovateandkonrad 966acf51d8 Update golang.org/x/crypto commit hash to 70a84ac (#578)
Update golang.org/x/crypto commit hash to 70a84ac

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/578
2020-06-05 13:26:21 +00:00
renovateandkonrad b5b84e6bbd Update golang.org/x/crypto commit hash to 279210d (#577)
Update golang.org/x/crypto commit hash to 279210d

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/577
2020-06-03 08:53:09 +00:00
renovateandkonrad f72aa4e52f Update src.techknowlogick.com/xgo commit hash to a09175e (#576)
Update src.techknowlogick.com/xgo commit hash to a09175e

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/576
2020-06-02 07:33:43 +00:00
renovateandkonrad d9f1d456d3 Update src.techknowlogick.com/xgo commit hash to eeb7c0a (#575)
Update src.techknowlogick.com/xgo commit hash to eeb7c0a

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/575
2020-06-02 06:39:25 +00:00
renovateandkonrad 67f4c9f941 Update module src.techknowlogick.com/xormigrate to v1.2.1 (#574)
Update module src.techknowlogick.com/xormigrate to v1.2.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/574
2020-06-01 10:33:58 +00:00
kolaente d63666cece Fix getting unsplash thumbnails for non "photo-*" urls 2020-05-31 22:40:27 +02:00
kolaente d8a6acda96 Fix proxying unsplash images (security) 2020-05-31 22:36:25 +02:00
kolaente 03ef48a0ae Properly ping unsplash when using unsplash images 2020-05-31 22:06:59 +02:00
kolaente 8f35b9d579 Set unsplash empty collection caching to one hour 2020-05-31 20:50:51 +02:00
kolaente ebfa982c72 Fix misspell 2020-05-31 18:12:32 +02:00
kolaente 2fa4fcc202 Fix caching of initial unsplash results per page 2020-05-31 18:09:46 +02:00
kolaente ad67154e26 Add cache for initial unsplash collection 2020-05-31 17:59:39 +02:00
kolaente 250c45d1b9 Remove migration dependency to models 2020-05-30 17:09:35 +02:00
kolaente dc036d44db Update theme 2020-05-30 17:00:52 +02:00
renovateandkonrad 9c4c265767 Update alpine Docker tag to v3.12 (#573)
Update alpine Docker tag to v3.12

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/573
2020-05-29 21:44:01 +00:00
kolaente a525787ab7 Update and fix staticcheck 2020-05-29 22:15:21 +02:00
kolaente aae1bc3cab Load the list when setting a background 2020-05-29 22:12:16 +02:00
kolaente 42ddee8d6f Add logging if downloading an image from unsplash fails 2020-05-29 22:11:49 +02:00
renovateandkonrad 54b18b3c59 Update module lib/pq to v1.6.0 (#572)
Update module lib/pq to v1.6.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/572
2020-05-29 17:47:28 +00:00
kolaente 5a04f1ecf4 Add option to disable totp for everyone 2020-05-29 17:15:59 +02:00
kolaente a0fb8bd32d Add unsplash image proxy for images and thumbnails 2020-05-29 15:33:46 +02:00
konradandkolaente c685250c96 Add test mail command (#571)
Add test mail command

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/571
2020-05-29 13:10:06 +00:00
renovateandkonrad 9ea1104764 Update module stretchr/testify to v1.6.0 (#570)
Update module stretchr/testify to v1.6.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/570
2020-05-29 09:37:34 +00:00
kolaente 2ef2c7523d Also return unsplash info when searching 2020-05-27 22:12:12 +02:00
konradandkolaente e5e30d0915 List Backgrounds (#568)
Return the updated list when setting a list background

Add swagger docs for unsplash methods

Add unsplash info to search results

Fix misspell

Fix lint

Add rights check for setting and getting backgrounds

Show unsplash information when loading a single list

Make application id for pingbacks configurable

Remove old backgrounds when setting a new one

Return 404 if the list does not have a background

Implement getting list backgrounds

Implement actually setting a photo from unsplash as list background

go mod tidy

Add migration for background file id

Roughly implement setting a list background from unsplash

Implement saving a background

Add migration for unsplash photo table

Add unsplash search

Fix parsing page param

Fix parsing page param

Fix background config

Add unsplash wrapper library

Add enabled background providers to info endpoint

Add config options for backgrounds

Add unsplash background provider

Add routing handler for backgrounds

Add basic background provider interface

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/568
2020-05-26 20:07:55 +00:00
kolaente c37b776f7a Add docker setup guide from start to finish 2020-05-24 13:50:17 +02:00
kolaente e9bc3246ce Add todoist migrator to available migrators in info endpoint if it is enabled 2020-05-24 12:51:38 +02:00
konradandkolaente e89e6d47d4 Todoist Migration (#566)
Add swagger docs + fix lint

Add parsing logic + fix fixtures

Fix test init

Add logging to creating labels and debug logs

Add creating labels when migrating

Finish test fixtures

Started adding fixtures for testing

Add method and test structures to convert todoist to vikunja

Add basic structure to migrate everything

Add all structs for todoist api

Add docs for config options

Add routes for todoist migrator

Add api token exchange

Add basic structure for todoist migration

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/566
2020-05-23 20:50:54 +00:00
kolaente 292c815000 Add restarting commands to all example docker compose files 2020-05-23 19:34:44 +02:00
kolaente f0b1de5ec6 Use the db logger instance for logging migration related stuff 2020-05-23 18:33:11 +02:00
kolaente 4204af255c Add ability to run the docker container with configurable user and group ids 2020-05-22 21:18:11 +02:00
renovateandkonrad b0948a37d4 Update module go-redis/redis/v7 to v7.3.0 (#565)
Update module go-redis/redis/v7 to v7.3.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/565
2020-05-21 08:56:39 +00:00
kolaente cc47d11792 "fix" gocyclo check 2020-05-19 17:41:37 +02:00
kolaente b6b82e6f54 Merge branch 'release/0.13' 2020-05-19 17:28:32 +02:00
kolaente 16ed5fd982 Release preparations 2020-05-19 17:27:37 +02:00
kolaente 24aa68f090 Don't return all tasks when a user has no lists 2020-05-19 17:23:49 +02:00
kolaente 98ef052967 Don't return all tasks when a user has no lists 2020-05-19 17:22:10 +02:00
kolaente 8a01b20e1e Fix setting a list identifier to empty 2020-05-16 13:13:11 +02:00
kolaente 5a86f44fc3 Generate a random list identifier based on the list title 2020-05-16 12:58:37 +02:00
konradandkolaente fe43173b6c Ensure consistent naming of title fields (#528)
Remove task text and namespace name in migration

Fix lint

Add migration for namespace title

Fix renaming namespace name to title

Rename namespace name field to title

Drop text column at the end of the migration

Add migration for task text to title

Rename task text to title

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/528
2020-05-16 10:17:44 +00:00
konradandkolaente 587ce92dc9 Improve getting all namespaces performance (#526)
Improve getting all namespaces performance

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/526
2020-05-15 15:10:22 +00:00
konradandkolaente 8758fb6ac5 Fix case-insensitive task search for postgresql (#524)
"Fix" gocyclo

Fix case-insensitive task search for postgresql

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/524
2020-05-15 14:12:20 +00:00
kolaente 92e5e2db6a Make the _unix suffix optional when sorting tasks 2020-05-15 16:07:36 +02:00
renovateandkonrad 851f0d6c08 Update src.techknowlogick.com/xgo commit hash to 209a5cf (#523)
Update src.techknowlogick.com/xgo commit hash to 209a5cf

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/523
2020-05-15 13:28:38 +00:00
kolaente 333444b4e1 Improve metrics performance 2020-05-15 14:42:32 +02:00
konradandkolaente 28a5c1f7b2 Remove dependencies on build step to speed up test pipeline (#521)
Make all steps depend on fetch tags to let them execute in parallel

Cleanup

Remove dependency from the build step everywhere

Add generation step for tests

Remove dependencies on build step to speed up test pipeline

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/521
2020-05-15 12:06:12 +00:00
renovateandkonrad 4533ac6b28 Update module spf13/cobra to v1 (#511)
Update module spf13/cobra to v1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/511
2020-05-14 19:09:06 +00:00
kolaente 91a3b7aba2 0.13 release preperations 2020-05-12 22:11:46 +02:00
kolaente 4137d4aed2 Fix creating new things with a link share auth 2020-05-12 15:51:48 +02:00
kolaente cb095d70df Add explanation to docs about cors 2020-05-12 11:10:07 +02:00
kolaente e43e601912 Add traefik 2 example configuration 2020-05-11 22:02:15 +02:00
kolaente 55cd40d175 Fix team rights not updating for namespace rights 2020-05-11 18:39:30 +02:00
renovateandkonrad 55cd74efca Update module go-testfixtures/testfixtures/v3 to v3.2.0 (#505)
Update module go-testfixtures/testfixtures/v3 to v3.2.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/505
2020-05-11 10:10:15 +00:00
renovateandkonrad a9d0079bf3 Update golang.org/x/crypto commit hash to 06a226f (#504)
Update golang.org/x/crypto commit hash to 06a226f

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/504
2020-05-11 09:02:23 +00:00
konradandkolaente 8ac158cdb4 Task Filter Fixes (#495)
Fix gocyclo

Fix misspell

Error codes docs

Filter fixes

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/495
2020-05-09 15:48:56 +00:00
renovateandkonrad def2362682 Update module spf13/viper to v1.7.0 (#494)
Update module spf13/viper to v1.7.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/494
2020-05-09 13:44:17 +00:00
kolaente 18f6e31b54 Fix parsing array style comparators by query param 2020-05-09 15:08:58 +02:00
kolaente 7e1d0a81bf Change totp secret datatype from varchar to text 2020-05-09 14:45:57 +02:00
renovateandkonrad f30e405229 Update module lib/pq to v1.5.2 (#491)
Update module lib/pq to v1.5.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/491
2020-05-08 13:23:26 +00:00
kolaente 563fe16bd4 Add checking and logging when trying to put a task into a nonexisting bucket 2020-05-07 10:20:10 +02:00
kolaente a30a358b73 Update theme 2020-05-06 21:03:15 +02:00
kolaente 497499e221 Fix reference to reverse proxies in docs 2020-05-06 21:02:58 +02:00
kolaente 1fdc51078e Add docs for changing frontend url 2020-05-06 20:44:48 +02:00
renovateandkonrad 60f343a926 Update module lib/pq to v1.5.1 (#485)
Update module lib/pq to v1.5.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/485
2020-05-05 08:59:08 +00:00
konradandkolaente fd3ccd6130 Fix total label count when getting all labels (#477)
Fix total label count when getting all labels

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/477
2020-05-03 21:28:36 +00:00
kolaente a97ce76f1f Fix bucket ID being reset with no need to do so 2020-05-03 22:25:48 +02:00
kolaente 83cf6e191c Fix not moving its bucket when moving a task between lists 2020-05-03 21:33:59 +02:00
kolaente f0ac6e89be Remove setting task bucket to 0 2020-05-03 21:24:28 +02:00
renovateandkonrad 23950c0602 Update module lib/pq to v1.5.0 (#476)
Update module lib/pq to v1.5.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/476
2020-05-03 18:14:57 +00:00
renovateandkonrad 19a05a7c2c Update golang.org/x/crypto commit hash to 4b2356b (#475)
Update golang.org/x/crypto commit hash to 4b2356b

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/475
2020-05-01 10:06:00 +00:00
renovateandkonrad 299e856736 Update module prometheus/client_golang to v1.6.0 (#463)
Update module prometheus/client_golang to v1.6.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/463
2020-04-28 18:50:58 +00:00
renovateandkonrad 6d95dc16c2 Update golang.org/x/crypto commit hash to 729f1e8 (#458)
Update golang.org/x/crypto commit hash to 729f1e8

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/458
2020-04-27 18:56:31 +00:00
kolaente fa28ddc2f7 Fix pagination count for task collection 2020-04-27 19:28:19 +02:00
kolaente 56dbb564ea Fix link share creation & creating admin link shares without admin rights 2020-04-27 12:51:09 +02:00
renovateandkonrad 711124f5c0 Update module go-testfixtures/testfixtures/v3 to v3.1.2 (#457)
Update module go-testfixtures/testfixtures/v3 to v3.1.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/457
2020-04-27 09:10:08 +00:00
kolaente 5606f987fa Add creating a new first bucket when creating a new list 2020-04-26 15:51:59 +02:00
kolaente f0cb3b5e36 Fix removing the last bucket 2020-04-26 00:57:47 +02:00
konradandkolaente 231dc3913f Add real buckets for tasks which don't have one (#446)
Add docs for error code

Add moving new tasks into the default bucket when none was provided

Add moving tasks in default bucket when deleting one

Fix tests again

Add test for removing a bucket

Fix tests

Prevent removing the last bucket

Remove the empty pseudo bucket

Add migration to create a new bucket for each list (and put all tasks in it

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/446
2020-04-25 20:32:02 +00:00
renovateandkonrad 2b1fc441e6 Update golang.org/x/crypto commit hash to 4bdfaf4 (#438)
Update golang.org/x/crypto commit hash to 4bdfaf4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/438
2020-04-24 15:23:22 +00:00
e433289832 Task Position (#412)
Fix misspell

Fix sorting tasks with null values

Fix sorting by priority for postgres

Merge branch 'master' into feature/position

Add community link

Update golang.org/x/crypto commit hash to 44a6062 (#429)

Update golang.org/x/crypto commit hash to 44a6062

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/429

Update module lib/pq to v1.4.0 (#428)

Update module lib/pq to v1.4.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/428

Fix updating position

Add ordering tasks in buckets by position

Make task sort by string

Merge branch 'master' into feature/position

Update golang.org/x/crypto commit hash to 3c4aac8 (#419)

Update golang.org/x/crypto commit hash to 3c4aac8

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/419

Merge branch 'master' into feature/position

Fix moving tasks back into the empty (ID: 0) bucket

Add adding a default position when creating new tasks

Update golang.org/x/crypto commit hash to a76a400 (#411)

Update golang.org/x/crypto commit hash to a76a400

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/411

Remove unused code

Fix tests

Add migration for position attribute

Add position attribute

Co-authored-by: kolaente <k@knt.li>
Co-authored-by: renovate <renovatebot@kolaente.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/412
2020-04-24 15:23:03 +00:00
kolaente 86bdd1e386 Add community link 2020-04-24 13:00:29 +02:00
renovateandkonrad 4f1c0d99ea Update golang.org/x/crypto commit hash to 44a6062 (#429)
Update golang.org/x/crypto commit hash to 44a6062

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/429
2020-04-22 22:49:56 +00:00
renovateandkonrad f0792cfb0b Update module lib/pq to v1.4.0 (#428)
Update module lib/pq to v1.4.0

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/428
2020-04-22 10:16:38 +00:00
renovateandkonrad dece744685 Update golang.org/x/crypto commit hash to 3c4aac8 (#419)
Update golang.org/x/crypto commit hash to 3c4aac8

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/419
2020-04-21 07:41:16 +00:00
kolaente 68ab6d2e75 Fix moving tasks back into the empty (ID: 0) bucket 2020-04-20 23:08:38 +02:00
renovateandkonrad c69f0bf3cb Update golang.org/x/crypto commit hash to a76a400 (#411)
Update golang.org/x/crypto commit hash to a76a400

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/411
2020-04-20 20:58:32 +00:00
kolaente 59037e4eee Fix moving tasks in buckets 2020-04-20 18:08:20 +02:00
kolaente 1bd8348be7 Add categories to error docs 2020-04-19 14:33:51 +02:00
konradandkolaente ecdecdd94e Kanban (#393)
Fix tests

Add error docs

Add swagger docs for bucket endpoints

Add integration tests

Fix tests

Fix err shadow

Make sure a bucket and a task belong to the same list when adding or updating a task

Add tests

Add getting users of a bucket

Fix log level when testing

Fix lint

Add migration for buckets

Cleanup/Comments/Reorganization

Add Kanban bucket handling

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/393
2020-04-19 07:27:28 +00:00
konradandkolaente 28ec44c91f Add moving tasks between lists (#389)
Fix misspell

Add moving tasks between lists

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/389
2020-04-18 12:35:37 +00:00
kolaente 895d9613b5 Add endpoint to disable totp auth 2020-04-18 01:38:49 +02:00
kolaente 87d0c9088d Add endpoint to get the current users totp status 2020-04-18 00:22:59 +02:00
konradandkolaente 24904585a2 Add 2fa for authentification (#383)
Fix user tests

Add swagger docs

Fix lint

Add totp check when logging in

Make totp enrollment work

Add migration for totp table

go mod vendor

Add routes for totp routes

Add route handler for totp routes

Add basic implementation to enroll a user in totp

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/383
2020-04-17 19:25:35 +00:00
kolaente 1dca8e96a7 Add changing email for users 2020-04-17 16:01:45 +02:00
kolaente e1ab2095fa Update docs theme 2020-04-16 23:31:36 +02:00
renovateandkonrad 12e18de8ad Update golang.org/x/crypto commit hash to 0848c95 (#371)
Update golang.org/x/crypto commit hash to 0848c95

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/371
2020-04-15 06:48:46 +00:00
kolaente 025b00247d Fix replace statements for tail 2020-04-14 21:37:00 +02:00
kolaente 5832991c4d Fix tests after renaming json fields to snake_case 2020-04-13 23:27:55 +02:00
kolaente 81990f3f80 Update xorm redis cacher to use the xorm logger instead of a special seperate one 2020-04-13 23:18:33 +02:00
kolaente 368cbdf979 Fix gosec in drone 2020-04-13 23:04:59 +02:00
kolaente b8d7c97eb7 Add gosec static analysis 2020-04-13 22:30:09 +02:00
kolaente fb8ac92abf Change all json fields to snake_case 2020-04-12 22:48:46 +02:00
kolaente 0bfb3a4709 Add configuration options for log level 2020-04-12 22:32:21 +02:00
kolaente 9559a68416 Update module prometheus/client_golang to v1 2020-04-12 22:06:24 +02:00
konradandkolaente d28f005552 Update xorm to v1 (#323)
Fix limit for databases other than sqlite

go mod tidy && go mod vendor

Remove unneeded break statements

Make everything work with the new xorm version

Fix xorm logging

Fix lint

Fix redis init

Fix using id field

Fix database init for testing

Change default database log level

Add xorm logger

Use const for postgres

go mod tidy

Merge branch 'master' into update/xorm

# Conflicts:
#	go.mod
#	go.sum
#	vendor/modules.txt

go mod vendor

Fix loading fixtures for postgres

Go mod vendor1

Update xorm to version 1

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/323
2020-04-12 17:29:24 +00:00
renovateandkonrad 713560702b Update module go-redis/redis to v7 (#309)
Update module go-redis/redis to v7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/309
2020-04-11 21:43:04 +00:00
konradandkolaente 0ba121fdfb Task filters (#243)
Fix not returning errors

Fix integration tests

Add more tests

Make task filtering actually work

Change tests

Fix using filter conditions

Fix test

Remove unused fields

Fix static check

Remove start and end date fields on task collection

Fix misspell

add filter logic when getting tasks

Add parsing filter query parameters into task filters

Start adding support for filters

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/243
2020-04-11 14:20:33 +00:00
kolaente 0e2449482f Fix dependencies 2020-04-09 23:06:57 +02:00
renovateandkonrad 8d1a3f4fd7 Update module spf13/viper to v1.6.3 (#291)
Update module spf13/viper to v1.6.3

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/291
2020-04-09 20:29:11 +00:00
renovateandkonrad 1e0f2dde6a Update module go-redis/redis to v6.15.7 (#290)
Update module go-redis/redis to v6.15.7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/290
2020-04-09 20:28:58 +00:00
renovateandkonrad 7abac07837 Update src.techknowlogick.com/xgo commit hash to bb0faa3 (#279)
Update src.techknowlogick.com/xgo commit hash to bb0faa3

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/279
2020-04-09 04:36:03 +00:00
renovateandkonrad 15d718fb1a Update module go-redis/redis to v7 (#277)
Update module go-redis/redis to v7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/277
2020-04-09 04:35:36 +00:00
renovateandkonrad 4ca3f714ea Update module stretchr/testify to v1.5.1 (#274)
Update module stretchr/testify to v1.5.1

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/274
2020-04-08 20:30:48 +00:00
renovateandkonrad 6d1b123a25 Update module spf13/cobra to v0.0.7 (#271)
Update module spf13/cobra to v0.0.7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/271
2020-04-08 19:44:10 +00:00
renovateandkonrad 13ebb98644 Update module spf13/viper to v1.6.2 (#272)
Update module spf13/viper to v1.6.2

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/272
2020-04-08 18:43:35 +00:00
renovateandkonrad dda558fe1c Update module prometheus/client_golang to v0.9.4 (#245)
Update module prometheus/client_golang to v0.9.4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/245
2020-04-07 20:42:06 +00:00
renovateandkonrad 76f19db6e7 Update module labstack/echo/v4 to v4.1.16 (#241)
Update module labstack/echo/v4 to v4.1.16

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/241
2020-04-07 18:59:53 +00:00
renovateandkonrad f776b799b8 Update module olekukonko/tablewriter to v0.0.4 (#240)
Update module olekukonko/tablewriter to v0.0.4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/240
2020-04-07 16:58:27 +00:00
renovateandkonrad 746a443660 Update module imdario/mergo to v0.3.9 (#238)
Update module imdario/mergo to v0.3.9

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/238
2020-04-07 16:05:10 +00:00
renovateandkonrad 026d3dc80d Update module go-redis/redis to v6.15.7 (#234)
Update module go-redis/redis to v6.15.7

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/234
2020-04-07 12:31:33 +00:00
renovateandkonrad fd7dd47d5e Update github.com/gordonklaus/ineffassign commit hash to 7953dde (#233)
Update github.com/gordonklaus/ineffassign commit hash to 7953dde

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/233
2020-04-07 12:30:57 +00:00
renovateandkonrad 1e5a1b4892 Update github.com/shurcooL/httpfs commit hash to 8d4bc4b (#229)
Update github.com/shurcooL/httpfs commit hash to 8d4bc4b

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/229
2020-04-07 08:39:00 +00:00
renovateandkonrad c7f6748761 Update github.com/jgautheron/goconst commit hash to cda7ea3 (#228)
Update github.com/jgautheron/goconst commit hash to cda7ea3

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/228
2020-04-07 08:38:00 +00:00
renovateandkonrad 7efa0069cb Update golang.org/x/crypto commit hash to 056763e (#222)
Update golang.org/x/crypto commit hash to 056763e

Update golang.org/x/lint commit hash to 738671d (#223)

Update golang.org/x/lint commit hash to 738671d

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/223

Update src.techknowlogick.com/xgo commit hash to c43d4c4 (#224)

Update src.techknowlogick.com/xgo commit hash to c43d4c4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/224

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/222
2020-04-07 08:37:20 +00:00
renovateandkonrad 424cf80e5c Update golang.org/x/lint commit hash to 738671d (#223)
Update golang.org/x/lint commit hash to 738671d

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/223
2020-04-07 07:29:05 +00:00
renovateandkonrad 1448d9de98 Update src.techknowlogick.com/xgo commit hash to c43d4c4 (#224)
Update src.techknowlogick.com/xgo commit hash to c43d4c4

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/224
2020-04-07 07:28:48 +00:00
renovateandkonrad cbf01e118a Update github.com/c2h5oh/datasize commit hash to 28bbd47 (#212)
Update github.com/c2h5oh/datasize commit hash to 28bbd47

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/212
2020-04-06 20:28:57 +00:00
renovateandkonrad 191942fcd1 Update alpine Docker tag to v3.11 (#160)
Update alpine Docker tag to v3.11

Add github token for renovate (#164)

Add github token for renovate

Add github token for renovate

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/164

Update Renovate Configuration (#161)

Add labels to renovate

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/161

Co-authored-by: konrad <konrad@kola-entertainments.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/160
2020-04-06 06:40:42 +00:00
konradandkolaente d5c8f2541d Add github token for renovate (#164)
Add github token for renovate

Add github token for renovate

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/164
2020-04-05 19:16:21 +00:00
konradandkolaente 6e9ad3d808 Update Renovate Configuration (#161)
Add labels to renovate

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/161
2020-04-05 17:24:06 +00:00
renovateandkonrad 36fdff5b8b Configure Renovate (#159)
Add renovate.json

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/159
2020-04-05 15:11:27 +00:00
kolaente 8f4139f44a 0.12 Release Preparations 2020-04-04 22:29:32 +02:00
kolaente e7706a20dd Fix call to println
Signed-off-by: kolaente <k@knt.li>
2020-04-02 21:38:16 +02:00
kolaente 6d1018e647 Fix searching for config in home directories
Signed-off-by: kolaente <k@knt.li>
2020-04-02 21:13:42 +02:00
kolaente 11246b948f Fix getting the authenticated user with caldav
Signed-off-by: kolaente <k@knt.li>
2020-04-01 22:51:57 +02:00
konradandkolaente 7b619bd084 Colors for lists and namespaces (#155)
Add Hex Color properties migration

Add Hex Color properties

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/155
2020-03-22 21:09:32 +00:00
kolaente 35f05cbbec Show lists as archived if their namespace is archived
Signed-off-by: kolaente <k@knt.li>
2020-03-22 21:39:57 +01:00
kolaente 0a1887d6e7 Fix archiving namespaces
Signed-off-by: kolaente <k@knt.li>
2020-03-22 19:02:53 +01:00
kolaente c6d22bb1f8 Fix updating lists with an identifier
Signed-off-by: kolaente <k@knt.li>
2020-03-22 18:45:10 +01:00
kolaente 6132863f4a Fix getting archived lists and namespaces
Signed-off-by: kolaente <k@knt.li>
2020-03-22 18:24:54 +01:00
kolaente 26ffd2fd22 Fix getting one namespace
Signed-off-by: kolaente <k@knt.li>
2020-03-21 13:55:42 +01:00
51c74de1de expand relative path ~/.config/vikunja to $HOME/.config/vikunja **WINDOWS** (#147)
apply correct formatting

add quotes to make the yaml gods happy

log path of config file used by viper

resolve merge conflicts: windows compatible $HOME path

Prepare changelog & readme for 0.11 release

expand relative path ~/.config/vikunja to $HOME/.config/vikunja (#146)

update dependencies

expand relative path ~/.config/vikunja

Co-authored-by: Julian <juliangaal@protonmail.com>
Co-authored-by: konrad <konrad@kola-entertainments.de>

Co-authored-by: Julian Gaal <gjulian@uos.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/147
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-03-20 21:21:44 +00:00
konradandkolaente 5126330a10 Add support for archiving lists and namespaces (#152)
Add query param to get all lists including archived ones

Add query param to get all namespaces including archived ones

Fix getting lists by namespace only not archived lists

Fix misspell

Fix lint

Merge branch 'master' into feature/archive-lists-namespaces

Add docs for error codes

Fix archive error codes

Don't let archived lists show up in general lists

Fix updating description

Fix updating lists with link shares

More comments

Fix un-archiving lists

Move check for archiving a list to canWrite Check

Add more tests

Add more checks

Add checks for namespaces and lists

Add namespace edit

Add tests

Add migrations and filter

Add basic tests

Add is archived property to lists and namespaces

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/152
2020-03-15 21:50:39 +00:00
konradandkolaente 4472020ee9 Add workaround for timezones on windows (#151)
Add workaround for timezones on windows

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/151
2020-03-09 22:41:08 +00:00
kolaente 7de26a462f Add build time to compile flags 2020-03-02 20:24:26 +01:00
kolaente f2f17b11e8 Change release bucket 2020-03-01 22:51:50 +01:00
konradandkolaente cdd068cdb6 Add empty avatar provider (#149)
Fix lint

Add docs for avatar configuration

Add default avatar provider

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/149
2020-03-01 21:10:25 +00:00
konradandkolaente 584e3af237 Add proxying gravatar requests for user avatars (#148)
Fix getting avatar based on email

Remove avatarUrl from user struct

Fix staticcheck

Add default avatar size

Add config option for caching avatars

go mod vendor

Add swagger docs

Add proxying gravatar requests for user avatars

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/148
2020-03-01 20:30:37 +00:00
kolaente 7ddfa76a84 Prepare changelog & readme for 0.11 release 2020-03-01 17:32:38 +01:00
funkythingsandkonrad 1e03c39141 expand relative path ~/.config/vikunja to $HOME/.config/vikunja (#146)
update dependencies

expand relative path ~/.config/vikunja

Authored-by: Julian Gaal <gjulian@uos.de>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/146
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-02-29 19:51:47 +00:00
konradandkolaente 88bf8f3df0 Fix updating dates when marking a task as done (#145)
Fix lint

Fix reminders not being updated

Fix updating dates when marking a task as done

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/145
2020-02-26 21:09:45 +00:00
kolaente c551706b52 Make sure the author is returned when creating a new comment 2020-02-25 21:18:42 +01:00
konradandkolaente 1f039c4cda Task Comments (#138)
Add swagger docs

Add integration tests

Add tests

Add task comment test fixtures

Add config option to enable/disable task comments

Add custom error if a task comment does not exist

Fix lint

Add getting author when getting a single comment

Fix getting comments/comments author

Add rights check to ReadAll

+ actually get the comment author

Add migration and table definitions

Add routes

Add ReadOne method

Add basic crud rights

Signed-off-by: kolaente <k@knt.li>

Implement basic crudable functions for task comments

Signed-off-by: kolaente <k@knt.li>

Start adding task comments

Signed-off-by: kolaente <k@knt.li>
Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/138
2020-02-19 21:57:56 +00:00
konradandkolaente 5901cf64b4 Fix inserting task structure with related tasks (#142)
Fix typo

Fix creating related tasks

Add better logging

Fix inserting task structure with related tasks

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/142
2020-02-18 22:00:54 +00:00
kolaente f87bb6d8ef Update theme 2020-02-18 18:47:19 +01:00
kolaente 021a715aff Fix frontend url for wunderlist migration in docs 2020-02-17 19:52:26 +01:00
konradandkolaente e95a6eeb11 Explicitly disable wunderlist migration by default (#141)
Fix wunderlist callback link in docs

Explicitly disable wunderlist migration by default

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/141
2020-02-17 17:29:17 +00:00
Dpvhandkonrad f46e9cb64e Fixed typo in docker-compose example (#140)
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/140
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-02-17 16:47:55 +00:00
ce5be947b4 Add postgres support (#135)
Revert fixture fixes for postgres

Use postgres connection string with spaces instead of url

Fix label order

Make postgres tests in ci less verbose

Add sequence update script

Skip resets in postgres

Remove option to skip resets in postgres

Make postgres tests in ci verboseq

Update test fixtures database

Fix file tests on postgres

Add postgres options to sample config

Make sure tests init test fixtures before running the actual tests

Fix issues with IDs too big to fit in an int

Fix duplicate auto incremented IDs

Refactor / Fix team tests

Refactor team member tests

Fix team member create

Fix label test

Fix getting labels

Fix test fixtures for postgresql

Fix connection string params

Disable ssl mode on postgres integration tests

Disable ssl mode on postgres tests

Use sprintf to create the connection string for postgresql

fixup! Add postgres support

Add postgres support

Added generate as a make dependency for make build

Clarify docs on building

Co-authored-by: kolaente <k@knt.li>
Co-authored-by: Jan Tojnar <jtojnar@gmail.com>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/135
2020-02-16 21:42:04 +00:00
kolaente 7e42724439 Added generate as a make dependency for make build
Clarify docs on building

Signed-off-by: kolaente <k@knt.li>
2020-02-15 11:35:24 +01:00
konradandkolaente caf91d1904 Update xorm to use the new import path (#133)
Fix ineffassign

Fix getting all labels including the ones not associated to a task

Signed-off-by: kolaente <k@knt.li>

Fix logging sql queries

Signed-off-by: kolaente <k@knt.li>

Start fixing getting all labels

Update xormigrate

Update xorm to use the new import path

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/133
2020-02-14 16:34:25 +00:00
shilchandkonrad 014ec2be69 Use relative url in .gitmodules (#132)
Use relative url in .gitmodules

Co-authored-by: Simon Hilchenbach <simon@hilchenba.ch>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/132
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-02-13 21:18:49 +00:00
kolaente 5d96c62a47 Fix time zone settings not working in Docker 2020-02-08 23:18:41 +01:00
kolaente 1c3b35fa6f Add more logging to web handler methods 2020-02-08 22:45:38 +01:00
kolaente d84a160054 Remove double user field 2020-02-08 22:12:06 +01:00
konradandkolaente db2d868eed Return iso dates for everything date related from the api (#130)
Remove traces of unix timestamp

Revert renaming reminder table column

Fix staticcheck

Remove unused table call

Add migration for renaming reminders table

Fix issues with using TimeStamp

Fix lint

Updated all created / updated fields to use TimeStamps

Add comments

Convert all created / updated fields to datetime

Add time util package

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/130
2020-02-08 12:48:49 +00:00
kolaente 1f99238019 Update copyright header 2020-02-07 17:27:45 +01:00
konradandkolaente f603b41d99 Better efficency for loading teams (#128)
Fix staticcheck

Better performance for getting teams on a namespace

Better performance for getting teams on a list

Fix lint

Fix swagger

Signed-off-by: kolaente <k@knt.li>

Make loading a single full team more efficent

Signed-off-by: kolaente <k@knt.li>

Make loading teams more efficent

Signed-off-by: kolaente <k@knt.li>

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/128
2020-01-27 17:28:17 +00:00
konradandkolaente 2abb858859 Add rate limit by ip for non-authenticated routes (#127)
Add rate limit by ip for non-authenticated routes

Signed-off-by: kolaente <k@knt.li>

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/127
2020-01-26 19:53:47 +00:00
konradandkolaente a464d1760c Add logging for invalid model errors (#126)
Add logging for invalid model errors

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/126
2020-01-26 19:40:23 +00:00
konradandkolaente fc65052ba0 Add config options for task attachments (#125)
Add config options for task attachments

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/125
2020-01-26 19:10:31 +00:00
konradandkolaente b2b1546a8f Add config options for cors handling (#124)
Add config options for cors handling

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/124
2020-01-26 19:09:54 +00:00
konradandkolaente 7e9446ea07 Refactor User and DB handling (#123)
fix copyright date

Add more user tests

More user tests

More user tests

Start refactoring user tests

Docs

Fix lint

Fix db fixtures init in tests

Fix models test

Fix loading fixtures

Fix ineffasign

Fix lint

Fix integration tests

Fix init of test engine creation

Fix user related tests

Better handling of creating test enging

Moved all fixtures to db package

Moved all fixtures to db package

Moved user related stuff to seperate package

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/123
2020-01-26 17:08:06 +00:00
konradandkolaente 8c33e24e92 Migration Improvements (#122)
Update swagger docs

Update docs

Let the wunderlist migrator use the registerRoutes function

Add migration status table

Add migration status

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/122
2020-01-20 19:48:46 +00:00
kolaente 0654ead831 Update version link in README 2020-01-19 22:27:19 +01:00
kolaente 2b80025cc0 Update changelog for v0.10 2020-01-19 22:25:38 +01:00
konradandkolaente 3081338a37 Use redis INCRBY and DECRBY when updating metrics values (#121)
Move test coverage processing to a seperate command

Use redis INCRBY and DECRBY when updating metrics values

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/121
2020-01-19 17:26:26 +00:00
konradandkolaente 9e39399689 Migration (#120)
Go mod tidy

[skip ci] Add modules/migration to docs

[skip ci] update date

fmt

Merge branch 'master' into feature/migration

# Conflicts:
#	pkg/routes/api/v1/info.go

Add docs on how to create a migrator

Add available migrators to /info endpoint

Return a message once everything was migrated successfully

Add swagger docs for wunderlist migration

Docs for migration [skip ci]

Fix due date fixture in migration test

Fix staticcheck

Fix lint

Logging and cleanup

Make the migrator work with real data

Add routes for migration

Fix misspell

Add method to store a full vikunja structure into vikunja

Add getting all data from wunderlist

Add attachment migration from wunderlist

Add done and done at to wunderlist migrator

Add todo

Add wunderlist auth url implementation

Fix lint

Finish wunderlist migration

Added all structs for the wunderlist migratior

Fix owner field being null for user shared namespaces (#119)

Update copyright year (#118)

Add option to disable registration (#117)

Added migrator interface

Co-authored-by: kolaente <k@knt.li>
Reviewed-on: https://kolaente.dev/vikunja/api/pulls/120
2020-01-19 16:52:16 +00:00
konrad 1d2cdf0fb8 Fix owner field being null for user shared namespaces (#119) 2020-01-09 19:24:08 +00:00
konrad a0c5e4e985 Update copyright year (#118) 2020-01-09 17:33:22 +00:00
konrad 402cef3c15 Add option to disable registration (#117) 2019-12-30 23:27:02 +00:00
kolaente b9f0ba84ab Add motd config option to docs 2019-12-25 17:27:10 +01:00
konrad 7cdc997191 Fix new tasks not getting a new task index (#116) 2019-12-08 15:10:34 +00:00
konrad 720df3cbed Add task identifier (#115) 2019-12-07 22:28:45 +00:00
konrad 1a47d7d80d Use utf8mb4 instead of plain utf8 (#114) 2019-12-07 20:14:13 +00:00
konrad 62e550bf35 Add user token renew (#113) 2019-12-07 19:52:04 +00:00
kolaente 10ab8ef4d9 Fix task collection tests 2019-12-07 17:21:37 +01:00
kolaente d483fe8beb Fix passing sort_by and order_by as query path arrays 2019-12-07 16:57:19 +01:00
kolaente 1555f04bd2 Fix sorting tasks by bool values
There was a bug where it would return all tasks with a true value before the ones with a false value. This is the exact opposite of what the db does, leading to wrongly sorted values
2019-12-07 16:56:18 +01:00
konrad d8399e374c Sort Order for tasks (#110) 2019-12-07 14:30:51 +00:00
shilchandkonrad e890001ee1 Consistent copyright text in file headers (#112) 2019-12-04 19:39:56 +00:00
shilchandkonrad 38653b49c7 Add tests for md5 generation (#111) 2019-12-04 19:19:38 +00:00
konrad 7e4deab8f7 Task collection improvements (#109) 2019-12-01 13:38:11 +00:00
konrad d96831fe3a Endpoint to get tasks on a list (#108) 2019-11-29 22:59:20 +00:00
kolaente 4c55b4455c update theme 2019-11-25 19:12:42 +01:00
kolaente b6308f783b Add files volume to docker compose docs 2019-11-25 19:08:24 +01:00
kolaente 843c1e5193 Update docs with a traefik configuration 2019-11-25 19:07:11 +01:00
kolaente 6045f4a426 Prepare changelog & readme for 0.9 release 2019-11-24 19:38:23 +01:00
kolaente 7be14239a3 [skip ci] Add changelog in repo 2019-11-24 19:33:16 +01:00
konrad 27ba31366c Fix default logging settings (#107) 2019-11-24 18:17:59 +00:00
kolaente 9dc419e854 Add file volume to the docker image 2019-11-24 18:36:43 +01:00
kolaente 37efd5cb49 Fixed removing reminders 2019-11-24 16:13:16 +01:00
kolaente dcec9511dc Fixed a bug where deleting an attachment would cause a nil panic 2019-11-19 23:07:48 +01:00
kolaente c203d73b33 Fixed a bug where adding assignees or reminders via an update would re-create them and not respect already inserted ones, leaving a lot of garbage 2019-11-03 23:08:26 +01:00
konrad 9be5ab248c Add endpoint to get a single task (#106) 2019-11-02 20:33:18 +00:00
kolaente ed4c17892e Fixed building docs theme 2019-10-30 21:53:57 +01:00
kolaente 886110a20a update docs theme 2019-10-30 21:47:16 +01:00
konrad 8948a5f219 Improve pagination (#105) 2019-10-23 21:11:40 +00:00
kolaente 89f385a53d Move from markdown lists to Vikunja for roadmap [skip ci] 2019-10-20 20:52:41 +02:00
kolaente 82f11c4ec2 Fixed not getting all labels when retrieving a list with all tasks 2019-10-20 17:56:53 +02:00
kolaente eb279fdba3 Refactored getting task IDs for labels 2019-10-20 17:55:54 +02:00
kolaente 48e422b379 [skip ci] Prepare the roadmap for migration 2019-10-20 17:54:32 +02:00
kolaente 854fde1e4c Fixed panic when using link share and metrics 2019-10-19 22:34:33 +02:00
kolaente b653278e42 Reverted telegram notification in CI "fix" 2019-10-19 18:18:39 +02:00
kolaente 35e4ab198f Fixed telegram notification in CI 2019-10-19 16:57:39 +02:00
kolaente b81cd6128a Fixed error when setting max file size on 32-Bit systems 2019-10-18 17:30:25 +02:00
konradandGitea 2169464983 Task Attachments (#104) 2019-10-16 20:52:29 +00:00
kolaente e2f481a6e5 Fixed migration for task relations 2019-10-13 11:44:56 +02:00
kolaente af1d1e1921 [skip ci] updated todo 2019-09-25 20:45:20 +02:00
konradandGitea 8fe33fd616 Task Relations (#103) 2019-09-25 18:44:41 +00:00
konradandGitea 1272255975 Added percent done to tasks (#102) 2019-09-21 10:52:10 +00:00
kolaente 1e2ec17343 [skip ci] update todo 2019-09-20 18:45:28 +02:00
konradandGitea 2f267f3f68 Moved teams_{namespace|list}_* to {namespace|list}_teams_* for better consistency (#101) 2019-09-20 16:39:02 +00:00
konradandGitea 694fc62495 Refactored getting all lists for a namespace (#100) 2019-09-20 16:16:31 +00:00
konradandGitea 8d5a2685c4 Fixed labels being displayed multiple times if they were associated with more than one task (#99) 2019-09-20 15:52:09 +00:00
konradandGitea 71ef86e0df Added more infos to a link share auth (#98) 2019-09-08 19:22:54 +00:00
konradandGitea 6140920cb8 Fixed rate limit panic when authenticatin with a link share auth token (#97) 2019-09-08 19:11:42 +00:00
konradandGitea fdd1624121 Small link share fixes (#96) 2019-09-07 13:19:23 +00:00
kolaente 158ad631e1 [skip ci] update todo 2019-09-05 22:48:51 +02:00
kolaente c126d2f55c [skip ci] update todo 2019-09-05 22:00:21 +02:00
kolaente 1d98e4cabe Fixed metrics on/off setting 2019-09-01 18:39:03 +02:00
kolaente 43676f045c Switched default logger to stdout instead of stderr 2019-09-01 18:23:35 +02:00
kolaente ba7db545fe Added extra depth to logging to correctly show the functions calling the logger in logs 2019-09-01 17:56:22 +02:00
kolaente 021ee48ec3 Made sure all tags are checked out when building in docker 2019-09-01 11:43:01 +02:00
kolaente a324921dce Updated Readme [skip ci] 2019-09-01 11:01:36 +02:00
konradandGitea 8d57923a7d Sharing of lists via public links (#94) 2019-08-31 20:56:41 +00:00
kolaente 88ea66798b [skip ci] updated todo 2019-08-27 22:51:27 +02:00
konradandGitea 66cdd79666 Refactor ListTask to Task (#92) 2019-08-14 20:19:04 +00:00
konradandGitea be14634e1e GetUser now returns a pointer (#93) 2019-08-14 19:59:31 +00:00
kolaente 8fbe721453 [skip ci] updated todo 2019-08-13 22:31:05 +02:00
kolaente 5d3e169883 [skip ci] update todo 2019-08-11 14:56:50 +02:00
kolaente 208eb4e68c Fixed swaggerdocs of description fields 2019-07-21 23:57:19 +02:00
kolaente 8d76280811 [skip ci] updated todo 2019-07-21 23:53:04 +02:00
kolaente 10fbbe1db6 Moved metrics init to seperate methods 2019-07-21 23:44:12 +02:00
konradandGitea 4327a559e5 feature/rate-limit (#91) 2019-07-21 21:27:30 +00:00
kolaente 2e599e792e [skip ci] update todo 2019-07-20 20:46:06 +02:00
konradandGitea 48826a6ed7 Logger refactoring (#90) 2019-07-20 18:12:10 +00:00
kolaente 15a0963bd1 [skip ci] update todo 2019-07-18 22:54:55 +02:00
konradandGitea 9a7d470ce2 Limit the test pipeline to run only on pull requests (#89) 2019-07-18 20:28:56 +00:00
konradandGitea ef0e7c9769 Use longtext instead of varchar(1000) on description fields (#88) 2019-07-18 19:56:34 +00:00
konradandGitea 12eaddc8ee Added http endpoint to list all users on a list (#87) 2019-07-18 16:38:21 +00:00
konradandGitea b63928850a Simplify structure by having less files (#86) 2019-07-16 14:15:40 +00:00
kolaente 4005cd2f32 [skip ci] Updated todo 2019-07-16 01:04:19 +02:00
kolaente 5cc89fd474 [skip ci] Updated todo 2019-07-16 00:56:25 +02:00
konradandGitea e2d9de191d /info endpoint (#85) 2019-07-15 22:54:38 +00:00
kolaente c3ea45d900 Removed rancher from drone config 2019-07-13 19:23:09 +02:00
konradandGitea 50ca8bd28e Statically compile templates in the final binary (#84) 2019-07-11 19:10:42 +00:00
konradandGitea 1f1a079fd3 Better config handling with constants (#83) 2019-07-06 20:12:26 +00:00
kolaente f1d21ea52b Use the auth methods to get IDs to avoid unneeded casts 2019-06-28 10:21:48 +02:00
kolaente fc3c5f2187 Updated the web handler with updated param binder 2019-06-28 09:13:17 +02:00
kolaente 5d3b6573ca Updated echo to use the latest version 2019-06-28 09:01:50 +02:00
konradandGitea 9930f98f8e Compress binaries after building them (#81) 2019-06-22 22:07:58 +00:00
konradandGitea 16825ba7c6 Update echo (#82) 2019-06-22 21:51:58 +00:00
kolaente 4e8c2a7bf6 Fixed avatar url when logging in 2019-06-06 12:28:08 +02:00
kolaente 7f5a6e338c [skip ci] updated todo 2019-06-06 12:13:15 +02:00
konrad 2763df20c9 [skip ci] updated todo 2019-06-05 22:25:55 +02:00
kolaente 9bc09ebbe5 Fixed user sharing not working 2019-06-04 19:45:09 +02:00
konradandGitea 6746984c97 Simplified the docker image (#80) 2019-06-02 14:37:10 +00:00
konradandGitea 7acf318b28 Fixed duedate spelling issue (#79) 2019-05-31 08:10:56 +00:00
konradandGitea f638fae4fd Add the md5-hashed user email to user objects for use with gravatar (#78) 2019-05-31 07:24:59 +00:00
konrad bd930bf654 [skip ci] rearrange todo 2019-05-30 22:32:24 +02:00
kolaente 2cdb0eed3e [skip ci] updated todo 2019-05-27 18:30:08 +02:00
konradandGitea 85d08e5697 Fixed check if the user really exists before updating/deleting its rights (#77) 2019-05-25 10:16:55 +00:00
kolaente 4c4eb76fed [skip ci] updated todo 2019-05-25 11:53:16 +02:00
konradandGitea 50d1f29125 Use the username instead of a user when adding a user to a team or giving it rights (#76) 2019-05-25 09:47:16 +00:00
kolaente 3fffcbd986 [skip ci] updated todo 2019-05-25 10:09:47 +02:00
konradandGitea 24ce940885 Put reminders in an extra table (#75) 2019-05-25 07:33:57 +00:00
konradandGitea 802a13cffd Added settings for max open/idle connections and max connection lifetime (#74) 2019-05-25 05:49:52 +00:00
kolaente 6b348fad04 Used one branch for both fixes in caldav-go 2019-05-24 20:01:59 +02:00
kolaente 951d92b2f0 Fixed ical-go package include 2019-05-24 19:45:58 +02:00
kolaente 24f06b2da5 Fixed ical-go package include 2019-05-24 19:45:33 +02:00
kolaente a7bbaf7c5f Fixed replace directive 2019-05-24 11:57:18 +02:00
konrad 3356a691f7 Removed drone debug env variables 2019-05-22 22:55:32 +02:00
konrad 7d46c88285 Fixed build 2019-05-22 20:36:11 +02:00
konradandGitea 7107d030fc Better caldav support (#73) 2019-05-22 17:48:48 +00:00
konrad de24fcc2f8 Fixed metrics endpoint not working 2019-05-12 16:49:16 +02:00
konrad 3d7fd9ca20 Updated libraries 2019-05-07 21:42:24 +02:00
konradandGitea 2b160b73c3 Fix tests (#72) 2019-04-30 18:36:39 +00:00
kolaente 24704bd4ed Added color field to tasks 2019-04-30 11:26:37 +02:00
konrad 733d0be753 [skip ci] Updated todo 2019-04-28 23:50:38 +02:00
konrad e40ab8652d [skip ci] Updated todo 2019-04-28 23:49:13 +02:00
konrad b854112704 [skip ci] Updated todo 2019-04-28 23:47:25 +02:00
konrad e2820e6806 Merge remote-tracking branch 'origin/master' 2019-04-27 11:41:40 +02:00
konrad a6e70f1b29 Fixed enabling go modules for cross-platform 2019-04-27 11:41:28 +02:00
konrad 44223bde77 Fixed enabling go modules for cross-platform 2019-04-27 11:24:47 +02:00
kolaente d404716342 Fixed integration tests 2019-04-24 22:58:20 +02:00
konrad 7e38937efc Fixed lint 2019-04-23 21:58:42 +02:00
konrad ed671baf8f Fixed listID not being returned in tasks 2019-04-23 21:53:37 +02:00
kolaente d4ff1eca80 Added dependencies 2019-04-23 10:34:28 +02:00
kolaente 6bab8fb769 Updated and re-enabled statickcheck 2019-04-23 10:34:06 +02:00
kolaente 07bdb08f9c Fixed darwin build 2019-04-22 14:31:46 +02:00
kolaente 1117b6eb47 Change path in drone 2019-04-22 14:20:25 +02:00
kolaente 10f80c190b Switched to techknowlogick/xgo 2019-04-22 14:02:18 +02:00
kolaente c8858f6cfb Fixed xgo docker image 2019-04-22 13:27:26 +02:00
kolaente dd1749f11f Disabled staticcheck until their memory leak is resolved 2019-04-22 13:04:16 +02:00
kolaente 99f83542f6 Updated staticcheck 2019-04-22 12:59:42 +02:00
kolaente 5dc1fd0f86 Switched to use src.techknowlogick.com/xgo 2019-04-21 23:07:33 +02:00
kolaente b1701ca769 Removed debugging 2019-04-21 23:04:46 +02:00
kolaente 5cfaa0f322 Debugging 2019-04-21 22:43:18 +02:00
kolaente 7b332808f9 Always fetch tags in drone when building 2019-04-21 22:39:35 +02:00
kolaente 228c47d79e removed unneded drone configs 2019-04-21 22:36:01 +02:00
kolaente 27339a7cf0 Debugging 2019-04-21 21:55:31 +02:00
kolaente 3adfb81d5e Debugging 2019-04-21 21:54:47 +02:00
konradandGitea 3872d1d8a7 Integration tests (#71) 2019-04-21 18:18:17 +00:00
kolaente 46efcb1005 updated version in readme 2019-04-05 17:00:02 +02:00
kolaente 0ed6c6cc0d updated version in readme 2019-04-05 16:54:41 +02:00
kolaente 93dbaea303 Fixed priority not updating when set to 0 2019-04-05 12:40:40 +02:00
kolaente 55e33c1694 [skip ci] updated todo 2019-04-05 12:16:57 +02:00
kolaente 2d9d27f63c Fixed getting lists by namespace 2019-04-02 10:53:16 +02:00
konradandGitea 87873e53c5 Fix rights checks (#70) 2019-04-01 19:48:48 +00:00
konradandGitea 19faee0102 Hide a users email everywhere (#69) 2019-04-01 18:19:55 +00:00
kolaente ac5446e4f5 [skip ci] update todo 2019-03-31 22:33:28 +02:00
kolaente a799527a3c [skip ci] update todo 2019-03-31 22:31:03 +02:00
konradandGitea 2b28ab12f1 Added docs for cli usage and adding new commands (#68) 2019-03-31 19:54:17 +00:00
konradandGitea be5a17e993 DB Migrations (#67) 2019-03-29 17:54:35 +00:00
kolaente e21471a193 Update web handler (fixed) 2019-03-29 18:29:44 +01:00
konrad 81f76f09ce Added docs redirect
Updated docs theme
2019-03-24 19:38:12 +01:00
konrad c27e8fe2f1 updated docs theme 2019-03-24 18:33:42 +01:00
konradandGitea 8d78e473f5 Added cli for general usage of Vikunja (#66) 2019-03-24 17:15:44 +00:00
konradandGitea 5525ee0328 Refactored canRead method to get the list before checking the right (#65) 2019-03-24 13:17:36 +00:00
konradandGitea 47352d3ed4 Let rights methods return errors (#64) 2019-03-24 12:35:50 +00:00
konradandGitea 11e7c071ce Updated handler config (#63) 2019-03-24 09:13:40 +00:00
konrad 1dc14d5ddf Fixed labels not being queried correctly on tasks 2019-03-22 22:03:41 +01:00
kolaente c42e22f352 Fixed bulk update label tasks 2019-03-21 19:26:04 +01:00
kolaente 72e64f7203 Fixed swagger docs for bulk label tasks 2019-03-21 18:42:21 +01:00
kolaente 25999d9b69 Fixed swagger docs for task labels 2019-03-21 07:40:56 +01:00
konradandGitea eb4d38b5b8 Fixed rights check on lists and namespaces (#62) 2019-03-08 21:31:37 +00:00
kolaente 65f428fe78 Updated swagger docs 2019-03-08 15:41:46 +01:00
konrad 2cc968ec61 [skip ci] updated todo 2019-03-07 21:25:54 +01:00
kolaente 073aa9940f [skip ci] update todo 2019-03-03 18:18:47 +01:00
kolaente 5506dd1ceb [skip ci] update todo 2019-03-03 17:43:25 +01:00
kolaente e47313b17e [skip ci] update todo 2019-03-03 15:33:14 +01:00
konrad 7cc172cc0c [skip ci] updated todo 2019-02-24 22:18:20 +01:00
konrad 2bcd6e9cb6 [skip ci] updated todo 2019-02-24 18:35:25 +01:00
konrad afd55d8cf8 [skip ci] updated todo 2019-02-24 12:06:20 +01:00
konrad caed219d39 [skip ci] Update todo 2019-02-23 21:05:10 +01:00
konradandGitea 1b84292332 Fix lint errs (#59) 2019-02-18 19:32:41 +00:00
konradandGitea 15ef6deabc Use query params to sort tasks instead of url params (#61) 2019-02-18 18:06:15 +00:00
konrad a06a5fc4f4 Updated readme and todo 2019-02-17 20:57:28 +01:00
konradandGitea 2d88fad5b1 Huge improvements for docs (#58) 2019-02-17 19:53:04 +00:00
konrad 5e7c9b9eb9 Added possible fix for logging when nothing is set 2019-01-25 21:09:24 +01:00
konradandGitea 9e635ea54e Improve logging handling (#57) 2019-01-25 11:40:54 +00:00
kolaente d0fa9ddaec Remove debugging 2019-01-23 14:33:44 +01:00
konrad add491d1e0 moar debugging 2019-01-22 22:35:00 +01:00
konrad e735378caf added debug + possible fix 2019-01-22 22:15:56 +01:00
konrad f95aa431b8 added debug + possible fix 2019-01-22 21:50:15 +01:00
kolaente 01e7540530 Fix makefile 2019-01-22 13:13:11 +01:00
konradandGitea 75431e1ca5 Rights performance improvements for lists and namespaces (#54) 2019-01-21 22:08:04 +00:00
konrad f6c7c764d1 Fix drone move step 2019-01-21 23:03:11 +01:00
konradandGitea eedc19a49e Build debian packages (#56) 2019-01-21 21:52:26 +00:00
konrad c07e2b6cd4 remove unused makefile variable 2019-01-20 18:43:38 +01:00
konradandGitea 08cbd18bc5 Added more config paths (#55) 2019-01-20 17:13:21 +00:00
konrad 8362799a93 Merge remote-tracking branch 'origin/master' 2019-01-20 00:56:42 +01:00
konrad 3edc728094 [skip ci] updated todo 2019-01-20 00:56:36 +01:00
konradandGitea d3975193fe Fix build building infinitly (#53) 2019-01-18 09:24:07 +00:00
konrad 6b00ccc942 updated todo with a shit ton of new features 2019-01-17 00:57:13 +01:00
konrad 7e8c2bb53b Fixed depend_on 2019-01-16 23:09:18 +01:00
konrad 20c4b249a4 Pipeline now uses two seperate configs to handle tags and pushes to master 2019-01-16 23:07:43 +01:00
konrad 0db5292f9f clone depth now uses the "good" format for drone 1 2019-01-15 23:07:39 +01:00
konrad 08e84f4e8d re-add automatic deploy 2019-01-14 23:53:53 +01:00
konrad a791fe0fa7 updated todo 2019-01-14 23:35:54 +01:00
konradandGitea 19218b28a2 Refactor {List|Namespace}{User|Team} to not expose unneded values via json (#52) 2019-01-14 22:32:56 +00:00
konrad cf0b0a2853 updated todo 2019-01-14 22:51:25 +01:00
konradandGitea 17fefae8bb Simplify list rights check (#50) 2019-01-14 21:49:50 +00:00
konrad 3d05d0aa45 fix dronefile lint 2019-01-14 20:51:30 +01:00
konrad cbcd12b5e5 remove debbugging 2019-01-14 20:48:02 +01:00
konrad 8fdb8b7840 fix debugging 2019-01-14 20:36:40 +01:00
konrad ed44478b20 remove debug step 2019-01-14 20:35:54 +01:00
konrad 0a092214c8 fix section 2019-01-14 18:47:00 +01:00
konrad 3ebf0da1b9 Added debugging for ci 2019-01-14 18:05:09 +01:00
konrad 07bc4f3f01 Added debugging for ci 2019-01-14 17:40:42 +01:00
kolaente cb58f55923 modify signing to sign zip and detach the signature 2019-01-13 01:07:10 +01:00
kolaente 7cc078aaec Fix sequence of drone builds 2019-01-13 00:25:02 +01:00
kolaente d20a899f92 fix sign step 2019-01-13 00:17:45 +01:00
kolaente 3cfe8c238a Add gpg sign step 2019-01-12 23:58:17 +01:00
kolaente 22495a66e0 Fixed minio folder definition 2019-01-12 00:03:41 +01:00
konradandGitea d5e68ee037 Update drone to version 1 (#49) 2019-01-11 22:46:51 +00:00
konradandGitea 318920fe29 Improve label handling (#48) 2019-01-09 23:08:12 +00:00
konradandGitea 364a172876 Assignees optimizations (#47) 2019-01-08 19:13:07 +00:00
kolaente 31c39388f1 Fixed the generated version by the makefile to be more verbose 2019-01-03 23:51:16 +01:00
kolaente 056e37331e [skip ci] Update todo 2019-01-03 23:35:53 +01:00
kolaente 09787fb29b [skip ci] Update todo 2019-01-03 23:31:29 +01:00
konradandGitea 607dbd6ae8 API Docs improvements (#46) 2019-01-03 22:22:06 +00:00
kolaente 3183d10dbe [skip ci] update readme and todo 2018-12-31 02:21:44 +01:00
konradandGitea 6b40df50d3 Add labels to tasks (#45) 2018-12-31 01:18:41 +00:00
konradandGitea d39007baa0 Task assignees (#44) 2018-12-29 14:29:50 +00:00
kolaente 37345e6bd3 update todo
update gitignore
2018-12-28 23:38:43 +01:00
konradandGitea 018dd8164c [CI] Add more checks (#43) 2018-12-28 22:15:05 +00:00
konradandGitea 3814b8a504 Add bulk edit for tasks (#42) 2018-12-28 21:49:46 +00:00
kolaente b050132f4f Update todo 2018-12-27 23:37:25 +01:00
kolaente 36eb580c8a Updated swagger docs 2018-12-25 21:45:26 +01:00
kolaente 067bb695b1 Updated todo 2018-12-25 21:29:55 +01:00
kolaente fd80094eca Updated todo 2018-12-25 21:29:16 +01:00
kolaente ce0bff8d9c Fixed a bug where updating a list would update it with the same values it had before 2018-12-25 15:30:11 +01:00
konradandGitea 5a93475be9 Get tasks between a date range (#41) 2018-12-22 18:06:14 +00:00
konradandGitea 784b890f70 Start end end dates for tasks (#40) 2018-12-22 15:45:16 +00:00
konradandGitea 7322bfafb3 Fix swaggerdocs generation to produce actually valid output (#39) 2018-12-21 21:30:43 +00:00
konrad 0edc5fd315 go mod tidy 2018-12-19 22:07:23 +01:00
konradandGitea cbc5995ad3 Various user fixes (#38) 2018-12-19 21:05:25 +00:00
konradandGitea 3e4f7fb2f4 Fix sorting of tasks in lists (#37) 2018-12-19 19:14:48 +00:00
kolaente 79b463d0af updated todo 2018-12-19 16:50:22 +01:00
konradandGitea 97febdb397 Tests can now use config files (#36) 2018-12-18 16:01:46 +00:00
kolaente 67e94f95b0 update todo 2018-12-18 15:35:20 +01:00
kolaente 34af627b66 updated todo 2018-12-18 10:38:00 +01:00
konradandGitea ec347a71bc Fix "unexpected EOF" error when using metrics (#35) 2018-12-17 12:22:06 +00:00
konradandGitea 777d63dff1 More unit tests (#34) 2018-12-16 13:21:32 +00:00
konrad 424dfe19af Only make all platform builds when pushing to master 2018-12-16 11:53:26 +01:00
kolaente 7b439cc568 Properly init tables for redis 2018-12-14 17:45:31 +01:00
konrad 553055f073 Fixed build 2018-12-13 16:09:00 +01:00
konrad 70f7f630a3 Update todo 2018-12-12 23:56:00 +01:00
konrad 82340cb70b cleanup 2018-12-12 23:53:20 +01:00
konrad 94fd2d758a cleanup 2018-12-12 23:51:40 +01:00
konradandGitea e047673c6b Add prometheus endpoint for getting metrics (#33) 2018-12-12 22:50:35 +00:00
konrad ee398b5272 Updated todo 2018-12-12 16:25:39 +01:00
konrad 3e8fd1e619 updated todo 2018-12-04 23:32:35 +01:00
konradandGitea 0c1d786ade Exlicitly get the pseudonamespace with all shared lists (#32) 2018-12-04 10:16:42 +00:00
kolaente f1fca3346b Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/api 2018-12-03 15:13:26 +01:00
kolaente 07d6e1219b updated todo 2018-12-03 15:13:21 +01:00
konrad 8e5ff72c4a fixed path to get all tasks (echo bug) 2018-12-02 19:31:03 +01:00
konrad fc17232819 Updated vendor 2018-12-02 19:30:42 +01:00
konrad 8aed78b296 update version in readme 2018-12-02 02:18:31 +01:00
konradandGitea cc6b35e314 Priorites for tasks (#31) 2018-12-02 00:49:30 +00:00
konradandGitea f2f881f505 Fixed generation of swagger docs (#30) 2018-12-01 02:04:10 +00:00
konradandGitea 6c5885747b Subtasks (#28) 2018-12-01 02:00:57 +00:00
konradandGitea 007d8ec375 Fixed generation of swagger docs (#29) 2018-12-01 01:59:17 +00:00
konrad 1b24cdf164 updated todo 2018-12-01 00:28:01 +01:00
konradandGitea ce2cae9430 Move the crudhandler to own repo (#27) 2018-11-30 23:26:56 +00:00
konrad d9304f6996 remove drone github update step 2018-11-28 22:53:55 +01:00
konrad d5e4195ee7 added drone config to update github mirror 2018-11-28 21:04:17 +01:00
konrad 136adb69c8 tidied mod 2018-11-28 20:50:06 +01:00
konradandGitea 06fc9f7886 Repeating tasks (#25) 2018-11-26 20:24:00 +00:00
konradandGitea 3f44e3b83e Change License to GPLv3 (#26) 2018-11-26 20:17:33 +00:00
konradandGitea b73786f7fe Make validation less verbose (#24) 2018-11-25 21:38:50 +00:00
kolaente e5c1588576 Fix docker build 2018-11-25 22:00:43 +01:00
konradandGitea d51ed8defd make validation less verbose (#23) 2018-11-24 12:44:40 +00:00
konradandGitea fded3c23d0 Multiple Reminders (#22) 2018-11-21 15:03:47 +00:00
konradandGitea af0ce5bb96 Added Shared lists overview in namespaces (#21) 2018-11-19 11:37:59 +00:00
konradandGitea 0c112a0ca3 Fixed Validation being to verbose (#20) 2018-11-17 00:12:26 +00:00
konrad 196b6728b8 updated readme 2018-11-17 00:29:10 +01:00
konrad 5bc23458de updated todo 2018-11-17 00:20:48 +01:00
konradandGitea 0c544fe355 Added validation for structs (#19) 2018-11-16 23:17:37 +00:00
konradandGitea 373bbd2202 Migrate to new swagger docs generation (#18) 2018-11-12 15:46:35 +00:00
konradandGitea d3de658882 Implemented search for everything (#17) 2018-11-09 17:33:06 +00:00
konrad ad74d24ee2 updated docs for pagination 2018-11-09 17:28:59 +01:00
konradandGitea d232836423 Added pagination (#16) 2018-11-09 10:30:17 +00:00
konrad 0e7e1b7e38 updated todo 2018-11-06 22:28:56 +00:00
konrad f976fd9f54 updated todo 2018-11-06 22:09:54 +00:00
konradandGitea d03fca801b CalDAV support (#15) 2018-11-03 15:05:45 +00:00
konradandGitea 31a4a1dd00 Added a route to get all tasks sorted desc by their due dates (#14) 2018-11-02 16:59:49 +00:00
konradandGitea 14207a0fa8 Fix tests in drone (#13) 2018-11-02 14:37:11 +00:00
konrad e906184bf7 updated version in readme 2018-11-02 15:29:01 +01:00
kolaente 1f41db9239 Hotfix: fix duplicate header in html mails with templates 2018-11-02 11:23:41 +01:00
konradandGitea 4f8a0f8739 Fixed no root path for templates and static assets (#12) 2018-11-02 10:01:28 +00:00
konradandGitea c51ca4dd26 Fixed dockerfile (#11) 2018-11-02 09:18:38 +00:00
konradandGitea 9e539b8c40 Fix checking for an email verification token (#10) 2018-11-01 22:59:20 +00:00
konradandGitea 9a5eb577b8 Fix not checking for user credentials upon login (#9) 2018-11-01 22:51:05 +00:00
konradandGitea 4713023a97 Prevent login from inactive (aka non-verified) users (#8) 2018-11-01 22:47:41 +00:00
konradandGitea 301a4eedda New structure (#7) 2018-10-31 12:42:38 +00:00
kolaente 3f9fad0e2a use go modules from vendor when building the docker image 2018-10-28 18:38:40 +01:00
kolaente 990740fc19 fixed fmt 2018-10-28 17:35:48 +01:00
kolaente 960d72aa1b Fixed tests 2018-10-28 17:30:10 +01:00
kolaente f94bbf023c Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/api 2018-10-28 17:24:13 +01:00
kolaente 2556ef7624 added vendor 2018-10-28 17:24:10 +01:00
konradandGitea 321c0f2404 Fix build when using go modules (#6) 2018-10-28 16:11:13 +00:00
konradandGitea 738c22b5f9 Add user email verification when registering (#5) 2018-10-27 13:14:55 +00:00
konradandGitea d0c30cb089 Password reset with token only (#4) 2018-10-27 13:12:15 +00:00
konradandGitea 0cfea682ea Add password reset (#3) 2018-10-27 09:33:28 +00:00
konrad 95197ec6ed moar featurecreep 2018-10-22 22:20:45 +02:00
konrad eecace511d updated todo 2018-10-21 22:22:56 +02:00
konrad 6793e13e6d updated todo 2018-10-21 22:21:37 +02:00
konrad 85da2d72aa updated todo 2018-10-21 22:19:51 +02:00
kolaente 206705d2e9 updated makefile to use new golint url 2018-10-15 12:54:39 +02:00
kolaente 522e647db0 Added config for database max connections 2018-10-11 18:39:53 +02:00
kolaente bbd90eb976 Fixed not setting http code on error 2018-10-11 18:18:44 +02:00
kolaente d8f6a628db Replaced CObject with a function returning an object 2018-10-11 17:53:59 +02:00
kolaente a612037ee1 added go mod 2018-10-11 13:28:41 +02:00
kolaente 224cebfd10 Fixed tests failing 2018-10-06 22:26:17 +02:00
kolaente f4ac036f27 removed unused errors 2018-10-06 18:55:14 +02:00
kolaente c626b05af6 Improved log error messages 2018-10-06 18:44:04 +02:00
kolaente 56dc781594 added docs for error codes 2018-10-06 18:32:33 +02:00
kolaente 1ddb819c31 updated docs 2018-10-06 15:47:26 +02:00
kolaente 75b611de48 updated docs 2018-10-06 15:41:57 +02:00
konrad c5100aad42 updated todo 2018-10-06 15:08:38 +02:00
konrad f969593c0a Improved error handling 2018-10-06 15:04:14 +02:00
konrad a4137b3d6f Added more checks to not leave an error unpassed when checking for rights 2018-10-06 13:25:37 +02:00
konrad 06638fccc8 Fixed lint & misspell 2018-10-06 13:07:42 +02:00
konrad a108ed689d Added extra function to get a list without tasks or user objects 2018-10-06 13:05:29 +02:00
kolaente 53a7f2e6a7 cleanup 2018-10-05 19:17:39 +02:00
kolaente 3819927dd2 updated todo 2018-10-05 19:16:31 +02:00
kolaente cca677878d Optimized used sql queries when getting lists or namespaces with lists 2018-10-05 19:16:14 +02:00
kolaente a1a77a9b75 improved logging format 2018-10-05 18:49:56 +02:00
kolaente 6ea4f0598c fmt 2018-10-05 18:46:05 +02:00
kolaente 358b569bf1 Addded indecies everywhere 2018-10-05 18:46:01 +02:00
kolaente 1139eee2ad Improved update password method to ask the current password 2018-10-04 07:53:45 +02:00
konrad a6d49a5e70 Fixed lint 2018-10-03 19:32:05 +02:00
kolaente cd4fca19fd updated swagger spec 2018-10-03 19:30:43 +02:00
konrad 85c9fba808 Added the ability to update a users password 2018-10-03 19:28:17 +02:00
konrad 17368dea9a Cleanup 2018-10-03 19:00:09 +02:00
konrad 43c67d8c29 added go report badge 2018-09-23 21:16:56 +02:00
konradandGitea e724aeb206 Added new checks (#2)
* added gocyclo-check
* Added new tests to drone
* Added new checks to makefile
2018-09-23 19:15:14 +00:00
konrad b912ff4176 updated drone config 2018-09-22 23:52:19 +02:00
konrad 849b64fc0c updated drone 2018-09-22 22:55:06 +02:00
konrad ce661f1c6e updated drone 2018-09-22 22:38:25 +02:00
konrad 06a4ede4a8 fmt 2018-09-22 11:06:39 +02:00
kolaente 6519c62ade fixed a bug where xorm treid to insert something with an id wich already exist 2018-09-21 08:41:28 +02:00
kolaente bfc783d1d0 updated swagger docs 2018-09-20 22:06:19 +02:00
kolaente e7d43567aa updated readme 2018-09-20 21:59:43 +02:00
kolaente 6c35db57c7 updated todo 2018-09-20 19:44:43 +02:00
kolaente 64d290bcae Added endpoint to search for users 2018-09-20 19:42:01 +02:00
kolaente 3401d7ab2c Fixed makefile 2018-09-20 07:36:58 +02:00
kolaente 8d27daccc6 Fixed lint & fmt 2018-09-20 07:31:36 +02:00
kolaente 0f60c607ee updated todo 2018-09-19 20:52:22 +02:00
kolaente 036a5fcefd updated todo 2018-09-19 08:45:45 +02:00
kolaente 5bb78a749e Fixed list update not working 2018-09-19 08:45:23 +02:00
kolaente aeff343a31 Fixed namespace update not working 2018-09-19 08:44:00 +02:00
kolaente e93cba7108 Added logging 2018-09-19 08:35:53 +02:00
kolaente 091711f4c5 Updated todo 2018-09-19 08:25:24 +02:00
kolaente 477db9ea1c Added swaggercheck to drone build 2018-09-19 08:24:50 +02:00
kolaente cbfb7eafa8 Updated swaggerdocs 2018-09-19 08:23:54 +02:00
kolaente 067672dcb4 Added an endpoint to update a team <-> namespace relation 2018-09-19 08:16:04 +02:00
kolaente aa40ab8eed Added an endpoint to update a team <-> list relation 2018-09-19 08:08:41 +02:00
kolaente 5e8597699d Added endpoint to update a user <-> namespace relation 2018-09-19 08:03:39 +02:00
kolaente 1e993f1e5c Fixed a bug where it was not possible to give a user access to a namespace 2018-09-19 08:03:05 +02:00
kolaente 4f538abc83 Added endpoint to update a users right for a list 2018-09-19 07:54:47 +02:00
kolaente 3a338f54f9 added try link to readme 2018-09-18 18:20:39 +02:00
kolaente 5fbf63bddc /namespaces/{namespaceID}/teams now also returns the team right 2018-09-18 08:17:18 +02:00
kolaente db54309df4 updated todo 2018-09-17 19:51:01 +02:00
kolaente f93a27d67d fmt 2018-09-17 19:46:31 +02:00
kolaente 30ce67c38f updated todo 2018-09-17 19:45:52 +02:00
kolaente 0a06e5a246 /lists/{listID}/teams now also returns the user right 2018-09-17 19:45:18 +02:00
kolaente cf6577445d /namepspaces/{namespacesID}/users now also returns the user right 2018-09-17 19:39:14 +02:00
kolaente b1564659c4 /lists/{listID}/users now also returns the user right 2018-09-17 19:36:44 +02:00
kolaente 59361df9b2 updated todo 2018-09-17 19:32:34 +02:00
kolaente dffb6dab7f updated todo 2018-09-17 19:26:34 +02:00
kolaente 1ea2f0a8c1 updated todo 2018-09-17 19:19:56 +02:00
kolaente 45c5d4fb82 updated todo 2018-09-17 18:45:54 +02:00
kolaente 96cafe0ad9 Moved swaggerdocs to /api/v1/swagger 2018-09-17 18:38:15 +02:00
kolaente 1d62b09792 Moved swaggerdocs to /api/v1/swagger 2018-09-17 18:34:46 +02:00
kolaente 24382f2dc0 Merge remote-tracking branch 'origin/master' 2018-09-17 18:25:17 +02:00
JonasFranzandGitea 26d37bbedf Add /user endpoint (#1) 2018-09-17 16:25:05 +00:00
kolaente 8ca8803404 Updated swaggerdocs 2018-09-17 08:22:31 +02:00
kolaente 42bd69321a Merge remote-tracking branch 'origin/master' 2018-09-17 07:48:03 +02:00
kolaente 382407e07f updated todo 2018-09-17 07:30:23 +02:00
kolaente 5a83ce1216 /namespaces now also gets lists 2018-09-17 07:27:49 +02:00
konrad 4c96ee4263 updated makefile 2018-09-15 16:11:28 +02:00
kolaente 3707f4d3c5 fmt 2018-09-13 22:14:53 +02:00
kolaente 382daac0dd when ID = 0 is passed to a 'GetSthByID'-function, it now returns a 'not exist' error 2018-09-13 20:07:11 +02:00
kolaente 716b06feff added new cache libraries 2018-09-13 19:53:39 +02:00
kolaente 416745ddab added options to configure cache 2018-09-13 19:53:03 +02:00
kolaente 23dc9f777e updated gitignore 2018-09-13 19:30:22 +02:00
kolaente 8cb85dc151 updated gitignore 2018-09-13 19:28:46 +02:00
kolaente fc136948d6 updated gitignore 2018-09-13 19:28:38 +02:00
kolaente 836b5812c0 Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/api 2018-09-13 19:27:29 +02:00
kolaente 7d8e3f1bae Updated tests 2018-09-13 19:24:40 +02:00
konrad 13145962a4 updated todo 2018-09-12 23:05:13 +02:00
konrad b47c19d46c Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/api 2018-09-12 22:59:53 +02:00
konrad 7c9818440a updated todo 2018-09-12 22:59:45 +02:00
kolaente c018589749 fixed lint + fmt 2018-09-12 21:45:30 +02:00
kolaente 1f3f8afa85 Fixed a bug where it was not possible for a user to see a namespace which could be access by a team the user was in 2018-09-12 20:13:00 +02:00
kolaente e85d3c4f36 Fixed a bug where a user didn't had access to lists which are not his own, but part of a namespace he owns 2018-09-12 19:56:07 +02:00
kolaente 65818d6f9e Added libs 2018-09-10 22:25:37 +02:00
kolaente 31a850c28e Fixed un-setting a task as done not working 2018-09-10 19:38:35 +02:00
kolaente 431564d63c When updating a list task, all relevant values are now updated. 2018-09-10 19:34:34 +02:00
kolaente 5b8cd30736 Added rancher deploy to drone 2018-09-10 19:24:17 +02:00
kolaente 0da1bb74e0 Fixed lint 2018-09-10 19:22:00 +02:00
kolaente 8ed1fb304e Fixed task update function not updating when marking a task as done 2018-09-10 07:59:45 +02:00
kolaente b91d9eb712 Fixed task update function to be able to update a task with minimal informaton 2018-09-10 07:41:39 +02:00
konrad b16c88a6f3 Added swaggerfiles do dockerfile 2018-09-08 16:54:21 +02:00
kolaente d48f3f9737 fixed crashing when no config was found 2018-09-08 16:43:37 +02:00
konrad 82c098aa0d Updated config to not hard fail when no config file is found. 2018-09-08 16:10:46 +02:00
kolaente 371dd52fa9 updated dockerimage 2018-09-08 16:10:06 +02:00
konrad f0b0319f54 [skip-ci] added s6config 2018-09-08 15:51:49 +02:00
konrad f920e336f0 [skip-ci] added s6config 2018-09-08 15:44:04 +02:00
konrad c834bc14d5 Moved dockerfile 2018-09-08 15:23:53 +02:00
konrad 8245c90bc1 Fixed dockerfile 2018-09-08 15:18:57 +02:00
konrad 9d83293590 Updated makefile 2018-09-08 15:18:15 +02:00
konrad e882fbe6ad Added dockerfile 2018-09-08 15:08:33 +02:00
konrad 6c7f8fd89a updated deps 2018-09-08 13:50:18 +02:00
konrad f47d4586c4 [skip-ci] updated docs 2018-09-08 13:50:05 +02:00
konrad 4d81a13ba5 Updated deps 2018-09-08 13:36:22 +02:00
konrad de10754cb8 Added missing viper dependencies 2018-09-08 13:33:04 +02:00
konrad f45c8aa0ce Fixed lint 2018-09-08 13:31:13 +02:00
konrad 427f752990 Vikunja now uses viper to handle config 2018-09-08 13:29:35 +02:00
kolaente 4f3e016751 Fixed CORS once and for all 2018-09-07 22:49:16 +02:00
kolaente 4749352bbd Fixed cors (Again...) 2018-09-07 08:43:23 +02:00
kolaente 21774fd447 updated todo 2018-09-07 08:24:15 +02:00
konrad 64639ab832 Added cors headers for /namespaces 2018-09-07 08:20:19 +02:00
konrad fc8c6c97fd Updated todo 2018-09-06 19:01:13 +02:00
konrad fb746714d0 Updated return status when creating 2018-09-06 18:57:28 +02:00
konrad c1767d219a Fixed getting all lists of a namespace not working 2018-09-06 18:55:58 +02:00
kolaente 37de3ef232 Fixed user_namespace relation not working 2018-09-06 18:52:10 +02:00
kolaente 6d971c5fe1 fmt 2018-09-06 08:46:47 +02:00
kolaente c43db9929b Namespaces now respect user rights 2018-09-06 08:46:34 +02:00
konrad 521e7c3bef List rights are now respected 2018-09-06 08:42:18 +02:00
konrad 92174aac08 Fixed a bug where a user could see every namespace 2018-09-06 08:39:05 +02:00
konrad f2758e239c Added namespace user rights 2018-09-04 20:15:24 +02:00
konrad 422662e3e1 updated featurecreep 2018-09-04 19:54:15 +02:00
konrad 245259216f Fixed creating of new users 2018-09-04 19:39:31 +02:00
konrad 906aee8b7d Updated featurecreep 2018-08-30 19:18:36 +02:00
konrad 76f3357a0c fmt 2018-08-30 19:14:16 +02:00
konrad 478c98fb8d Refactor GetUser & GetUserByID 2018-08-30 19:14:02 +02:00
konrad aeb1521cc4 Cleanup/fixing methods 2018-08-30 19:00:27 +02:00
konrad efaa277751 Added methods to revoke a users access to a list 2018-08-30 18:52:12 +02:00
konrad b1c3e92f66 Added methods to give users access to a list 2018-08-30 08:58:09 +02:00
konrad d31f16aff1 Renamed list items to tasks 2018-08-30 08:09:17 +02:00
konrad d5758e0444 fmt 2018-08-29 15:22:17 +02:00
konrad c17dec7954 Updated swagger docs 2018-08-29 15:13:54 +02:00
konrad 4e70486a9b Cleanup 2018-08-29 14:40:03 +02:00
konrad bdff353e78 Added tests for team <-> list relations 2018-08-29 14:33:04 +02:00
konrad 98e3d3e884 Added tests for team <-> list relations 2018-08-29 08:50:52 +02:00
konrad 950533df21 Added tests for team namespace relationsk 2018-08-29 08:26:59 +02:00
kolaente f71f98b8f4 updated featurecreep 2018-08-29 08:02:12 +02:00
kolaente 5db306bacc fmt 2018-07-27 19:28:12 +02:00
kolaente 261136c2bc Added tests for team members 2018-07-27 19:20:49 +02:00
kolaente d556162591 fmt 2018-07-27 16:28:28 +02:00
kolaente 51064f3d8f Added tests for teams 2018-07-27 16:28:09 +02:00
kolaente a55e28df76 updated todo 2018-07-27 15:57:47 +02:00
kolaente 62ac4c2a74 fmt 2018-07-27 15:53:01 +02:00
kolaente 628f3eee64 Added tests for namespaces 2018-07-27 15:52:50 +02:00
kolaente ba606515d1 Improved tests for lists 2018-07-27 15:11:47 +02:00
kolaente f7bc88c825 Added tests for listitems 2018-07-27 14:47:52 +02:00
kolaente 2c12797111 fmt 2018-07-26 10:50:03 +02:00
kolaente c97a4d74cb Added check if the namespace exists when creating a list 2018-07-26 10:49:33 +02:00
kolaente 6eeab7fe10 improved tests 2018-07-26 10:49:17 +02:00
kolaente a78b333e3f Added tests for list creation 2018-07-26 10:29:19 +02:00
kolaente 935aef8a38 Added check for list title when creating a new list 2018-07-26 10:29:09 +02:00
kolaente a9094506fa cleanup 2018-07-26 10:10:39 +02:00
kolaente 7b07137b67 fmt 2018-07-26 10:08:01 +02:00
kolaente fba505130d updated gitignore 2018-07-26 10:07:18 +02:00
kolaente 80e9021ba6 Fixed a bug where it was possible to add the same user multiple times to a team 2018-07-26 10:06:41 +02:00
konrad 9c451daf30 Added method to delete a user from a team 2018-07-26 09:58:48 +02:00
konrad bc580e0115 Added method to add a user to a team 2018-07-26 09:53:32 +02:00
kolaente 0b2f66965a [skip-ci] updated todo 2018-07-25 23:03:53 +02:00
kolaente 4baf74a999 Added http test files 2018-07-25 22:26:53 +02:00
kolaente 29e3afdd08 Added roadmap 2018-07-25 21:47:26 +02:00
kolaente 5b0788ed1e renamed build steps 2018-07-25 17:43:38 +02:00
kolaente 8f2a24298d fixed makefile
+ lint & fmt
2018-07-25 17:30:29 +02:00
kolaente 32b369e2e4 Added drone 2018-07-25 17:28:54 +02:00
kolaente 01aa1910ef Renamed all packages 2018-07-25 16:26:32 +02:00
kolaente 0df8881028 Renamed all packages 2018-07-25 16:24:46 +02:00
kolaente d18570574a updated todo 2018-07-25 00:51:23 +02:00
kolaente e602914659 Implemented proper check for team rights on namespaces 2018-07-25 00:49:44 +02:00
kolaente f36eeb662a Implemented proper check for team rights on lists 2018-07-25 00:40:24 +02:00
konrad 7dc8699cbd updated todo
+ fmt
2018-07-24 17:47:08 +02:00
kolaente 26c2ad078f Fixed a bug where it was possible to add a team multiple times to a list/namespace 2018-07-24 17:46:32 +02:00
kolaente 9638f36788 implemented deletomg a team from a list 2018-07-24 17:32:08 +02:00
kolaente 227a2afd37 implemented viewing all teams of a list 2018-07-24 17:29:46 +02:00
kolaente edf9b6f2c7 Implemented creating a team <-> list relation 2018-07-24 17:29:13 +02:00
konrad 6ff10e6353 added missing libraries 2018-07-24 14:06:03 +02:00
kolaente 9de26f6547 cleanup 2018-07-24 13:56:57 +02:00
kolaente 9c0c9474e8 Migrated to dep instead of govendor 2018-07-24 13:49:45 +02:00
konrad 0a2eae120e More docs 2018-07-24 00:48:02 +02:00
konrad 7e0965ed91 docs 2018-07-21 15:45:46 +02:00
konrad 0487889963 fmt + lint + docs 2018-07-21 15:28:09 +02:00
konrad 9979b7e321 implemented update method via param binder 2018-07-21 15:17:02 +02:00
konrad 9e75e9b73b implemented readone with parambinder 2018-07-21 15:08:46 +02:00
konrad d06ed68125 cleanup 2018-07-18 22:19:51 +02:00
konrad 935c99be45 implemented read all method for namespace teams 2018-07-18 22:06:29 +02:00
konrad 6618874441 Fixed parambinder 2018-07-18 21:54:04 +02:00
konrad de95ff40bf implemented creation of thing via parambinder 2018-07-18 08:56:19 +02:00
konrad ebb5b332b6 implemented delete team <-> namespace relation 2018-07-18 08:16:15 +02:00
konrad 249128a46e implemented binding url params directly to struct instead of passing them to the method for deleting items 2018-07-18 08:15:38 +02:00
konrad f0c003d069 implemented custom param binder
This is currently more a workaround, until the echo pr gets merged
2018-07-17 23:10:54 +02:00
kolaente 1a7779a229 Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/api 2018-07-17 09:10:45 +02:00
konrad 7feb82702d implemented create team <-> namespace relation 2018-07-17 08:44:21 +02:00
konrad 2e3c10be13 updated todo + cleanup 2018-07-17 08:16:04 +02:00
konrad 0439bade41 updated todo 2018-07-16 22:17:35 +02:00
kolaente a46901397b Merge remote-tracking branch 'real-origin/master' 2018-07-16 09:16:21 +02:00
konrad f6a816941b implemented get all teams the user is part of 2018-07-16 08:52:16 +02:00
konrad b11bd9f0b1 fixed lint 2018-07-16 08:45:38 +02:00
konrad 7dc4cd2173 Implemented Get one team method 2018-07-16 08:43:47 +02:00
konrad 8a06db5351 Implemented team delete method 2018-07-16 08:18:15 +02:00
kolaente 90da51ad7e Updated sample config 2018-07-15 18:31:43 +02:00
konrad 4cf0cd233c Implemented team update method 2018-07-14 18:29:24 +02:00
konrad bcbd415529 Fixed a bug where a struct would have old values in it 2018-07-14 17:46:01 +02:00
konrad a5552b8f9d fixed lint + fmt 2018-07-14 17:37:46 +02:00
konrad bc0e6da602 cleanup 2018-07-14 17:36:17 +02:00
konrad e1c58843e9 implemented team create method 2018-07-14 17:34:59 +02:00
konrad 376c649a12 cleanup 2018-07-12 23:47:50 +02:00
konrad bb44b2f98c fmt 2018-07-12 23:37:14 +02:00
konrad 7f7b243cbe cleanup 2018-07-12 23:36:55 +02:00
konrad c5888093fe Implemented deletion of namespaces 2018-07-12 23:33:37 +02:00
konrad 55c02bc973 Fixed CanDelete 2018-07-12 23:33:21 +02:00
konrad b24b245f4d Fixed creation of new namespaces 2018-07-12 23:22:02 +02:00
konrad e5493965ff Fixed creation of new lists 2018-07-12 23:18:50 +02:00
konrad ddcc063b0b Implemented CanCreate method 2018-07-12 23:16:32 +02:00
konrad 6fd2a97574 Implemented CanUpdate method 2018-07-12 23:07:03 +02:00
konrad e3b996c383 Cleanup 2018-07-12 22:42:41 +02:00
konrad 4e503072a8 Implemented CanDelete method for lists and listitems 2018-07-12 21:20:24 +02:00
konrad 217208274e cleanup 2018-07-12 21:10:58 +02:00
konrad 32fde286db Optimized right checking
+ list.ReadAll now really gets all lists
2018-07-12 21:07:59 +02:00
konrad bae9c7f35e Added right check for namespaces 2018-07-12 13:43:42 +02:00
konrad fb4fa25f2f fmt 2018-07-12 11:55:07 +02:00
konrad 868b93dbbc implemented get one namespace via interface mthod 2018-07-12 11:54:55 +02:00
konrad 6f5cf55e42 fmt + lint 2018-07-12 00:37:31 +02:00
konrad 4ae95c1333 Updated featurecreep 2018-07-12 00:36:38 +02:00
konrad 261aaba315 implemented namespace update via interface method 2018-07-12 00:30:31 +02:00
konrad 0aa84e653f implemented namespace creation via interface method 2018-07-12 00:09:16 +02:00
konrad 4734a0a6a6 use echo.NewHTTPError 2018-07-11 14:27:16 +02:00
konrad 4213f3b08c implemented get all namespaces via interface 2018-07-11 13:00:00 +02:00
konrad 5c4fb7ed73 implemented delete list item via CRUD 2018-07-11 11:44:17 +02:00
konrad 281e9c1cd0 fmt 2018-07-11 02:40:29 +02:00
konrad ee4a904e35 Implemented create and update methods for items 2018-07-11 02:39:55 +02:00
konrad 592dc20af4 List item creation is now done via handler 2018-07-11 02:13:53 +02:00
konrad b067425dc3 more optimization 2018-07-11 01:45:11 +02:00
konrad e97fa30202 more optimization 2018-07-11 00:28:53 +02:00
konrad 237874eda6 Fixed lint + fmt 2018-07-10 14:02:23 +02:00
konrad c8622b0029 Implemented Delete methods on list 2018-07-10 13:27:25 +02:00
kolaente b1de837c4f Implemented Create and Update methods on list 2018-07-09 23:17:19 +02:00
kolaente 9e8f13edf6 Getting all lists or one works now 2018-07-09 19:49:27 +02:00
kolaente d5eb2f08e3 Implemented CRUD Helper, every struct needs its own methods 2018-07-08 22:50:01 +02:00
kolaente 0c5ed914e0 CRUD helper now returns directly the target struct filled with data instead of a sub objectq 2018-07-08 13:26:43 +02:00
kolaente 490f32d46b Added CRUD helper method 2018-07-07 14:19:34 +02:00
kolaente 2d0d074f89 small optimizations 2018-07-06 08:40:35 +02:00
kolaente 31eb916af2 updated featurecreep 2018-07-05 08:55:34 +02:00
kolaente 462dfc8868 Implemented method to add a list to a namespace 2018-07-05 08:52:05 +02:00
kolaente 93efaa95f8 Implemented method to delete a namespace 2018-07-04 19:21:04 +02:00
kolaente 2d81330b27 Removed debugging 2018-07-04 18:44:13 +02:00
kolaente f59917e721 Fixed getting all lists of one namespace 2018-07-04 08:56:52 +02:00
kolaente b57ca9375a Fixed namespace updates not working 2018-07-04 08:15:47 +02:00
kolaente ac134fb16b Small fixes to manage namespaces 2018-07-03 09:09:44 +02:00
kolaente 064e1cd3b7 Small fixes to manage namespaces 2018-07-03 08:48:28 +02:00
kolaente e0244e28d7 Added method to show all lists in a namespace 2018-07-03 08:26:28 +02:00
kolaente 06cae09f77 Added method to show one namespace 2018-07-02 09:09:32 +02:00
kolaente 124e4f4a5b Added method to show all namespaces a user has access to 2018-07-02 08:54:44 +02:00
kolaente 6dfdcb9571 Added basic functions + endpoints to add/update namespaces 2018-07-02 08:40:24 +02:00
kolaente bd2bf24813 Started working on namespaces 2018-06-14 17:43:00 +02:00
kolaente ac0a50663d Added basic definitions for namespaces and teams 2018-06-14 16:14:49 +02:00
kolaente 6398134eef More Featurecreep. Or call it a plan. Whatever you want. 2018-06-14 14:58:00 +02:00
kolaente 6141956847 Added swagger UI 2018-06-14 14:19:19 +02:00
kolaente 33c5f91491 Updated Roadmap 2018-06-13 13:49:19 +02:00
kolaente 8500659aec added generated swagger spec 2018-06-13 13:45:53 +02:00
kolaente 4589f3b4bb Added docs via swagger 2018-06-13 13:45:22 +02:00
kolaente 0652125c25 Fixed returning of user infos when updating a todo item 2018-06-13 12:18:55 +02:00
konrad b11a6b912e More Featurecreep 2018-06-12 19:57:48 +02:00
konrad f0f92ad1a1 Improved creation of list items 2018-06-12 19:57:38 +02:00
konrad fc974fd87f Added endpoint to be able to edit list items 2018-06-12 19:44:47 +02:00
konrad 1b3b2ccb59 Improved item deletion rights check 2018-06-12 18:49:56 +02:00
konrad 1bb7187285 Added check to only let a user delete his own list 2018-06-12 18:46:59 +02:00
konrad be18247682 Added check to only let a user delete his own list 2018-06-12 18:35:36 +02:00
konrad 5ba9d76328 Added method to delete a list 2018-06-12 18:17:52 +02:00
konrad dcb046665f Added method to delete a list 2018-06-12 18:17:21 +02:00
kolaente 853fb2a2b7 Added method to delete a todo item from a list 2018-06-12 18:07:47 +02:00
konrad 91f67dc364 Added functions for adding items to a todolist 2018-06-10 19:49:40 +02:00
konrad 7bac9f490e Started adding listitems 2018-06-10 15:55:56 +02:00
konrad abd21f0c14 Plan. 2018-06-10 15:32:25 +02:00
konrad cf4871af59 cleanup 2018-06-10 14:43:35 +02:00
konrad 125f0ba230 Added lists view 2018-06-10 14:41:42 +02:00
konrad b841ec121b unit tests improvments 2018-06-10 14:24:33 +02:00
konrad 2cf20fe1c4 fixed lint + fmt 2018-06-10 14:22:37 +02:00
konrad f372128784 Added list create and update methods 2018-06-10 14:14:10 +02:00
konrad fb4c9d580c Update gitignore 2018-06-10 11:41:29 +02:00
konrad db6c2bfd8f made tests work again 2018-06-10 11:41:10 +02:00
konrad 5510249813 updated fixtures 2018-06-10 11:37:24 +02:00
konrad d840651a24 removed unused errors 2018-06-10 11:35:53 +02:00
konrad 1bee67cac7 Made registration work 2018-06-10 11:34:59 +02:00
kolaente 2ca4c521aa deleted old binary 2018-06-10 11:13:23 +02:00
konrad 986059d719 updated makefile 2018-06-10 11:13:01 +02:00
konrad 479cf54ada initial commit 2018-06-10 11:11:42 +02:00
341 changed files with 66925 additions and 3407 deletions
-236
View File
@@ -1,236 +0,0 @@
---
kind: pipeline
type: docker
name: build
trigger:
branch:
exclude:
- main
event:
include:
- push
- pull_request
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
- name: restore-cache
image: meltwater/drone-cache:dev
pull: true
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
settings:
restore: true
bucket: kolaente.dev-drone-dependency-cache
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
mount:
- '.cache'
- name: build
image: electronuserland/builder:wine-mono
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
depends_on:
- fetch-tags
- restore-cache
commands:
- export VERSION=${DRONE_TAG##v}
- if [ -z "$$VERSION" ]; then export VERSION=unstable; fi
# TODO: Move to a yarn script
- wget https://dl.vikunja.io/frontend/vikunja-frontend-$$VERSION.zip
- unzip vikunja-frontend-$$VERSION.zip -d frontend
- sed -i 's/\\/api\\/v1//g' frontend/index.html
# Make sure that the -unstable suffix is added to release files
- sed -i "s/\$${version}/$$VERSION/g" package.json
- yarn install
- yarn dist --linux --windows
- name: rebuild-cache
image: meltwater/drone-cache:dev
pull: true
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
settings:
rebuild: true
bucket: kolaente.dev-drone-dependency-cache
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
mount:
- '.cache'
depends_on:
- build
---
kind: pipeline
type: docker
name: release
trigger:
ref:
- refs/heads/main
- "refs/tags/**"
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
- name: restore-cache
image: meltwater/drone-cache:dev
pull: true
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
settings:
restore: true
bucket: kolaente.dev-drone-dependency-cache
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
mount:
- '.cache'
- name: build
image: electronuserland/builder:wine-mono
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
depends_on:
- fetch-tags
- restore-cache
commands:
- export VERSION=${DRONE_TAG##v}
- if [ -z "$$VERSION" ]; then export VERSION=unstable; fi
# TODO: Move to a yarn script
- wget https://dl.vikunja.io/frontend/vikunja-frontend-$$VERSION.zip
- unzip vikunja-frontend-$$VERSION.zip -d frontend
- sed -i 's/\\/api\\/v1//g' frontend/index.html
# Make sure that the -unstable suffix is added to release files
- sed -i "s/\$${version}/$$VERSION/g" package.json
- yarn install
- yarn dist --linux --windows
- name: rebuild-cache
image: meltwater/drone-cache:dev
pull: true
environment:
AWS_ACCESS_KEY_ID:
from_secret: cache_aws_access_key_id
AWS_SECRET_ACCESS_KEY:
from_secret: cache_aws_secret_access_key
settings:
rebuild: true
bucket: kolaente.dev-drone-dependency-cache
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
mount:
- '.cache'
depends_on:
- build
- name: release-latest
image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/
source: dist/*
target: /desktop/unstable/
when:
event:
exclude:
- tag
depends_on: [ build ]
- name: release-version
image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/
source: dist/*
target: /desktop/${DRONE_TAG##v}/
when:
event:
- tag
depends_on: [ build ]
# Disabled until we have a working mac runner
#---
#kind: pipeline
#type: exec
#name: release-macos
#
#trigger:
# ref:
# - refs/heads/main
# - "refs/tags/**"
#
#platform:
# os: darwin
# arch: amd64
#
#steps:
# - name: build
# environment:
# ACCESS_KEY:
# from_secret: aws_access_key_id
# SECRET_KEY:
# from_secret: aws_secret_access_key
# commands:
# - git fetch --tags
# - export VERSION=${DRONE_TAG##v}
# - if [ -z "$$VERSION" ]; then export VERSION=unstable; fi
# # TODO: Move to a yarn script
# - wget https://dl.vikunja.io/frontend/vikunja-frontend-$$VERSION.zip
# - unzip vikunja-frontend-$$VERSION.zip -d frontend
# - sed -i '' 's/\\/api\\/v1//g' frontend/index.html
# # Make sure that the -unstable suffix is added to release files
# - sed -i '' "s/\$${version}/$$VERSION/g" package.json
# - yarn install
# - yarn dist --mac
# - mc config host add scw-fr-par https://s3.fr-par.scw.cloud $ACCESS_KEY $SECRET_KEY --api S3v4
# - mc cp ./dist/*.dmg scw-fr-par/vikunja-releases/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fr-par/vikunja-releases/desktop/$VERSION/
---
kind: signature
hmac: f5aa08e285044e34b02b197a309bb8682b8cc9adf630dabaa18cc09cc6b50cf6
...
+714
View File
@@ -0,0 +1,714 @@
kind: pipeline
name: testing
workspace:
base: /go
path: src/code.vikunja.io/api
services:
- name: test-mysql-unit
image: mariadb:10
environment:
MYSQL_ROOT_PASSWORD: vikunjatest
MYSQL_DATABASE: vikunjatest
- name: test-mysql-integration
image: mariadb:10
environment:
MYSQL_ROOT_PASSWORD: vikunjatest
MYSQL_DATABASE: vikunjatest
- name: test-mysql-migration
image: mariadb:10
environment:
MYSQL_ROOT_PASSWORD: vikunjatest
MYSQL_DATABASE: vikunjatest
- name: test-postgres-unit
image: postgres:12
environment:
POSTGRES_PASSWORD: vikunjatest
POSTGRES_DB: vikunjatest
- name: test-postgres-integration
image: postgres:12
environment:
POSTGRES_PASSWORD: vikunjatest
POSTGRES_DB: vikunjatest
- name: test-postgres-migration
image: postgres:12
environment:
POSTGRES_PASSWORD: vikunjatest
POSTGRES_DB: vikunjatest
trigger:
branch:
include:
- master
event:
include:
- push
- pull_request
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
# We're statically compiling the magefile to avoid race condition issues caused by multiple pipeline steps
# compiling the same magefile at the same time. It's also faster if each step does not need to compile it first.
- name: mage
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
commands:
- mage -compile ./mage-static
when:
event: [ push, tag, pull_request ]
- name: build
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
depends_on: [ mage ]
commands:
- ./mage-static build:build
when:
event: [ push, tag, pull_request ]
- name: lint
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
depends_on: [ build ]
commands:
- ./mage-static build:generate
- ./mage-static check:got-swag
- wget -O - -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.31.0
- ./mage-static check:golangci
when:
event: [ push, tag, pull_request ]
- name: test-migration-prepare
image: kolaente/toolbox:latest
pull: true
commands:
# Get the latest version
- wget https://dl.vikunja.io/api/master/vikunja-master-linux-amd64-full.zip -q -O vikunja-latest.zip
- unzip vikunja-latest.zip vikunja-master-linux-amd64
- name: test-migration-sqlite
image: kolaente/toolbox:latest
pull: true
depends_on: [ test-migration-prepare, build ]
environment:
VIKUNJA_DATABASE_TYPE: sqlite
VIKUNJA_DATABASE_PATH: ./vikunja-migration-test.db
VIKUNJA_LOG_DATABASE: stdout
VIKUNJA_LOG_DATABASELEVEL: debug
commands:
- ./vikunja-master-linux-amd64 migrate
# Run the migrations from the binary build in the step before
- ./vikunja migrate
when:
event: [ push, tag, pull_request ]
- name: test-migration-mysql
image: kolaente/toolbox:latest
pull: true
depends_on: [ test-migration-prepare, build ]
environment:
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_HOST: test-mysql-migration
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
VIKUNJA_LOG_DATABASE: stdout
VIKUNJA_LOG_DATABASELEVEL: debug
commands:
- ./vikunja-master-linux-amd64 migrate
# Run the migrations from the binary build in the step before
- ./vikunja migrate
when:
event: [ push, tag, pull_request ]
- name: test-migration-psql
image: kolaente/toolbox:latest
pull: true
depends_on: [ test-migration-prepare, build ]
environment:
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: test-postgres-migration
VIKUNJA_DATABASE_USER: postgres
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
VIKUNJA_DATABASE_SSLMODE: disable
VIKUNJA_LOG_DATABASE: stdout
VIKUNJA_LOG_DATABASELEVEL: debug
commands:
- ./vikunja-master-linux-amd64 migrate
# Run the migrations from the binary build in the step before
- ./vikunja migrate
when:
event: [ push, tag, pull_request ]
- name: test
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
commands:
- ./mage-static build:generate
- ./mage-static test:unit
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: test-sqlite
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: sqlite
commands:
- ./mage-static build:generate
- ./mage-static test:unit
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: test-mysql
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_HOST: test-mysql-unit
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
commands:
- ./mage-static build:generate
- ./mage-static test:unit
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: test-postgres
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: test-postgres-unit
VIKUNJA_DATABASE_USER: postgres
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
VIKUNJA_DATABASE_SSLMODE: disable
commands:
- ./mage-static build:generate
- ./mage-static test:unit
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: integration-test
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
commands:
- ./mage-static build:generate
- ./mage-static test:integration
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: integration-test-sqlite
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: sqlite
commands:
- ./mage-static build:generate
- ./mage-static test:integration
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: integration-test-mysql
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_HOST: test-mysql-integration
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
commands:
- ./mage-static build:generate
- ./mage-static test:integration
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
- name: integration-test-postgres
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
VIKUNJA_TESTS_USE_CONFIG: 1
VIKUNJA_DATABASE_TYPE: postgres
VIKUNJA_DATABASE_HOST: test-postgres-integration
VIKUNJA_DATABASE_USER: postgres
VIKUNJA_DATABASE_PASSWORD: vikunjatest
VIKUNJA_DATABASE_DATABASE: vikunjatest
VIKUNJA_DATABASE_SSLMODE: disable
commands:
- ./mage-static build:generate
- ./mage-static test:integration
depends_on: [ fetch-tags, mage ]
when:
event: [ push, tag, pull_request ]
---
########
# Build a release when tagging
########
kind: pipeline
name: release
depends_on:
- testing
workspace:
base: /go
path: src/code.vikunja.io/api
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
steps:
# Needed to get the versions right as they depend on tags
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
# We're statically compiling the magefile to avoid race condition issues caused by multiple pipeline steps
# compiling the same magefile at the same time. It's also faster if each step does not need to compile it first.
- name: mage
image: vikunja/golang-build:latest
pull: true
environment:
GOPROXY: 'https://goproxy.kolaente.de'
commands:
- mage -compile ./mage-static
when:
event: [ push, tag, pull_request ]
- name: before-static-build
image: techknowlogick/xgo:latest
pull: true
commands:
- export PATH=$PATH:$GOPATH/bin
- go install github.com/magefile/mage
- ./mage-static build:generate
- ./mage-static release:dirs
depends_on: [ fetch-tags, mage ]
- name: static-build-windows
image: techknowlogick/xgo:latest
pull: true
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
# Leaving this here until we know how to resolve this properly.
GOPATH: /srv/app
commands:
- export PATH=$PATH:$GOPATH/bin
- go install github.com/magefile/mage
- ./mage-static release:windows
depends_on: [ before-static-build ]
- name: static-build-linux
image: techknowlogick/xgo:latest
pull: true
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
# Leaving this here until we know how to resolve this properly.
GOPATH: /srv/app
commands:
- export PATH=$PATH:$GOPATH/bin
- go install github.com/magefile/mage
- ./mage-static release:linux
depends_on: [ before-static-build ]
- name: static-build-darwin
image: techknowlogick/xgo:latest
pull: true
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
# Leaving this here until we know how to resolve this properly.
GOPATH: /srv/app
commands:
- export PATH=$PATH:$GOPATH/bin
- go install github.com/magefile/mage
- ./mage-static release:darwin
depends_on: [ before-static-build ]
- name: after-build-compress
image: kolaente/upx
pull: true
depends_on:
- static-build-windows
- static-build-linux
- static-build-darwin
commands:
- ./mage-static release:compress
- name: after-build-static
image: techknowlogick/xgo:latest
pull: true
depends_on:
- after-build-compress
commands:
- go install github.com/magefile/mage
- ./mage-static release:copy
- ./mage-static release:check
- ./mage-static release:os-package
- ./mage-static release:zip
- name: sign-release
image: plugins/gpgsign:1
pull: true
depends_on: [ after-build-static ]
settings:
key:
from_secret: gpg_privkey
passphrase:
from_secret: gpg_password
files:
- dist/zip/*
detach_sign: true
# Push the releases to our pseudo-s3-bucket
- name: release-latest
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
target: /api/master/
when:
branch:
- master
event:
- push
depends_on: [ sign-release ]
- name: release-version
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
target: /api/${DRONE_TAG##v}/
when:
event:
- tag
depends_on: [ sign-release ]
# Build os packages and push it to our bucket
- name: build-os-packages
image: goreleaser/nfpm
pull: true
commands:
- apk add git go
- ./mage-static release:packages
depends_on: [ static-build-linux ]
# Push the os releases to our pseudo-s3-bucket
- name: release-os-latest
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
target: /api/master/
when:
branch:
- master
event:
- push
depends_on: [ build-os-packages ]
- name: release-os-version
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
target: /api/${DRONE_TAG##v}/
when:
event:
- tag
depends_on: [ build-os-packages ]
- name: deb-structure
image: kolaente/reprepro
pull: true
environment:
GPG_PRIVATE_KEY:
from_secret: gpg_privatekey
commands:
- export GPG_TTY=$(tty)
- gpg -qk
- echo "use-agent" >> ~/.gnupg/gpg.conf
- gpgconf --kill gpg-agent
- echo $GPG_PRIVATE_KEY > ~/frederik.gpg
- gpg --import ~/frederik.gpg
- mkdir debian/conf -p
- cp build/reprepro-dist-conf debian/conf/distributions
- ./mage-static release:reprepro
depends_on: [ build-os-packages ]
# Push the releases to our pseudo-s3-bucket
- name: release-deb
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-releases
access_key:
from_secret: aws_access_key_id
secret_key:
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: debian
source: debian/*/*/*/*/*
target: /deb/
depends_on: [ deb-structure ]
---
kind: pipeline
name: deploy-docs
workspace:
base: /go
path: src/code.vikunja.io/api
clone:
depth: 50
trigger:
event:
- push
branch:
- master
steps:
- name: submodules
image: docker:git
commands:
- git submodule update --init
- git submodule update --recursive --remote
- name: theme
image: kolaente/yarn
pull: true
group: build-static
commands:
- cd docs/themes/vikunja
- yarn --production=false
- ./node_modules/.bin/gulp prod
- name: build
image: monachus/hugo:v0.54.0
pull: true
commands:
- cd docs
- hugo
- mv public/docs/* public # Hugo seems to be not capable of setting a different theme for a home page, so we do this ugly hack to fix it.
- name: docker
image: plugins/docker
pull: true
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: vikunja/docs
context: docs/
dockerfile: docs/Dockerfile
---
kind: pipeline
type: docker
name: docker-arm-release
depends_on:
- testing
platform:
os: linux
arch: arm
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
- name: docker
image: plugins/docker:linux-arm
pull: true
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: vikunja/api
auto_tag: true
auto_tag_suffix: linux-arm
depends_on: [ fetch-tags ]
---
kind: pipeline
type: docker
name: docker-amd64-release
depends_on:
- testing
platform:
os: linux
arch: amd64
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
steps:
- name: fetch-tags
image: docker:git
commands:
- git fetch --tags
- name: docker
image: plugins/docker:linux-amd64
pull: true
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: vikunja/api
auto_tag: true
auto_tag_suffix: linux-amd64
depends_on: [ fetch-tags ]
---
kind: pipeline
type: docker
name: docker-manifest
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
depends_on:
- docker-amd64-release
- docker-arm-release
steps:
- name: manifest
pull: always
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
spec: docker-manifest.tmpl
password:
from_secret: docker_password
username:
from_secret: docker_username
---
kind: pipeline
type: docker
name: notify
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
depends_on:
- release
- docker-manifest
steps:
- name: telegram
image: appleboy/drone-telegram:1-linux-amd64
settings:
token:
from_secret: TELEGRAM_TOKEN
to:
from_secret: TELEGRAM_TO
message: >
{{repo.owner}}/{{repo.name}}: \[{{build.status}}] Build {{build.number}}
{{commit.author}} pushed to {{commit.branch}} {{commit.sha}}: `{{commit.message}}`
Build started at {{datetime build.started "2006-Jan-02T15:04:05Z" "GMT+2"}} finished at {{datetime build.finished "2006-Jan-02T15:04:05Z" "GMT+2"}}.
when:
status:
- success
- failure
+11
View File
@@ -0,0 +1,11 @@
# Description
# Checklist
* [ ] I added or improved tests
* [ ] I added or improved docs for my feature
* [ ] Swagger (including `mage do-the-swag`)
* [ ] Error codes
* [ ] New config options (including adding them to `config.yml.saml` and running `mage generate-docs`)
+1
View File
@@ -0,0 +1 @@
custom: https://www.buymeacoffee.com/kolaente
+23 -4
View File
@@ -1,6 +1,25 @@
node_modules/
.idea/
frontend/
.idea/*/*
.idea/httpRequests
config.yml
config.yaml
!docs/config.yml
*.db
Run
dist/
*.zip
*.tgz
cover.*
/vikunja
Test_*
bin/
secrets
*.deb
debian/
logs/
docs/public/
docs/resources/
pkg/static/templates_vfsdata.go
files/
!pkg/files/
vikunja-dump*
vendor/
os-packages/
+3
View File
@@ -0,0 +1,3 @@
[submodule "docs/themes/vikunja"]
path = docs/themes/vikunja
url = ../theme.git
+76
View File
@@ -0,0 +1,76 @@
run:
timeout: 5m
tests: true
linters:
enable:
- megacheck
- govet
- goconst
- gocritic
- gocyclo
- goerr113
- goheader
- gofmt
- goimports
- golint
- misspell
disable:
- scopelint # Obsolete, using exportloopref instead
presets:
- bugs
- unused
fast: false
linter-settings:
nestif:
min-complexity: 6
goheader:
template-path: code-hesader-template.txt
issues:
exclude-rules:
# Exclude some linters from running on tests files.
- path: _test\.go
linters:
- gocyclo
- deadcode
- path: pkg/integrations/*
linters:
- gocyclo
- deadcode
- varcheck
- unparam
- bodyclose
- path: pkg/integrations/*
text: "unlambda"
linters:
- gocritic
- path: pkg/modules/background/unsplash/unsplash\.go
linters:
- bodyclose
- path: pkg/migration/*
linters:
- exhaustive
- goconst
- goerr113
- path: pkg/models/task_collection_filter\.go
linters:
- exhaustive
- path: pkg/utils/random_string\.go
text: "G404:" # We don't care about cryptographically secure randomness when we're using that utility function.
linters:
- gosec
- path: pkg/modules/dump/*
linters:
- goerr113
- path: pkg/
text: "err113: do not define dynamic errors, use wrapped static errors instead:"
linters:
- goerr113
- text: "commentFormatting: put a space between `//` and comment text"
linters:
- gocritic
- path: pkg/modules/migration
linters:
- gocyclo
+642 -256
View File
@@ -5,273 +5,659 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
All releases can be found on https://code.vikunja.io/desktop/releases.
All releases can be found on https://code.vikunja.io/api/releases.
The releases aim at the api and frontend versions which is why there are missing versions.
## [0.21.0] - 2023-07-07
### Dependencies
* *(deps)* Update dependency electron to v22.1.0 (#134)
* *(deps)* Update dependency electron to v22.2.0 (#135)
* *(deps)* Update dependency electron to v23 (#136)
* *(deps)* Update dependency electron to v23.1.0 (#138)
* *(deps)* Update dependency electron to v23.1.1 (#139)
* *(deps)* Update dependency electron to v23.1.2 (#140)
* *(deps)* Update dependency electron to v23.1.3 (#141)
* *(deps)* Update dependency electron to v23.1.4 (#142)
* *(deps)* Update dependency electron to v23.2.0 (#143)
* *(deps)* Update dependency express to v4.18.2 (#144)
* *(deps)* Update dependency electron to v23.2.1 (#145)
* *(deps)* Update dependency electron to v23.2.2 (#146)
* *(deps)* Update dependency electron to v24 (#147)
* *(deps)* Update dependency electron to v24.1.1 (#148)
* *(deps)* Update dependency electron to v24.1.2 (#149)
* *(deps)* Update dependency electron to v24.1.3 (#150)
* *(deps)* Update dependency electron to v24.3.1 (#151)
* *(deps)* Update dependency electron to v24.4.0 (#152)
* *(deps)* Update dependency electron to v25 (#153)
* *(deps)* Update dependency electron to v25.0.1 (#155)
* *(deps)* Update dependency electron to v25.1.0 (#156)
* *(deps)* Update dependency electron to v25.1.1 (#158)
* *(deps)* Update dependency electron to v25.2.0 (#159)
* *(deps)* Update dependency electron-builder to v24 (#157)
* *(deps)* Update dependency connect-history-api-fallback to v2 (#103)
### Miscellaneous Tasks
* Remove sponsor ([c02c5d0](c02c5d009ffcef7984c2feebf7df4f25444b24e1))
## [0.20.3] - 2023-01-24
### Bug Fixes
* Open links in OS default browser ([9915318](99153187d77d5b2311bc2a87864f70b9d2563370))
### Dependencies
* *(deps)* Update dependency electron to v22.0.1 (#131)
* *(deps)* Update dependency electron to v22.0.2 (#132)
* *(deps)* Update dependency electron to v22.0.3 (#133)
## [0.20.2] - 2022-12-18
### Dependencies
* *(deps)* Update dependency electron to v21.3.1 (#128)
* *(deps)* Update dependency electron to v22 (#129)
## [0.20.1] - 2022-11-11
### Dependencies
* *(deps)* Update dependency electron to v21.2.1 (#125)
* *(deps)* Update dependency electron to v21.2.2 (#126)
## [0.20.0] - 2022-10-28
### Dependencies
* *(deps)* Update dependency electron to v21.1.0 (#120)
* *(deps)* Update dependency electron-builder to v23.6.0 (#122)
* *(deps)* Update dependency electron to v21.1.1 (#123)
* *(deps)* Update dependency electron to v21.2.0 (#124)
## [0.19.1 - 2022-08-17]
### Dependencies
* *(deps)* Update dependency electron to v20.0.2 (#111)
* *(deps)* Update dependency electron to v20.0.3 (#112)
* *(deps)* Update dependency electron to v20.1.1 (#113)
* *(deps)* Update dependency electron to v20.1.2 (#114)
* *(deps)* Update dependency electron to v20.1.3 (#115)
* *(deps)* Update dependency electron to v20.1.4 (#116)
* *(deps)* Update dependency electron to v20.2.0 (#117)
* *(deps)* Update dependency electron to v21 (#118)
* *(deps)* Update dependency electron to v21.0.1 (#119)
### Features
* Add sponsor to readme (relm) ([5b4d5c7](5b4d5c784b4ea447ea928c8c9ee83a58b51f10f4))
### Miscellaneous Tasks
* Disable mac builds ([0563fb2](0563fb2ee5ae16357cdd9463be33ca3f3977c596))
## [0.19.0 - 2022-08-03]
### Dependencies
* *(deps)* Update dependency electron-builder to v22.13.1 (#61)
* *(deps)* Update dependency electron to v15.2.0 (#60)
* *(deps)* Update dependency electron to v15.3.0 (#63)
* *(deps)* Update dependency electron to v15.3.1 (#64)
* *(deps)* Update dependency electron to v15.3.2 (#66)
* *(deps)* Update dependency electron to v16 (#65)
* *(deps)* Update dependency electron to v16.0.1 (#67)
* *(deps)* Update dependency electron-builder to v22.14.5 (#68)
* *(deps)* Update dependency electron to v16.0.2 (#69)
* *(deps)* Update dependency electron to v16.0.3 (#71)
* *(deps)* Update dependency electron to v16.0.4 (#72)
* *(deps)* Update dependency electron to v16.0.5 (#73)
* *(deps)* Update dependency electron to v16.0.6 (#74)
* *(deps)* Update dependency electron to v16.0.7 (#75)
* *(deps)* Update dependency electron to v16.0.8 (#76)
* *(deps)* Update dependency electron to v17 (#77)
* *(deps)* Update dependency electron-builder to v22.14.13 (#78)
* *(deps)* Update dependency electron to v17.0.1 (#79)
* *(deps)* Update dependency electron to v17.1.0 (#80)
* *(deps)* Update dependency electron to v17.1.1 (#81)
* *(deps)* Update dependency electron to v17.1.2 (#82)
* *(deps)* Update dependency electron to v17.2.0 (#83)
* *(deps)* Update dependency electron to v17.3.0 (#84)
* *(deps)* Update dependency electron to v18 (#85)
* *(deps)* Update dependency electron to v18.0.1 (#86)
* *(deps)* Update dependency electron to v18.0.2 (#87)
* *(deps)* Update dependency electron to v18.0.3 (#88)
* *(deps)* Update dependency electron-builder to v23 (#89)
* *(deps)* Update dependency electron to v18.0.4 (#90)
* *(deps)* Update dependency electron to v18.1.0 (#91)
* *(deps)* Update dependency electron to v18.2.0 (#92)
* *(deps)* Update dependency electron to v18.2.2 (#93)
* *(deps)* Update dependency electron to v18.2.3 (#94)
* *(deps)* Update dependency electron to v18.2.4 (#95)
* *(deps)* Update dependency electron to v18.3.1 (#96)
* *(deps)* Update dependency electron to v19 (#97)
* *(deps)* Update dependency electron to v19.0.2 (#98)
* *(deps)* Update dependency electron to v19.0.3 (#99)
* *(deps)* Update dependency electron to v19.0.4 (#100)
* *(deps)* Update dependency electron to v19.0.6 (#101)
* *(deps)* Update dependency electron-builder to v23.1.0 (#102)
* *(deps)* Update dependency electron to v19.0.7 (#104)
* *(deps)* Update dependency electron to v19.0.8 (#105)
* *(deps)* Update dependency electron to v19.0.9 (#106)
* *(deps)* Update dependency electron to v19.0.10 (#107)
* *(deps)* Update dependency electron-builder to v23.3.3 (#108)
* *(deps)* Update dependency electron to v20 (#109)
* *(deps)* Update dependency electron to v20.0.1 (#110)
### Miscellaneous Tasks
* *(ci)* Use latest s3 plugin
* *(ci)* Sign drone config
### Other
* *(other)* Update dependency electron to v14.0.1 (#58)
* *(other)* Update dependency electron to v15 (#59)
## [0.18.0 - 2021-09-05]
### Added
* Add drone pipeline for PR
* Enable mac builds
### Changed
* Cleanup
* Fix sed for macos
* Install yarn on mac
* Only upload .dmg files for macos builds
* Sign drone config
### Dependency Updates
* Update dependency electron-builder to v22.11.7 (#45)
* Update dependency electron to v13.0.1 (#41)
* Update dependency electron to v13.1.0 (#42)
* Update dependency electron to v13.1.1 (#43)
* Update dependency electron to v13.1.2 (#44)
* Update dependency electron to v13.1.3 (#46)
* Update dependency electron to v13.1.4 (#47)
* Update dependency electron to v13.1.5 (#48)
* Update dependency electron to v13.1.6 (#49)
* Update dependency electron to v13.1.7 (#50)
* Update dependency electron to v13.1.8 (#51)
* Update dependency electron to v13.1.9 (#52)
* Update dependency electron to v13.2.0 (#53)
* Update dependency electron to v13.2.1 (#54)
* Update dependency electron to v13.2.2 (#55)
* Update dependency electron to v13.2.3 (#56)
* Update dependency electron to v13 (#39)
* Update dependency electron to v14 (#57)
## [0.17.0 - 2021-05-20]
For a list of changes in this release, see [the frontend changelog](https://kolaente.dev/vikunja/frontend/releases/tag/v0.17.0).
## [0.15.0] - 2020-10-19
### Added
* Add darwin release pipeline
* Add pipeline type
### Changed
* Change release target path for unstable releases
* Change version to download to unstable
* Disable the mac builds for now
* Move release steps in one pipeline step for macos
* Switch main branch to main
* Switch to wine-mono for building
* Add app support info for DAV (#692)
* Add better tests for namespaces
* Add caldav enabled/disabled to /info endpoint
* Add checks if tasks exist in maps before trying to access them
* Add config option to force ssl connections to connect with the mailer
* Add dav proxy directions to example proxy configurations
* Add docs about using vikunja with utf-8 characters
* Add FreeBSD guide to installation docs
* Add github sponsor link
* Add Golangci Lint (#676)
* Add mage command to create a new migration
* Add option to configure legal urls
* Add rootpath to deb command to not include everything in the deb file
* Add toc to docs
* Add update route to toggle team member admin status
* Add util function to move files
* Disable gocyclo for migration modules
* Favorite lists (#654)
* Favorite tasks (#653)
* Generate config docs from sample config (#684)
* Kanban bucket limits (#652)
* Key-Value Storages (#674)
* Manage users via cli (#632)
* Mention client_max_body_size in nginx proxy settings
* More avatar providers (#622)
* Return rights when reading a single item (#626)
* Saved filters (#655)
### Fixed
* Fix missing application icon on Linux. (#19)
* Fix version in package.json
### Dependency Updates
* Update dependency electron-builder to v22.10.5 (#23)
* Update dependency electron-builder to v22.11.1 (#31)
* Update dependency electron-builder to v22.11.2 (#33)
* Update dependency electron-builder to v22.11.3 (#34)
* Update dependency electron-builder to v22.11.4 (#35)
* Update dependency electron-builder to v22.11.5 (#37)
* Update dependency electron to v11.2.0 (#12)
* Update dependency electron to v11.2.1 (#14)
* Update dependency electron to v11.2.2 (#20)
* Update dependency electron to v11.2.3 (#21)
* Update dependency electron to v11.3.0 (#22)
* Update dependency electron to v12.0.1 (#25)
* Update dependency electron to v12.0.2 (#26)
* Update dependency electron to v12.0.3 (#27)
* Update dependency electron to v12.0.4 (#28)
* Update dependency electron to v12.0.5 (#29)
* Update dependency electron to v12.0.6 (#30)
* Update dependency electron to v12.0.7 (#32)
* Update dependency electron to v12.0.8 (#36)
* Update dependency electron to v12.0.9 (#38)
* Update dependency electron to v12 (#24)
## [0.16.0 - 2021-01-10]
For a list of changes in this release, see [the frontend changelog](https://kolaente.dev/vikunja/frontend/releases/tag/v0.16.0).
### Added
* Add yarn cache to drone
* Configure Renovate (#1)
* Cleanup references to make
* Don't add a subtask to the top level of tasks to not add it twice in the list
* Fetch tasks for caldav lists (#641)
* Fix building for darwin with mage
* Fix creating lists with non ascii characters (#607)
* Fix decoding active users from redis
* Fix dockerimage build
* Fix docs index links
* Fix duplicating a list with background
* "Fix" gocyclo
* Fix loading list background information for uploaded backgrounds
* Fix migrating items with large items from todoist
* Fix nfpm command in drone
* Fix parsing todoist reminder dates
* Fix reading passwords on windows
* Fix release commands in drone
* Fix release trigger
* Fix release trigger in drone
* Fix token renew for link shares
* Fix trigger for pushing release artifacts to drone
* Fix updating team admin status
* Fix upload avatar not working
* Fix users with disabled totp but not enrolled being unable to login
* Makefile: make add EXTRA_GOFLAG to GOFLAGS (#605)
* Make sure built binary files are executable when compressing with upx
* Make sure lists which would have a duplicate identifier can still be duplicated
* Make sure the metrics map accesses only happen explicitly
* Make sure to copy the permissions as well when moving files
* Make sure to only initialize all variables when needed
* Make sure to require admin rights when modifying list/namespace users to be consistent with teams
* Make sure we have git installed when building os packages
* Make sure we have go installed when building os packages (for build step dependencies)
* Only check if a bucket limit is exceeded when moving a task between buckets
* Only try to download attachments from todoist when there is a url
* Pin telegram notification plugin in drone
* Regenerate swagger docs
* Skip directories when moving build release artefacts in drone
* Support absolute iCal timestamps in CalDAV requests (#691)
* Work around tasks with attachments not being duplicated
### Changed
* Change license to GPLv3
* Pin dependencies (#2)
* Update dependency electron to v10.1.5 (#3)
* Update dependency electron to v11.0.1 (#5)
* Update dependency electron to v11.0.2 (#6)
* Update dependency electron to v11.0.3 (#7)
* Update dependency electron to v11.0.4 (#8)
* Update dependency electron to v11.1.0 (#9)
* Update dependency electron to v11.1.1 (#10)
* Update dependency electron to v11 (#4)
* Replace renovate tokens with env
* Switch s3 release bucket to scaleway
* Switch to mage (#651)
* Testing improvements (#666)
* Update docs with testmail command + reorder
* Update github.com/asaskevich/govalidator commit hash to 29e1ff8 (#639)
* Update github.com/asaskevich/govalidator commit hash to 50839af (#637)
* Update github.com/asaskevich/govalidator commit hash to 7a23bdc (#657)
* Update github.com/asaskevich/govalidator commit hash to df4adff (#552)
* Update github.com/c2h5oh/datasize commit hash to 48ed595 (#644)
* Update github.com/gordonklaus/ineffassign commit hash to e36bfde (#625)
* Update github.com/jgautheron/goconst commit hash to 8f5268c (#658)
* Update github.com/shurcooL/vfsgen commit hash to 0d455de (#642)
* Update golang.org/x/crypto commit hash to 123391f (#619)
* Update golang.org/x/crypto commit hash to 5c72a88 (#640)
* Update golang.org/x/crypto commit hash to 7f63de1 (#672)
* Update golang.org/x/crypto commit hash to 84dcc77 (#678)
* Update golang.org/x/crypto commit hash to 948cd5f (#609)
* Update golang.org/x/crypto commit hash to 9e8e0b3 (#685)
* Update golang.org/x/crypto commit hash to ab33eee (#608)
* Update golang.org/x/crypto commit hash to afb6bcd (#668)
* Update golang.org/x/crypto commit hash to c90954c (#671)
* Update golang.org/x/crypto commit hash to eb9a90e (#669)
* Update golang.org/x/image commit hash to 4578eab (#663)
* Update golang.org/x/image commit hash to a67d67e (#664)
* Update golang.org/x/image commit hash to e162460 (#665)
* Update golang.org/x/image commit hash to e59bae6 (#659)
* Update golang.org/x/sync commit hash to 3042136 (#667)
* Update golang.org/x/sync commit hash to b3e1573 (#675)
* Update module 4d63.com/tz to v1.2.0 (#631)
* Update module fzipp/gocyclo to v0.2.0 (#686)
* Update module fzipp/gocyclo to v0.3.0 (#687)
* Update module getsentry/sentry-go to v0.7.0 (#617)
* Update module go-errors/errors to v1.1.1 (#677)
* Update module go-testfixtures/testfixtures/v3 to v3.4.0 (#627)
* Update module go-testfixtures/testfixtures/v3 to v3.4.1 (#693)
* Update module iancoleman/strcase to v0.1.0 (#636)
* Update module iancoleman/strcase to v0.1.1 (#645)
* Update module iancoleman/strcase to v0.1.2 (#660)
* Update module imdario/mergo to v0.3.10 (#615)
* Update module imdario/mergo to v0.3.11 (#629)
* Update module labstack/echo/v4 to v4.1.17 (#646)
* Update module lib/pq to v1.7.1 (#616)
* Update module lib/pq to v1.8.0 (#618)
* Update module mattn/go-sqlite3 to v1.14.1 (#638)
* Update module mattn/go-sqlite3 to v1.14.2 (#647)
* Update module mattn/go-sqlite3 to v1.14.3 (#661)
* Update module mattn/go-sqlite3 to v1.14.4 (#670)
* Update module prometheus/client_golang to v1.8.0 (#681)
* Update module spf13/afero to v1.3.2 (#610)
* Update module spf13/afero to v1.3.3 (#623)
* Update module spf13/afero to v1.3.4 (#628)
* Update module spf13/afero to v1.3.5 (#650)
* Update module spf13/afero to v1.4.0 (#662)
* Update module spf13/afero to v1.4.1 (#673)
* Update module spf13/cobra to v1.1.0 (#679)
* Update module spf13/cobra to v1.1.1 (#690)
* Update module spf13/viper to v1.7.1 (#620)
* Update module src.techknowlogick.com/xgo to v1.1.0+1.15.0 (#630)
* Update module src.techknowlogick.com/xgo to v1 (#613)
* Update module swaggo/swag to v1.6.8 (#680)
* Update renovate token
* Update src.techknowlogick.com/xgo commit hash to 7c2e3c9 (#611)
* Update src.techknowlogick.com/xgo commit hash to 96de19c (#612)
* update theme
* Update xgo to v1.0.0+1.14.6
* Use db sessions for task-related things (#621)
* Use nfpm to build deb, rpm and apk packages (#689)
## [0.15.0 - 2020-10-19]
## [0.14.1] - 2020-07-07
First initial release.
### Fixed
For a list of changes in this release, see [the frontend changelog](https://kolaente.dev/vikunja/frontend/releases/tag/v0.15.0).
* Fix creating lists with non ascii characters (#607)
* Fix decoding active users from redis
* Fix parsing todoist reminder dates
* Make sure the metrics map accesses only happen explicitly
### Changed
* Update docs theme
## [0.14.0] - 2020-07-01
### Added
* Add ability to run the docker container with configurable user and group ids
* Add better errors if the sqlite db file is not writable
* Add cache for initial unsplash collection
* Add docker setup guide from start to finish
* Add docs for restore
* Add dump command (#592)
* Add section to full-docker-example.md for Caddy v2 (#595)
* Add go version to version command
* Add list background information when getting all lists
* Add logging if downloading an image from unsplash fails
* Add migration test in drone (#585)
* Add option to disable totp for everyone
* Add plausible to docs
* Add restarting commands to all example docker compose files
* Add seperate docker pipeline for amd64 and arm
* Add test mail command (#571)
* Add todoist migrator to available migrators in info endpoint if it is enabled
* Add unsplash image proxy for images and thumbnails
* Add returning unsplash info when searching
* Don't return all tasks when a user has no lists
* Duplicate Lists (#603)
* Enable upload backgrounds by default
* Generate a random list identifier based on the list title
* List Backgrounds (#568)
* List Background upload (#582)
* Repeat tasks after completion (#587)
* Restore command (#593)
* Sentry integration (#591)
* Todoist Migration (#566)
### Fixed
* Ensure consistent naming of title fields (#528)
* Ensure task dates are in the future if a task has a repeating interval (#586)
* Fix caching of initial unsplash results per page
* Fix case-insensitive task search for postgresql (#524)
* Fix docker manifest build
* Fix docker multiarch build
* Fix docs theme build
* Fix getting unsplash thumbnails for non "photo-*" urls
* Fix migration 20200425182634
* Fix migration 20200516123847
* Fix migration to add position to task
* Fix misspell
* Fix namespace title not being updated
* Fix not loading timezones on all operating systems
* Fix proxying unsplash images (security)
* Fix removing existing sqlite files
* Fix resetting list, label & namespace colors
* Fix searching for unsplash pictures with words that contain a space
* Fix setting a list identifier to empty
* Fix sqlite db not working when creating a new one
* Fix sqlite path in default config
* Fix swagger docs
* Fix updating the index when moving a task
* Prevent crashing when trying to register with an empty payload
* Properly ping unsplash when using unsplash images
* Return errors when dumping
* Set the list identifier when creating a new task
### Changed
* Expose namespace id when querying lists
* Improve getting all namespaces performance (#526)
* Improve memory usage of dump by not loading all files in memory prior to adding them to the zip
* Improve metrics performance
* Load the list when setting a background
* Make the db timezone migration mysql compatible
* Make the `_unix` suffix optional when sorting tasks
* Migrate all timestamps to real iso dates (#594)
* Make sure docker images are only built when tests pass
* Remove build date from binary
* Remove dependencies on build step to speed up test pipeline (#521)
* Remove go mod vendor todo from pr template now that we don't keep dependencies in the repo anymore
* Remove migration dependency to models
* Remove min length for labels, lists, namespaces, tasks and teams
* Remove vendored dependencies
* Reorganize cmd init functions
* Set unsplash empty collection caching to one hour
* Simplify pipeline & add docker manifest step
* Update alpine Docker tag to v3.12 (#573)
* Update and fix staticcheck
* Update dependency github.com/mattn/go-sqlite3 to v1.14.0
* Update github.com/shurcooL/vfsgen commit hash to 92b8a71 (#599)
* Update golang.org/x/crypto commit hash to 279210d (#577)
* Update golang.org/x/crypto commit hash to 70a84ac (#578)
* Update golang.org/x/crypto commit hash to 75b2880 (#596)
* Update module go-redis/redis/v7 to v7.3.0 (#565)
* Update module go-redis/redis/v7 to v7.4.0 (#579)
* Update module go-testfixtures/testfixtures/v3 to v3.3.0 (#600)
* Update module lib/pq to v1.6.0 (#572)
* Update module lib/pq to v1.7.0 (#581)
* Update module prometheus/client_golang to v1.7.0 (#589)
* Update module prometheus/client_golang to v1.7.1 (#597)
* Update module spf13/afero to v1.3.0 (#588)
* Update module spf13/afero to v1.3.1 (#602)
* Update module spf13/cobra to v1 (#511)
* Update module src.techknowlogick.com/xormigrate to v1.2.1 (#574)
* Update module src.techknowlogick.com/xormigrate to v1.3.0 (#590)
* Update module stretchr/testify to v1.6.0 (#570)
* Update module stretchr/testify to v1.6.1 (#580)
* Update module swaggo/swag to v1.6.7 (#601)
* Update src.techknowlogick.com/xgo commit hash to 209a5cf (#523)
* Update src.techknowlogick.com/xgo commit hash to a09175e (#576)
* Update src.techknowlogick.com/xgo commit hash to eeb7c0a (#575)
* update theme
* Update theme
* Update web handler
* Update xorm.io/xorm 1.0.1 -> 1.0.2
* Use the db logger instance for logging migration related stuff
## [0.13.1] - 2020-05-19
### Fixed
* Don't get all tasks if a user has no lists
## [0.13] - 2020-05-12
#### Added
* Add 2fa for authentification (#383)
* Add categories to error docs
* Add changing email for users
* Add community link
* Add configuration options for log level
* Add creating a new first bucket when creating a new list
* Add docs for changing frontend url
* Add endpoint to disable totp auth
* Add endpoint to get the current users totp status
* Add explanation to docs about cors
* Add github token for renovate (#164)
* Add gosec static analysis
* Add moving tasks between lists (#389)
* Add real buckets for tasks which don't have one (#446)
* Add traefik 2 example configuration
* Configure Renovate (#159)
* Kanban (#393)
* Task filters (#243)
* Task Position (#412)
#### Fixed
* Add checking and logging when trying to put a task into a nonexisting bucket
* Fix bucket ID being reset with no need to do so
* Fix creating new things with a link share auth
* Fix dependencies
* Fix gosec in drone
* Fix link share creation & creating admin link shares without admin rights
* Fix moving tasks back into the empty (ID: 0) bucket
* Fix moving tasks in buckets
* Fix not moving its bucket when moving a task between lists
* Fix pagination count for task collection
* Fix parsing array style comparators by query param
* Fix reference to reverse proxies in docs
* Fix removing the last bucket
* Fix replace statements for tail
* Fix team rights not updating for namespace rights
* Fix tests after renaming json fields to snake_case
* Fix total label count when getting all labels (#477)
* Remove setting task bucket to 0
* Task Filter Fixes (#495)
#### Changed
* Change all json fields to snake_case
* Change totp secret datatype from varchar to text
* Update alpine Docker tag to v3.11 (#160)
* Update docs theme
* Update github.com/c2h5oh/datasize commit hash to 28bbd47 (#212)
* Update github.com/gordonklaus/ineffassign commit hash to 7953dde (#233)
* Update github.com/jgautheron/goconst commit hash to cda7ea3 (#228)
* Update github.com/shurcooL/httpfs commit hash to 8d4bc4b (#229)
* Update golang.org/x/crypto commit hash to 056763e (#222)
* Update golang.org/x/crypto commit hash to 06a226f (#504)
* Update golang.org/x/crypto commit hash to 0848c95 (#371)
* Update golang.org/x/crypto commit hash to 3c4aac8 (#419)
* Update golang.org/x/crypto commit hash to 44a6062 (#429)
* Update golang.org/x/crypto commit hash to 4b2356b (#475)
* Update golang.org/x/crypto commit hash to 4bdfaf4 (#438)
* Update golang.org/x/crypto commit hash to 729f1e8 (#458)
* Update golang.org/x/crypto commit hash to a76a400 (#411)
* Update golang.org/x/lint commit hash to 738671d (#223)
* Update module go-redis/redis to v6.15.7 (#234)
* Update module go-redis/redis to v6.15.7 (#290)
* Update module go-redis/redis to v7 (#277)
* Update module go-redis/redis to v7 (#309)
* Update module go-testfixtures/testfixtures/v3 to v3.1.2 (#457)
* Update module go-testfixtures/testfixtures/v3 to v3.2.0 (#505)
* Update module imdario/mergo to v0.3.9 (#238)
* Update module labstack/echo/v4 to v4.1.16 (#241)
* Update module lib/pq to v1.4.0 (#428)
* Update module lib/pq to v1.5.0 (#476)
* Update module lib/pq to v1.5.1 (#485)
* Update module lib/pq to v1.5.2 (#491)
* Update module olekukonko/tablewriter to v0.0.4 (#240)
* Update module prometheus/client_golang to v0.9.4 (#245)
* Update module prometheus/client_golang to v1
* Update module prometheus/client_golang to v1.6.0 (#463)
* Update module spf13/cobra to v0.0.7 (#271)
* Update module spf13/viper to v1.6.2 (#272)
* Update module spf13/viper to v1.6.3 (#291)
* Update module spf13/viper to v1.7.0 (#494)
* Update module stretchr/testify to v1.5.1 (#274)
* Update Renovate Configuration (#161)
* Update src.techknowlogick.com/xgo commit hash to bb0faa3 (#279)
* Update src.techknowlogick.com/xgo commit hash to c43d4c4 (#224)
* Update xorm redis cacher to use the xorm logger instead of a special seperate one
* Update xorm to v1 (#323)
## [0.12] - 2020-04-04
#### Added
* Add support for archiving lists and namespaces (#152)
* Colors for lists and namespaces (#155)
* Add build time to compile flags
* Add proxying gravatar requests for user avatars (#148)
* Add empty avatar provider (#149)
* expand relative path ~/.config/vikunja to $HOME/.config/vikunja **WINDOWS** (#147)
* Show lists as archived if their namespace is archived
#### Fixed
* Workaround for timezones on windows (#151)
* Fix getting one namespace
* Fix getting the authenticated user with caldav
* Fix searching for config in home directories
* Fix updating lists with an identifier
#### Changed
* Change release bucket
## [0.11] - 2020-03-01
### Added
* Add config options for cors handling (#124)
* Add config options for task attachments (#125)
* Add generate as a make dependency for make build
* Add logging for invalid model errors (#126)
* Add more logging to web handler methods
* Add postgres support (#135)
* Add rate limit by ip for non-authenticated routes (#127)
* Better efficency for loading teams (#128)
* Expand relative path ~/.config/vikunja to $HOME/.config/vikunja (#146)
* Task Comments (#138)
### Fixed
* Fix typo in docker-compose example (#140)
* Fix frontend url for wunderlist migration in docs
* Fix inserting task structure with related tasks (#142)
* Fix time zone settings not working in Docker
* Fix updating dates when marking a task as done (#145)
* Make sure the author is returned when creating a new comment
* Remove double user field
### Changed
* Explicitly disable wunderlist migration by default (#141)
* Migration Improvements (#122)
* Refactor User and DB handling (#123)
* Return iso dates for everything date related from the api (#130)
* Update copyright header
* Update theme
* Update xorm to use the new import path (#133)
* Use relative url in .gitmodules (#132)
## [0.10] - 2020-01-19
### Added
* Migration (#120)
* Endpoint to get tasks on a list (#108)
* Sort Order for tasks (#110)
* Add files volume to docker compose docs
* Add motd config option to docs
* Add option to disable registration (#117)
* Add task identifier (#115)
* Add tests for md5 generation (#111)
* Add user token renew (#113)
### Fixed
* Fix new tasks not getting a new task index (#116)
* Fix owner field being null for user shared namespaces (#119)
* Fix passing sort_by and order_by as query path arrays
* Fix sorting tasks by bool values
* Fix task collection tests
* Consistent copyright text in file headers (#112)
### Changed
* Task collection improvements (#109)
* Update copyright year (#118)
* Update docs with a traefik configuration
* Use redis INCRBY and DECRBY when updating metrics values (#121)
* Use utf8mb4 instead of plain utf8 (#114)
* Update docs theme
## [0.9] - 2019-11-24
### Added
* Task Attachments (#104)
* Task Relations (#103)
* Add endpoint to get a single task (#106)
* Add file volume to the docker image
* Added extra depth to logging to correctly show the functions calling the logger in logs
* Added more infos to a link share auth (#98)
* Added percent done to tasks (#102)
### Fixed
* Fix default logging settings (#107)
* Fixed a bug where adding assignees or reminders via an update would re-create them and not respect already inserted ones, leaving a lot of garbage
* Fixed a bug where deleting an attachment would cause a nil panic
* Fixed building docs theme
* Fixed error when setting max file size on 32-Bit systems
* Fixed labels being displayed multiple times if they were associated with more than one task (#99)
* Fixed metrics on/off setting
* Fixed migration for task relations
* Fixed not getting all labels when retrieving a list with all tasks
* Fixed panic when using link share and metrics
* Fixed rate limit panic when authenticating with a link share auth token (#97)
* Fixed removing reminders
* Small link share fixes (#96)
### Changed
* Improve pagination (#105)
* Moved `teams_{namespace|list}_*` to `{namespace|list}_teams_*` for better consistency (#101)
* Refactored getting all lists for a namespace (#100)
* Refactored getting task IDs for labels
* Switched default logger to stdout instead of stderr
* update docs theme
### Misc
* Move from markdown lists to Vikunja for roadmap
## [0.8] - 2019-09-01
### Added
* Better Caldav support (#73)
* Added settings for max open/idle connections and max connection lifetime (#74)
* /info endpoint (#85)
* Added http endpoint to list all users on a list (#87)
* Rate limits (#91)
* Sharing of lists via public links (#94)
### Changed
* Reminders now use an extra table (#75)
* Use the username instead of a full user object when adding a user to a team or giving it rights (#76)
* Add the md5-hashed user email to user objects for use with gravatar (#78)
* Use the auth methods to get IDs to avoid unneeded casts
* Better config handling with constants (#83)
* Statically compile templates in the final binary (#84)
* Use longtext instead of varchar(1000) on description fields (#88)
* Logger refactoring (#90)
### Fixed
* Fixed `listID` not being returned in tasks
* Fixed tests (#72)
* Fixed metrics endpoint not working
* Fixed check if the user really exists before updating/deleting its rights (#77)
* Fixed duedate spelling issue (#79)
### Misc
* Integration tests (#71)
* Make sure the version works when building in drone
* Switched to another version of xgo
* Simplified the docker image (#80)
* Update echo (#82)
* Compress binaries after building them (#81)
* Simplify structure by having less files (#86)
* Limit the test pipeline to run only on pull requests (#89)
* GetUser now returns a pointer (#93)
* Refactor ListTask to Task (#92)
## [0.7] - 2019-04-05
### Added
* DB migrations (#67)
* More cli options for Vikunja (#66 #68)
* Use query params to sort tasks instead of url params (#61)
* More config paths (#55)
### Fixed
* Fixed Priority not updating when setting it to 0
* Fixed getting lists by namespace
* Fixed rights check (#70 #62)
* Fixed labels not being queried correctly on tasks
* Fixed bulk update label tasks
### Changed
* Hide a user's email address everywhere (#69)
* Refactored `canRead()` to get the list before checking rights #65
* Let rights methods return errors (#64 #63)
* Improved Swagger docs for label tasks
* Docs improvements (#58)
* Logging Handling (#57)
* Rights performance improvements (#54)
### Misc
* Releases also as Debian packages (#56)
## [0.6] - 2019-01-16
### Added
* Added prometheus endpoint to get metrics (#33)
* More unit tests (#34)
* Tests can now use config files (#36)
* Redoc for swagger ui (#39, #46)
* Start and end dates for tasks (#40)
* Get tasks between a date range (#41)
* Bulk edit for tasks (#42)
* More ci checks (#43)
* Task assignees (#44, #47)
* Task labels (#45, #48)
### Fixed
* Fixed path to get all tasks (echo bug)
* Explicitly get the peudonamespace with all shared lists (#32)
* Properly init tabels Redis
* unexpected EOF when using metrics (#35)
* Task sorting in lists (#36)
* Various user fixes (#38)
* Fixed a bug where updating a list would update it with the same values it had
### Changed
* Simplified list rights check (#50)
* Refactored some structs to not expose unneded values via json (#52)
### Misc
* Updated libraries
* Updated drone to version 1
* Releases are now signed with our pgp key (more info about this on [the download page](https://vikunja.io/en/download/)).
## [0.5] - 2018-12-02
### Added
* Shared lists are now shown in a pseudonamespace with all other namespaces, has the ID -1
* Tasks can have multiple reminders
* Tasks can have subtasks. Subtasks are fully-fleged tasks, but not shown in the task list of a list.
* Tasks can have priorities
### Changed
* Validation not so verbose anymore
* [License](https://git.kolaente.de/vikunja/api/src/branch/master/LICENSE) is now GPLv3
* The crudhandler now has its [own repo](https://git.kolaente.de/vikunja/web) - you can use it in your own projects!
## [0.4] - 2018-11-16
#### Added
* Get all tasks for the authenticated user sorted by their due date
* CalDAV support
* Pagination for everything which returns an array
* Search all the things
* More validation for most of the structs
* Improved Swagger docs (available on `/api/v1/swagger`)
## [0.3] - 2018-11-02
### Added
* Password reset
* Email verification when registering
Misc bugfixes and improvements to the build process
## [0.2] - 2018-10-17
## [0.1] - 2018-09-20
+51
View File
@@ -0,0 +1,51 @@
##############
# Build stage
FROM golang:1-alpine AS build-env
ARG VIKUNJA_VERSION
ENV TAGS "sqlite"
ENV GO111MODULE=on
# Build deps
RUN apk --no-cache add build-base git
# Setup repo
COPY . ${GOPATH}/src/code.vikunja.io/api
WORKDIR ${GOPATH}/src/code.vikunja.io/api
# Checkout version if set
RUN if [ -n "${VIKUNJA_VERSION}" ]; then git checkout "${VIKUNJA_VERSION}"; fi \
&& go install github.com/magefile/mage \
&& mage build:clean build:build
###################
# The actual image
# Note: I wanted to use the scratch image here, but unfortunatly the go-sqlite bindings require cgo and
# because of this, the container would not start when I compiled the image without cgo.
FROM alpine:3.12
LABEL maintainer="maintainers@vikunja.io"
WORKDIR /app/vikunja/
COPY --from=build-env /go/src/code.vikunja.io/api/vikunja .
ENV VIKUNJA_SERVICE_ROOTPATH=/app/vikunja/
# Dynamic permission changing stuff
ENV PUID 1000
ENV PGID 1000
RUN apk --no-cache add shadow && \
addgroup -g ${PGID} vikunja && \
adduser -s /bin/sh -D -G vikunja -u ${PUID} vikunja -h /app/vikunja -H && \
chown vikunja -R /app/vikunja
COPY run.sh /run.sh
# Fix time zone settings not working
RUN apk --no-cache add tzdata
# Files permissions
RUN mkdir /app/vikunja/files && \
chown -R vikunja /app/vikunja/files
VOLUME /app/vikunja/files
CMD ["/run.sh"]
EXPOSE 3456
+1 -2
View File
@@ -671,5 +671,4 @@ into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+71 -18
View File
@@ -1,27 +1,80 @@
# Vikunja desktop
<img src="https://vikunja.io/images/vikunja-logo.svg" alt="" style="display: block;width: 50%;margin: 0 auto;" width="50%"/>
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/desktop/status.svg)](https://drone.kolaente.de/vikunja/desktop)
[![Build Status](https://drone1.kolaente.de/api/badges/vikunja/api/status.svg)](https://drone1.kolaente.de/vikunja/api)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](LICENSE)
[![Download](https://img.shields.io/badge/download-v0.21.0-brightgreen.svg)](https://dl.vikunja.io)
[![Download](https://img.shields.io/badge/download-v0.15.0-brightgreen.svg)](https://dl.vikunja.io)
[![Docker Pulls](https://img.shields.io/docker/pulls/vikunja/api.svg)](https://hub.docker.com/r/vikunja/api/)
[![Swagger Docs](https://img.shields.io/badge/swagger-docs-brightgreen.svg)](https://try.vikunja.io/api/v1/docs)
[![Go Report Card](https://goreportcard.com/badge/git.kolaente.de/vikunja/api)](https://goreportcard.com/report/git.kolaente.de/vikunja/api)
The Vikunja frontend all repackaged as an electron app to run as a desktop app!
# Vikunja API
## Dev
> The Todo-app to organize your life.
As this repo does not contain any code, only a thin wrapper around electron, you will need to do this to get the
actual frontend bundle and build the app:
# Table of contents
```bash
rm -rf frontend vikunja-frontend-master.zip
wget https://dl.vikunja.io/frontend/vikunja-frontend-master.zip
unzip vikunja-frontend-master.zip -d frontend
sed -i 's/\/api\/v1//g' frontend/index.html # Make sure to trigger the "enter the Vikunja url" prompt
```
* [Features](#features)
* [Docs](#docs)
* [Roadmap](#roadmap)
* [Contributing](#contributing)
* [License](#license)
## Building for release
## Features
1. Run the snippet from above, but with a valid frontend version instead of `master`
2. Change the version in `package.json` (That's the one that will be used by electron-builder`
3. `yarn install`
4. `yarn dist --linux --windows`
* Create TODO lists with tasks
* Reminder for tasks
* Namespaces: A "group" which bundels multiple lists
* Share lists and namespaces with teams and users with granular permissions
* Plenty of details for tasks
See [the features page](https://vikunja.io/en/features/) on our website for a more exaustive list or
try it on [try.vikunja.io](https://try.vikunja.io)!
## Docs
* [Installing](https://vikunja.io/docs/installing/)
* [Build from source](https://vikunja.io/docs/build-from-sources/)
* [Development setup](https://vikunja.io/docs/development/)
* [Magefile](https://vikunja.io/docs/mage/)
* [Testing](https://vikunja.io/docs/testing/)
All docs can be found on [the vikunja home page](https://vikunja.io/docs/).
### Roadmap
> I know, it's still a long way to go. I'm currently working on a lot of "basic" features, the exiting things will come later. Don't worry, they'll come.
* [x] Prioritize tasks
* [x] Subtasks
* [x] Repeating tasks
* [x] Get tasks via caldav
* [x] Get all your tasks for an interval (day/month/period)
* [x] Labels for tasks
* [x] Assign users to tasks
* [x] Attachments on tasks
* [x] More sharing features
* [x] Share with individual users
* [x] Share via a world-readable link with or without password, like Nextcloud
* [x] Disable registration, making an instance "invite-only"
* [ ] SSE to notify multiple clients of updates when something was changed
* [ ] "Smart Lists" - Create lists based on filters
* [ ] IMAP-Integration - Send an email to Vikunja to create a new task
* [ ] Webhooks - Trigger other events when an action is done (like completing a task)
* [ ] Performace statistics - Get an overview and beautiful charts about what you got done this month
* [ ] Activity feeds - Get a quick overview about who did what
* [ ] Bulk-edit multiple tasks at once
* [ ] Team-efforts - Requiring a task to be marked as done by multiple members until it's done
* [ ] Global limits for namespaces/lists/tasks
See [our roadmap](https://my.vikunja.cloud/share/QFyzYEmEYfSyQfTOmIRSwLUpkFjboaBqQCnaPmWd/auth) (hosted on Vikunja!) for even more!
* [ ] [Mobile apps](https://code.vikunja.io/app) (seperate repo) *In Progress*
* [ ] [Webapp](https://code.vikunja.io/frontend) (seperate repo) *In Progress*
## Contributing
Fork -> Push -> Pull-Request. Also see the [dev docs](https://vikunja.io/docs/development/) for more infos.
## License
This project is licensed under the GPLv3 License. See the [LICENSE](LICENSE) file for the full license text.
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
curl -X POST http://localhost:3456/api/v1/register -H 'Content-Type: application/json' -d '{"username":"demo","password":"demo","email":"demo@vikunja.io"}'
BEARER=`curl -X POST -H 'Content-Type: application/json' -d '{"username": "demo", "password":"demo"}' localhost:3456/api/v1/login | jq -r '.token'`
echo "Bearer: $BEARER"
curl -X POST localhost:3456/api/v1/tokenTest -H "Authorization: Bearer $BEARER"
curl -X PUT localhost:3456/api/v1/namespaces/1/lists -H 'Content-Type: application/json' -H "Authorization: Bearer $BEARER" -d '{"title":"lorem"}'
curl -X PUT localhost:3456/api/v1/lists/1 -H 'Content-Type: application/json' -H "Authorization: Bearer $BEARER" -d '{"text":"lorem"}'
curl -X PUT -H "Authorization: Bearer $BEARER" localhost:3456/api/v1/tasks/1/attachments -F 'files=@/home/konrad/Pictures/Wallpaper/greg-rakozy-_Q4mepyyjMw-unsplash.jpg'
+29
View File
@@ -0,0 +1,29 @@
### Authorization by token, part 1. Retrieve and save token.
POST http://localhost:8080/api/v1/login
Content-Type: application/json
{
"username": "user3",
"password": "1234"
}
> {% client.global.set("auth_token", response.body.token); %}
### Register
POST http://localhost:8080/api/v1/register
Content-Type: application/json
{
"username": "user",
"password": "1234",
"email": "5@knt.li"
}
###
# Token test
POST http://localhost:8080/api/v1/tokenTest
Authorization: Bearer {{auth_token}}
Content-Type: application/json
###
+70
View File
@@ -0,0 +1,70 @@
# Get all labels
GET http://localhost:8080/api/v1/labels
Authorization: Bearer {{auth_token}}
###
# Add a new label
PUT http://localhost:8080/api/v1/labels
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"title": "test5"
}
###
# Delete a label
DELETE http://localhost:8080/api/v1/labels/6
Authorization: Bearer {{auth_token}}
###
# Update a label
POST http://localhost:8080/api/v1/labels/1
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"title": "testschinkenbrot",
"description": "käsebrot"
}
###
# Get one label
GET http://localhost:8080/api/v1/labels/1
Authorization: Bearer {{auth_token}}
###
# Get all labels on a task
GET http://localhost:8080/api/v1/tasks/3565/labels
Authorization: Bearer {{auth_token}}
###
# Add a new label to a task
PUT http://localhost:8080/api/v1/tasks/35236365/labels
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"label_id": 1
}
###
# Delete a label from a task
DELETE http://localhost:8080/api/v1/tasks/3565/labels/1
Authorization: Bearer {{auth_token}}
###
# Add a new label to a task
POST http://localhost:8080/api/v1/tasks/3565/labels/bulk
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"labels": [
{"id": 1},
{"id": 2},
{"id": 3}
]
}
###
+177
View File
@@ -0,0 +1,177 @@
# Get all lists
GET http://localhost:8080/api/v1/namespaces/35/lists
Authorization: Bearer {{auth_token}}
###
# Get one list
GET http://localhost:8080/api/v1/lists/3
Authorization: Bearer {{auth_token}}
###
# Add a new list
PUT http://localhost:8080/api/v1/namespaces/35/lists
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"title": "test"
}
###
# Add a new item
PUT http://localhost:8080/api/v1/lists/1
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"text": "Task",
"description": "Schinken"
}
###
# Delete a task from a list
DELETE http://localhost:8080/api/v1/lists/14
Authorization: Bearer {{auth_token}}
###
# Get all teams who have access to that list
GET http://localhost:8080/api/v1/lists/28/teams
Authorization: Bearer {{auth_token}}
###
# Give a team access to that list
PUT http://localhost:8080/api/v1/lists/1/teams
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"team_id":2, "right": 1}
###
# Update a teams access to that list
POST http://localhost:8080/api/v1/lists/1/teams/2
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"right": 0}
###
# Delete a team from a list
DELETE http://localhost:8080/api/v1/lists/10235/teams/1
Authorization: Bearer {{auth_token}}
###
# Delete a team from a list
DELETE http://localhost:8080/api/v1/lists/10235/teams/1
Authorization: Bearer {{auth_token}}
###
# Get all users who have access to that list
GET http://localhost:8080/api/v1/lists/28/users
Authorization: Bearer {{auth_token}}
###
# Give a user access to that list
PUT http://localhost:8080/api/v1/lists/3/users
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"userID":"user4", "right":1}
###
# Update a users access to that list
POST http://localhost:8080/api/v1/lists/30/users/3
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"right":2}
###
# Delete a user from a list
DELETE http://localhost:8080/api/v1/lists/28/users/3
Authorization: Bearer {{auth_token}}
###
# Get all pending tasks
GET http://localhost:8080/api/v1/tasks/all
Authorization: Bearer {{auth_token}}
###
# Get all pending tasks with priorities
GET http://localhost:8080/api/v1/tasks/all?sort=priorityasc
Authorization: Bearer {{auth_token}}
###
# Get all pending tasks in a range
GET http://localhost:8080/api/v1/tasks/all/dueadateasc/1546784000/1548784000
Authorization: Bearer {{auth_token}}
###
# Get all pending tasks in caldav
GET http://localhost:8080/api/v1/tasks/caldav
#Authorization: Bearer {{auth_token}}
###
# Update a task
POST http://localhost:8080/api/v1/tasks/3565
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"priority": 0
}
###
# Bulk update multiple tasks at once
POST http://localhost:8080/api/v1/tasks/bulk
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"task_ids": [3518,3519,3521],
"text":"bulkupdated"
}
###
# Get all assignees
GET http://localhost:8080/api/v1/tasks/3565/assignees
Authorization: Bearer {{auth_token}}
###
# Add a bunch of assignees
PUT http://localhost:8080/api/v1/tasks/3565/assignees/bulk
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"assignees": [
{"id": 17}
]
}
###
# Get all users who have access to a list
GET http://localhost:8080/api/v1/lists/3/users
Authorization: Bearer {{auth_token}}
###
+71
View File
@@ -0,0 +1,71 @@
# Get all namespaces
GET http://localhost:8080/api/v1/namespaces
Authorization: Bearer {{auth_token}}
###
# Get one namespaces
GET http://localhost:8080/api/v1/namespaces/-1
Authorization: Bearer {{auth_token}}
###
# Get all users who have access to that namespace
GET http://localhost:8080/api/v1/namespaces/12/users
Authorization: Bearer {{auth_token}}
###
# Give a user access to that namespace
PUT http://localhost:8080/api/v1/namespaces/1/users
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"user_id":3, "right": 0}
###
# Update a users access to that namespace
POST http://localhost:8080/api/v1/namespaces/1/users/3
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"right": 2}
###
# Delete a user from a namespace
DELETE http://localhost:8080/api/v1/namespaces/1/users/2
Authorization: Bearer {{auth_token}}
###
# Get all teams who have access to that namespace
GET http://localhost:8080/api/v1/namespaces/1/teams
Authorization: Bearer {{auth_token}}
###
# Give a team access to that namespace
PUT http://localhost:8080/api/v1/namespaces/1/teams
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"team_id":3, "right": 0}
###
# Update a teams access to that namespace
POST http://localhost:8080/api/v1/namespaces/1/teams/1
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{"right": 0}
###
# Delete a team from a namespace
DELETE http://localhost:8080/api/v1/namespaces/1/teams/2
Authorization: Bearer {{auth_token}}
###
+29
View File
@@ -0,0 +1,29 @@
# Get all teams
GET http://localhost:8080/api/v1/teams
Authorization: Bearer {{auth_token}}
###
# Get one team
GET http://localhost:8080/api/v1/teams/28
Authorization: Bearer {{auth_token}}
###
# Add a new member to that team
PUT http://localhost:8080/api/v1/teams/28/members
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"user_id": 2
}
###
# Delete a member from a team
DELETE http://localhost:8080/api/v1/teams/28/members/2
Authorization: Bearer {{auth_token}}
###
+53
View File
@@ -0,0 +1,53 @@
# Get all users
GET http://localhost:8080/api/v1/user
Authorization: Bearer {{auth_token}}
######
# Search for a user
GET http://localhost:8080/api/v1/users?s=3
Authorization: Bearer {{auth_token}}
###
## Update password
POST http://localhost:8080/api/v1/user/password
Authorization: Bearer {{auth_token}}
Content-Type: application/json
{
"old_password": "1234",
"new_password": "1234"
}
### Request a password to reset a password
POST http://localhost:8080/api/v1/user/password/token
Content-Type: application/json
Accept: application/json
{
"email": "k@knt.li"
}
### Request a token to reset a password
POST http://localhost:8080/api/v1/user/password/reset
Content-Type: application/json
Accept: application/json
{
"token": "eAsZzakgqARnjzXHqsHqZtSUKuiOhoJjHANhgTxUIDBSalhbtdpAdLeywGXzVDBuRQGNpHdMxoHXhLVSlzpJsFvuoJgMdkhRhkNhaQXfufuZCdtUlerZHSJQLgYMUryHIxIREcmZLtWoZVrYyARkCvkyFhcGtoCwQOEjAOEZMQQuxTVoGYfAqcfNggQnerUcXCiRIgRtkusXSnltomhaeyRwAbrckXFeXxUjslgplSGqSTOqJTYuhrSzAVTwNvuYyvuXLaZoNnJEyeVDWlRydnxfgUQjQZOKwCBRWVQPKpZhlslLUyUAMsRQkHITkruQCjDnOGCCRsSNplbNCEuDmMfpWYHSQAcQIDZtbQWkxzpfmHDMQvvKPPrxEnrTErlvTfKDKICFYPQxXNpNE",
"new_password": "1234"
}
### Confirm a users email address
POST http://localhost:8080/api/v1/user/confirm
Content-Type: application/json
Accept: application/json
{
"token": ""
}
###
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
# Fix the config to contain proper values
NEW_SECRET=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
sed -i "s/<jwt-secret>/$NEW_SECRET/g" /etc/vikunja/config.yml
sed -i "s/<rootpath>/\/opt\/vikunja\//g" /etc/vikunja/config.yml
sed -i "s/Path: \"\.\/vikunja.db\"/Path: \"\\/opt\/vikunja\/vikunja.db\"/g" /etc/vikunja/config.yml
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

+8
View File
@@ -0,0 +1,8 @@
Origin: dl.vikunja.io
Label: Vikunja
Codename: strech
Architectures: amd64
Components: main
Description: The debian repo for Vikunja builds.
SignWith: yes
Pull: strech
-59
View File
@@ -1,59 +0,0 @@
[changelog]
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits
| filter(attribute="scope")
| sort(attribute="scope") %}
* *({{commit.scope}})* {{ commit.message | upper_first }}
{%- if commit.breaking %}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{%- endfor -%}
{%- for commit in commits %}
{%- if commit.scope -%}
{% else -%}
* {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ commit.id }}))
{% if commit.breaking -%}
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{% endif -%}
{% endif -%}
{% endfor -%}
{% raw %}\n{% endraw %}\
{% endfor %}\n
"""
#{% for group, commits in commits | group_by(attribute="group") %}
# ### {{ group | upper_first }}
# {% for commit in commits %}\
# - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ commit.id }}))
# {% endfor %}\
#{% endfor %}\n
# remove the leading and trailing whitespace from the template
trim = true
[git]
conventional_commits = true
filter_unconventional = false
commit_parsers = [
{ message = ".*(deps).*", group = "Dependencies"},
{ message = "^feat", group = "Features"},
{ message = "^fix", group = "Bug Fixes"},
{ message = "^doc", group = "Documentation"},
{ message = "^perf", group = "Performance"},
{ message = "^refactor", group = "Refactor"},
{ message = "^style", group = "Styling"},
{ message = "^test", group = "Testing"},
{ message = "^chore\\(release\\): prepare for", skip = true},
{ message = "^chore", group = "Miscellaneous Tasks"},
{ body = ".*security", group = "Security"},
{ message = ".*", group = "Other", default_scope = "other"}, # Everything that's not a conventional commit goes into the "Other" category
]
+15
View File
@@ -0,0 +1,15 @@
Vikunja is a to-do list application to facilitate your life.
Copyright 2018-2020 Vikunja and contributors. All rights reserved.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
+217
View File
@@ -0,0 +1,217 @@
service:
# This token is used to verify issued JWT tokens.
# Default is a random token which will be generated at each startup of vikunja.
# (This means all already issued tokens will be invalid once you restart vikunja)
JWTSecret: "<jwt-secret>"
# The interface on which to run the webserver
interface: ":3456"
# The URL of the frontend, used to send password reset emails.
frontendurl: ""
# The base path on the file system where the binary and assets are.
# Vikunja will also look in this path for a config file, so you could provide only this variable to point to a folder
# with a config file which will then be used.
rootpath: <rootpath>
# The max number of items which can be returned per page
maxitemsperpage: 50
# If set to true, enables a /metrics endpoint for prometheus to collect metrics about the system
# You'll need to use redis for this in order to enable common metrics over multiple nodes
enablemetrics: false
# Enable the caldav endpoint, see the docs for more details
enablecaldav: true
# Set the motd message, available from the /info endpoint
motd: ""
# Enable sharing of lists via a link
enablelinksharing: true
# Whether to let new users registering themselves or not
enableregistration: true
# Whether to enable task attachments or not
enabletaskattachments: true
# The time zone all timestamps are in
timezone: GMT
# Whether task comments should be enabled or not
enabletaskcomments: true
# Whether totp is enabled. In most cases you want to leave that enabled.
enabletotp: true
# If not empty, enables logging of crashes and unhandled errors in sentry.
sentrydsn: ''
database:
# Database type to use. Supported types are mysql, postgres and sqlite.
type: "sqlite"
# Database user which is used to connect to the database.
user: "vikunja"
# Databse password
password: ""
# Databse host
host: "localhost"
# Databse to use
database: "vikunja"
# When using sqlite, this is the path where to store the data
path: "./vikunja.db"
# Sets the max open connections to the database. Only used when using mysql and postgres.
maxopenconnections: 100
# Sets the maximum number of idle connections to the db.
maxidleconnections: 50
# The maximum lifetime of a single db connection in miliseconds.
maxconnectionlifetime: 10000
# Secure connection mode. Only used with postgres.
# (see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters)
sslmode: disable
cache:
# If cache is enabled or not
enabled: false
# Cache type. Possible values are "keyvalue", "memory" or "redis".
# When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section.
# When choosing "redis" you will need to configure the redis connection seperately.
type: keyvalue
# When using memory this defines the maximum size an element can take
maxelementsize: 1000
redis:
# Whether to enable redis or not
enabled: false
# The host of the redis server including its port.
host: 'localhost:6379'
# The password used to authenicate against the redis server
password: ''
# 0 means default database
db: 0
cors:
# Whether to enable or disable cors headers.
# Note: If you want to put the frontend and the api on seperate domains or ports, you will need to enable this.
# Otherwise the frontend won't be able to make requests to the api through the browser.
enable: true
# A list of origins which may access the api.
origins:
- "*"
# How long (in seconds) the results of a preflight request can be cached.
maxage: 0
mailer:
# Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible.
enabled: false
# SMTP Host
host: ""
# SMTP Host port
port: 587
# SMTP username
username: "user"
# SMTP password
password: ""
# Wether to skip verification of the tls certificate on the server
skiptlsverify: false
# The default from address when sending emails
fromemail: "mail@vikunja"
# The length of the mail queue.
queuelength: 100
# The timeout in seconds after which the current open connection to the mailserver will be closed.
queuetimeout: 30
# By default, vikunja will try to connect with starttls, use this option to force it to use ssl.
forcessl: false
log:
# A folder where all the logfiles should go.
path: <rootpath>logs
# Whether to show any logging at all or none
enabled: true
# Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging.
standard: "stdout"
# Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
level: "INFO"
# Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging.
database: "off"
# The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
databaselevel: "WARNING"
# Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging.
http: "stdout"
# Echo has its own logging which usually is unnessecary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging.
echo: "off"
ratelimit:
# whether or not to enable the rate limit
enabled: false
# The kind on which rates are based. Can be either "user" for a rate limit per user or "ip" for an ip-based rate limit.
kind: user
# The time period in seconds for the limit
period: 60
# The max number of requests a user is allowed to do in the configured time period
limit: 100
# The store where the limit counter for each user is stored.
# Possible values are "keyvalue", "memory" or "redis".
# When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section.
store: keyvalue
files:
# The path where files are stored
basepath: ./files # relative to the binary
# The maximum size of a file, as a human-readable string.
# Warning: The max size is limited 2^64-1 bytes due to the underlying datatype
maxsize: 20MB
migration:
# These are the settings for the wunderlist migrator
wunderlist:
# Wheter to enable the wunderlist migrator or not
enable: false
# The client id, required for making requests to the wunderlist api
# You need to register your vikunja instance at https://developer.wunderlist.com/apps/new to get this
clientid:
# The client secret, also required for making requests to the wunderlist api
clientsecret:
# The url where clients are redirected after they authorized Vikunja to access their wunderlist stuff.
# This needs to match the url you entered when registering your Vikunja instance at wunderlist.
# This is usually the frontend url where the frontend then makes a request to /migration/wunderlist/migrate
# with the code obtained from the wunderlist api.
# Note that the vikunja frontend expects this to be /migrate/wunderlist
redirecturl:
todoist:
# Wheter to enable the todoist migrator or not
enable: false
# The client id, required for making requests to the wunderlist api
# You need to register your vikunja instance at https://developer.todoist.com/appconsole.html to get this
clientid:
# The client secret, also required for making requests to the todoist api
clientsecret:
# The url where clients are redirected after they authorized Vikunja to access their todoist items.
# This needs to match the url you entered when registering your Vikunja instance at todoist.
# This is usually the frontend url where the frontend then makes a request to /migration/todoist/migrate
# with the code obtained from the todoist api.
# Note that the vikunja frontend expects this to be /migrate/todoist
redirecturl:
avatar:
# When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires
gravatarexpiration: 3600
backgrounds:
# Whether to enable backgrounds for lists at all.
enabled: true
providers:
upload:
# Whethere to enable uploaded list backgrounds
enabled: true
unsplash:
# Whether to enable setting backgrounds from unsplash as list backgrounds
enabled: false
# You need to create an application for your installation at https://unsplash.com/oauth/applications/new
# and set the access token below.
accesstoken:
# The unsplash application id is only used for pingback and required as per their api guidelines.
# You can find the Application ID in the dashboard for your API application. It should be a numeric ID.
# It will only show in the UI if your application has been approved for Enterprise usage, therefore if
# you’re in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id
applicationid:
# Legal urls
# Will be shown in the frontend if configured here
legal:
imprinturl:
privacyurl:
# Key Value Storage settings
# The Key Value Storage is used for different kinds of things like metrics and a few cache systems.
keyvalue:
# The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately.
type: "memory"
-9
View File
@@ -1,9 +0,0 @@
{ pkgs ? import <nixpkgs> {}
}:
pkgs.mkShell {
name="electron-dev";
buildInputs = [
pkgs.electron
];
}
+18
View File
@@ -0,0 +1,18 @@
image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
-
image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64
platform:
architecture: amd64
os: linux
-
image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm
platform:
architecture: arm
os: linux
+3
View File
@@ -0,0 +1,3 @@
FROM nginx
ADD public /usr/share/nginx/html/docs
ADD nginx.conf /etc/nginx/conf.d/default.conf
+47
View File
@@ -0,0 +1,47 @@
baseurl: https://vikunja.io/docs/
title: Vikunja
theme: vikunja
enableRobotsTXT: true
canonifyURLs: true
pygmentsUseClasses: true
permalinks:
post: /:year/:month/:title/
doc: /:slug/
page: /:slug/
default: /:slug/
params:
description: The to-do app to organize your life
author: The Vikunja Authors
website: https://vikunja.io
plausibleEnabled: true
plausibleDomain: vikunja.io
plausibleURL: https://analytics.kolaente.de
markup:
goldmark:
renderer:
unsafe: true
menu:
page:
- name: Home
url: https://vikunja.io/en/
weight: 10
- name: Features
url: https://vikunja.io/en/features
weight: 20
- name: Download
url: https://vikunja.io/en/download
weight: 30
- name: Docs
url: https://vikunja.io/docs
weight: 40
- name: Code
url: https://code.vikunja.io/
weight: 50
- name: Community
url: https://community.vikunja.io/
weight: 60
+25
View File
@@ -0,0 +1,25 @@
---
date: "2019-02-12:00:00+02:00"
title: "Docs"
draft: false
url: "/docs"
type: "doc"
weight: 10
---
# Documentation
This is the documentation for Vikunja.
You can find available articles in the menu on the left.
## About
To learn more about the what, why and how, take a look at [the features page](https://vikunja.io/en/features).
## Start
A good starting point if you want to install and host Vikunja on your server are [the install documentation]({{< ref "./setup/install.md">}})
and [available configuration options]({{< ref "./setup/config.md">}}).
## Developing
If you want to start contributing to Vikunja, take a look at [the development docs]({{< ref "./development/development.md">}}).
+34
View File
@@ -0,0 +1,34 @@
---
date: "2019-03-31:00:00+01:00"
title: "Adding new cli commands"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Adding new cli commands
All cli-related functions are located in `pkg/cmd`.
Each cli command usually calls a function in another package.
For example, the `vikunja migrate` command calls `migration.Migrate()`.
Vikunja uses the amazing [cobra](https://github.com/spf13/cobra) library for its cli.
Please refer to its documentation for informations about how to use flags etc.
To add a new cli command, add something like the following:
{{< highlight golang >}}
func init() {
rootCmd.AddCommand(myCmd)
}
var myCmd = &cobra.Command{
Use: "My-command",
Short: "A short description about your command.",
Run: func(cmd *cobra.Command, args []string) {
// Call other functions
},
}
{{</ highlight >}}
@@ -0,0 +1,73 @@
---
date: "2019-03-29:00:00+02:00"
title: "Database migrations"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Database Migrations
Vikunja runs all database migrations automatically on each start if needed.
Additionally, they can also be run directly by using the `migrate` command.
We use [xormigrate](https://github.com/techknowlogick/xormigrate) to handle migrations,
which is based on gormigrate.
{{< table_of_contents >}}
## Add a new migration
All migrations are stored in `pkg/migrations` and files should have the same name as their id.
Each migration should have a function to apply and roll it back, as well as a numeric id (the datetime)
and a more in-depth description of what the migration actually does.
To easily get a new id, run the following on any unix system:
{{< highlight bash >}}
date +%Y%m%d%H%M%S
{{< /highlight >}}
New migrations should be added via the `init()` function to the `migrations` variable.
All migrations are sorted before being executed, since `init()` does not guarantee the order.
When you're adding a new struct, you also need to add it to the `models.GetTables()` function
to ensure it will be created on new installations.
### Example
{{< highlight golang >}}
package migration
import (
"github.com/go-xorm/xorm"
"src.techknowlogick.com/xormigrate"
)
// Used for rollback
type teamMembersMigration20190328074430 struct {
Updated int64 `xorm:"updated"`
}
func (teamMembersMigration20190328074430) TableName() string {
return "team_members"
}
func init() {
migrations = append(migrations, &xormigrate.Migration{
ID: "20190328074430",
Description: "Remove updated from team_members",
Migrate: func(tx *xorm.Engine) error {
return dropTableColum(tx, "team_members", "updated")
},
Rollback: func(tx *xorm.Engine) error {
return tx.Sync2(teamMembersMigration20190328074430{})
},
})
}
{{< /highlight >}}
You should always copy the changed parts of the struct you're changing when adding migraitons.
@@ -0,0 +1,67 @@
---
date: "2019-02-12:00:00+02:00"
title: "Development"
toc: true
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
name: "Development"
---
# Development
We use go modules to vendor libraries for Vikunja, so you'll need at least go `1.11` to use these.
If you don't intend to add new dependencies, go `1.9` and above should be fine.
To contribute to Vikunja, fork the project and work on the master branch.
A lot of developing tasks are automated using a Magefile, so make sure to [take a look at it]({{< ref "mage.md">}}).
{{< table_of_contents >}}
## Libraries
We keep all libraries used for Vikunja around in the `vendor/` folder to still be able to build the project even if
some maintainers take their libraries down like [it happened in the past](https://github.com/jteeuwen/go-bindata/issues/5).
## Tests
See [testing]({{< ref "test.md">}}).
#### Development using go modules
If you're able to use go modules, you can clone the project wherever you want to and work from there.
#### Development-setup without go modules
Some internal packages are referenced using their respective package URL. This can become problematic.
To “trick” the Go tool into thinking this is a clone from the official repository, download the source code
into `$GOPATH/code.vikunja.io/api`. Fork the Vikunja repository, it should then be possible to switch the source directory on the command line.
{{< highlight bash >}}
cd $GOPATH/src/code.vikunja.io/api
{{< /highlight >}}
To be able to create pull requests, the forked repository should be added as a remote to the Vikunja sources, otherwise changes can’t be pushed.
{{< highlight bash >}}
git remote rename origin upstream
git remote add origin git@git.kolaente.de:<USERNAME>/api.git
git fetch --all --prune
{{< /highlight >}}
This should provide a working development environment for Vikunja. Take a look at the Magefile to get an overview about
the available tasks. The most common tasks should be `mage test:unit` which will start our test environment and `mage build:build`
which will build a vikunja binary into the working directory. Writing test cases is not mandatory to contribute, but it
is highly encouraged and helps developers sleep at night.
That’s it! You are ready to hack on Vikunja. Test changes, push them to the repository, and open a pull request.
## Static assets
Each Vikunja release contains all static assets directly compiled into the binary.
To prevent this during development, use the `dev` tag when developing.
See the [mage docs](mage.md#statically-compile-all-templates-into-the-binary) about how to compile with static assets for a release.
+192
View File
@@ -0,0 +1,192 @@
---
date: "2019-02-12:00:00+02:00"
title: "Magefile"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Mage
Vikunja uses [Mage](https://magefile.org/) to script common development tasks and even releasing.
Mage is a pure go solution which allows for greater flexibility and things like better paralelization.
This document explains what taks are available and what they do.
{{< table_of_contents >}}
## Installation
To use mage, you'll need to install the mage cli.
To install it, run the following command:
```
go install github.com/magefile/mage
```
## Categories
There are multiple categories of subcommands in the magefile:
* `build`: Contains commands to build a single binary
* `check`: Contains commands to statically check the source code
* `release`: Contains commands to release Vikunja with everything that's required
* `test`: Contains commands to run all kinds of tests
* `dev`: Contains commands to run development tasks
* `misc`: Commands which do not belong in either of the other categories
## CI
These tasks are automatically run in our CI every time someone pushes to master or you update a pull request:
* `mage check:lint`
* `mage check:fmt`
* `mage check:ineffassign`
* `mage check:misspell`
* `mage check:goconst`
* `mage build:generate`
* `mage build:build`
## Build
### Build Vikunja
{{< highlight bash >}}
mage build:build
{{< /highlight >}}
Builds a `vikunja`-binary in the root directory of the repo for the platform it is run on.
### Statically compile all templates into the binary
{{< highlight bash >}}
mage build:generate
{{< /highlight >}}
This generates static code with all templates, meaning no template need to be referenced at runtime.
### clean
{{< highlight bash >}}
mage build:clean
{{< /highlight >}}
Cleans all build, executable and bindata files
## Check
All check sub-commands exit with a status code of 1 if the check fails.
Various code-checks are available:
* `mage check:all`: Runs fmt-check, lint, got-swag, misspell-check, ineffasign-check, gocyclo-check, static-check, gosec-check, goconst-check all in parallel
* `mage check:fmt`: Checks if the code is properly formatted with go fmt
* `mage check:go-sec`: Checks the source code for potential security issues by scanning the Go AST using the [gosec tool](https://github.com/securego/gosec)
* `mage check:goconst`: Checks for repeated strings that could be replaced by a constant using [goconst](https://github.com/jgautheron/goconst/)
* `mage check:gocyclo`: Checks for the cyclomatic complexity of the source code using [gocyclo](https://github.com/fzipp/gocyclo)
* `mage check:got-swag`: Checks if the swagger docs need to be re-generated from the code annotations
* `mage check:ineffassign`: Checks the source code for ineffectual assigns using [ineffassign](https://github.com/gordonklaus/ineffassign)
* `mage check:lint`: Runs golint on all packages
* `mage check:misspell`: Checks the source code for misspellings
* `mage check:static`: Statically analyzes the source code about a range of different problems using [staticcheck](https://staticcheck.io/docs/)
## Release
### Build Releases
{{< highlight bash >}}
mage release
{{< /highlight >}}
Builds binaries for all platforms and zips them with a copy of the `templates/` folder.
All built zip files are stored into `dist/zips/`. Binaries are stored in `dist/binaries/`,
binaries bundled with `templates` are stored in `dist/releases/`.
All cross-platform binaries built using this series of commands are built with the help of
[xgo](https://github.com/techknowlogick/xgo). The mage command will automatically install the
binary to be able to use it.
`mage release:release` is a shortcut to execute `mage release:dirs release:windows release:linux release:darwin release:copy release:check release:os-package release:zip`.
* `mage release:dirs` creates all directories needed
* `mage release:windows`/`release:linux`/`release:darwin` execute xgo to build for their respective platforms
* `mage release:copy` bundles binaries with a copy of the `LICENSE` and sample config files to then be zipped
* `mage release:check` creates sha256 checksums for each binary which will be included in the zip file
* `mage release:os-package` bundles a binary with the `sha256` checksum file, a sample `config.yml` and a copy of the license in a folder for each architecture
* `mage release:compress` compresses all build binaries with `upx` to save space
* `mage release:zip` paclages a zip file for the files created by `release:os-package`
### Build os packages
{{< highlight bash >}}
mage release:packages
{{< /highlight >}}
Will build `.deb`, `.rpm` and `.apk` packages to `dist/os-packages`.
### Make a debian repo
{{< highlight bash >}}
mage release:reprepro
{{< /highlight >}}
Takes an already built debian package and creates a debian repo structure around it.
Used to be run inside a [docker container](https://git.kolaente.de/konrad/reprepro-docker) in the CI process when releasing.
## Test
### unit
{{< highlight bash >}}
mage test:unit
{{< /highlight >}}
Runs all tests except integration tests.
### coverage
{{< highlight bash >}}
mage test:coverage
{{< /highlight >}}
Runs all tests except integration tests and generates a `coverage.html` file to inspect the code coverage.
### integration
{{< highlight bash >}}
mage test:integration
{{< /highlight >}}
Runs all integration tests.
## Dev
### Create a new migration
{{< highlight bash >}}
mage dev:create-migration
{{< /highlight >}}
Creates a new migration with the current date.
Will ask for the name of the struct you want to create a migration for.
## Misc
### Format the code
{{< highlight bash >}}
mage fmt
{{< /highlight >}}
Formats all source code using `go fmt`.
### Generate swagger definitions from code comments
{{< highlight bash >}}
mage do-the-swag
{{< /highlight >}}
Generates swagger definitions from the comment annotations in the code.
+98
View File
@@ -0,0 +1,98 @@
---
date: "2020-01-19:16:00+02:00"
title: "Migrations"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Writing a migrator for Vikunja
It is possible to migrate data from other to-do services to Vikunja.
To make this easier, we have put together a few helpers which are documented on this page.
In general, each migrator implements a migrator interface which is then called from a client.
The interface makes it possible to use helper methods which handle http an focus only on the implementation of the migrator itself.
{{< table_of_contents >}}
## Structure
All migrator implementations live in their own package in `pkg/modules/migration/<name-of-the-service>`.
When creating a new migrator, you should place all related code inside that module.
## Migrator interface
The migrator interface is defined as follows:
```go
// Migrator is the basic migrator interface which is shared among all migrators
type Migrator interface {
// Migrate is the interface used to migrate a user's tasks from another platform to vikunja.
// The user object is the user who's tasks will be migrated.
Migrate(user *models.User) error
// AuthURL returns a url for clients to authenticate against.
// The use case for this are Oauth flows, where the server token should remain hidden and not
// known to the frontend.
AuthURL() string
// Name holds the name of the migration.
// This is used to show the name to users and to keep track of users who already migrated.
Name() string
}
```
## Defining http routes
Once your migrator implements the migration interface, it becomes possible to use the helper http handlers.
Their usage is very similar to the [general web handler](https://kolaente.dev/vikunja/web#user-content-defining-routes-using-the-standard-web-handler):
The `RegisterRoutes(m)` method registers all routes with the scheme `/[MigratorName]/(auth|migrate|status)` for the
authUrl, Status and Migrate methods.
```go
// This is an example for the Wunderlist migrator
if config.MigrationWunderlistEnable.GetBool() {
wunderlistMigrationHandler := &migrationHandler.MigrationWeb{
MigrationStruct: func() migration.Migrator {
return &wunderlist.Migration{}
},
}
wunderlistMigrationHandler.RegisterRoutes(m)
}
```
You should also document the routes with [swagger annotations]({{< ref "../practical-instructions/swagger-docs.md" >}}).
## Insertion helper method
There is a method available in the `migration` package which takes a fully nested Vikunja structure and creates it with all relations.
This means you start by adding a namespace, then add lists inside of that namespace, then tasks in the lists and so on.
The root structure must be present as `[]*models.NamespaceWithLists`.
Then call the method like so:
```go
fullVikunjaHierachie, err := convertWunderlistToVikunja(wContent)
if err != nil {
return
}
err = migration.InsertFromStructure(fullVikunjaHierachie, user)
```
## Configuration
You should add at least an option to enable or disable the migration.
Chances are, you'll need some more options for things like client ID and secret
(if the other service uses oAuth as an authentication flow).
The easiest way to implement an on/off switch is to check whether your migration service is enabled or not when
registering the routes, and then simply don't registering the routes in the case it is disabled.
### Making the migrator public in `/info`
You should make your migrator available in the `/info` endpoint so that frontends can display options to enable them or not.
To do this, add an entry to `pkg/routes/api/v1/info.go`.
+201
View File
@@ -0,0 +1,201 @@
---
date: "2019-02-12:00:00+02:00"
title: "Project structure"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Project structure
In general, this api repo has the following structure:
* `docker`
* `docs`
* `pkg`
* `caldav`
* `cmd`
* `config`
* `db`
* `fixtures`
* `files`
* `integration`
* `log`
* `mail`
* `metrics`
* `migration`
* `models`
* `modules`
* `migration`
* `handler`
* `wunderlist`
* `red`
* `routes`
* `api/v1`
* `static`
* `swagger`
* `user`
* `utils`
* `version`
* `REST-Tests`
* `templates`
* `vendor`
This document will explain what these mean and what you can find where.
{{< table_of_contents >}}
## Root level
The root directory is where [the config file]({{< ref "../setup/config.md">}}), [Magefile]({{< ref "mage.md">}}), license, drone config,
application entry point (`main.go`) and so on are located.
## docker
This directory holds additonal files needed to build and run the docker container, mainly service configuration to properly run Vikunja inside a docker
container.
## pkg
This is where most of the magic happens. Most packages with actual code are located in this folder.
### caldav
This folder holds a simple caldav implementation which is responsible for returning the caldav feature.
### cmd
This package contains all cli-related files and functions.
To learn more about how to add a new command, see [the cli docs]({{< ref "cli.md">}}).
To learn more about how to use this cli, see [the cli usage docs]({{< ref "../usage/cli.md">}}).
### config
This package configures the config. It sets default values and sets up viper and tells it where to look for config files,
how to interpret which env variables for config etc.
If you want to add a new config parameter, you should add default value in this package.
### db
This package contains the db connection handling and db fixtures for testing.
Each other package gets its db connection object from this package.
### files
This package is responsible for all file-related things.
This means it handles saving and retrieving files from the db and the underlying file system.
### integration
All integration tests live here.
See [integration tests]({{< ref "test.md" >}}#integration-tests) for more details.
### log
Similar to `config`, this will set up the logging, based on differen logging backends.
This init is called in `main.go` after the config init is done.
### mail
This package handles all mail sending. To learn how to send a mail, see [sending emails]({{< ref "../practical-instructions/mail.md">}}).
### metrics
This package handles all metrics which are exposed to the prometheus endpoint.
To learn how it works and how to add new metrics, take a look at [how metrics work]({{< ref "../practical-instructions/metrics.md">}}).
### migration
This package handles all migrations.
All migrations are stored and executed here.
To learn more, take a look at the [migrations docs]({{< ref "../development/db-migrations.md">}}).
### models
This is where most of the magic happens.
When adding new features or upgrading existing ones, that most likely happens here.
Because this package is pretty huge, there are several documents and how-to's about it:
* [Adding a feature]({{< ref "../practical-instructions/feature.md">}})
* [Making calls to the database]({{< ref "../practical-instructions/database.md">}})
### modules
#### migration
See [writing a migrator]({{< ref "migration.md" >}}).
### red (redis)
This package initializes a connection to a redis server.
This inizialization is automatically done at the startup of vikunja.
It also has a function (`GetRedis()`) which returns a redis client object you can then use in your package
to talk to redis.
It uses the [go-redis](https://github.com/go-redis/redis) library, please see their configuration on how to use it.
### routes
This package defines all routes which are available for vikunja clients to use.
To add a new route, see [adding a new route]({{< ref "../practical-instructions/feature.md">}}).
#### api/v1
This is where all http-handler functions for the api are stored.
Every handler function which does not use the standard web handler should live here.
### static
All static files generated by `mage generate` live here.
### swagger
This is where the [generated]({{< ref "mage.md#generate-swagger-definitions-from-code-comments">}} [api docs]({{< ref "../usage/api.md">}}) live.
You usually don't need to touch this package.
### user
All user-related things like registration etc. live in this package.
### utils
A small package, containing some helper functions:
* `MakeRandomString`: Generates a random string of a given length.
* `Sha256`: Calculates a sha256 hash from a given string.
See their function definitions for instructions on how to use them.
### version
The single purpouse of this package is to hold the current vikunja version which gets overridden through build flags
each time `mage release` or `mage build` is run.
It is a seperate package to avoid import cycles with other packages.
## REST-Tests
Holds all kinds of test files to directly test the api from inside of [jetbrains ide's](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html).
These files are currently more an experiment, maybe we will drop them in the future to use something we could integrate in the testing process with drone.
Therefore, this has no claim to be complete yet even working, you're free to change whatever is needed to get it working for you.
## templates
Holds the email templates used to send plain text and html emails for new user registration and password changes.
## vendor
All libraries needed to build Vikunja.
We keep all libraries used for Vikunja around in the `vendor/` folder to still be able to build the project even if
some maintainers take their libraries down like [it happened in the past](https://github.com/jteeuwen/go-bindata/issues/5).
When adding a new dependency, make sure to run `go mod vendor` to put it inside this directory.
+72
View File
@@ -0,0 +1,72 @@
---
date: "2019-02-12:00:00+02:00"
title: "Testing"
draft: false
type: "doc"
menu:
sidebar:
parent: "development"
---
# Testing
You can run unit tests with [our `Magefile`]({{< ref "mage.md">}}) with
{{< highlight bash >}}
mage test:unit
{{< /highlight >}}
{{< table_of_contents >}}
## Running tests with config
You can run tests with all available config variables if you want, enabeling you to run tests for a lot of scenarios.
To use the normal config set the enviroment variable `VIKUNJA_TESTS_USE_CONFIG=1`.
## Show sql queries
When `UNIT_TESTS_VERBOSE=1` is set, all sql queries will be shown when tests are run.
## Fixtures
All tests are run against a set of db fixtures.
These fixtures are defined in `pkg/models/fixtures` in YAML-Files which represent the database structure.
When you add a new test case which requires new database entries to test against, update these files.
## Integration tests
All integration tests live in `pkg/integrations`.
You can run them by executing `mage test:integration`.
The integration tests use the same config and fixtures as the unit tests and therefor have the same options available,
see at the beginning of this document.
To run integration tests, use `mage test:integration`.
## Initializing db fixtures when writing tests
All db fixtures for all tests live in the `pkg/db/fixtures/` folder as yaml files.
Each file has the same name as the table the fixtures are for.
You should put new fixtures in this folder.
When initializing db fixtures, you are responsible for defining which tables your package needs in your test init function.
Usually, this is done as follows (this code snippet is taken from the `user` package):
```go
err = db.InitTestFixtures("users")
if err != nil {
log.Fatal(err)
}
```
In your actual tests, you then load the fixtures into the in-memory db like so:
```go
db.LoadAndAssertFixtures(t)
```
This will load all fixtures you defined in your test init method.
You should always use this method to load fixtures, the only exception is when your package tests require extra test
fixtures other than db fixtures (like files).
@@ -0,0 +1,40 @@
---
date: "2019-02-12:00:00+02:00"
title: "Database"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Database
Vikunja uses [xorm](http://xorm.io/) as an abstraction layer to handle the database connection.
Please refer to [their](http://xorm.io/docs/) documentation on how to exactly use it.
Inside the `models` package, a variable `x` is available which contains a pointer to an instance of `xorm.Engine`.
This is used whenever you make a call to the database to get or update data.
This xorm instance is set up and initialized every time vikunja is started.
{{< table_of_contents >}}
## Adding new database tables
To add a new table to the database, add a an instance of your struct to the `tables` variable in the
init function in `pkg/models/models.go`. Xorm will sync them automatically.
You also need to add a pointer to the `tablesWithPointer` slice to enable caching for all instances of this struct.
To learn more about how to configure your struct to create "good" tables, refer to [the xorm documentaion](http://xorm.io/docs/).
## Adding data to test fixtures
Adding data for test fixtures is done in via `yaml` files insinde of `pkg/models/fixtures`.
The name of the yaml file should equal the table name in the database.
Adding values to it is done via array definition inside of the yaml file.
**Note**: Table and column names need to be in snake_case as that's what is used internally in the database
and for mapping values from the database to xorm so your structs can use it.
@@ -0,0 +1,72 @@
---
date: "2019-02-12:00:00+02:00"
title: "Custom Errors"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Custom Errors
All custom errors are defined in `pkg/models/errors.go`.
You should add new ones in this file.
Custom errors usually have fields for the http return code, a [vikunja-specific error code]({{< ref "../usage/errors.md">}})
and a human-readable error message about what went wrong.
An error consists of multiple functions and definitions:
{{< highlight golang >}}
// This struct holds any information about this specific error.
// In this case, it contains the user ID of a nonexistand user.
// This type should always be a struct, even if it has no values in it.
// ErrUserDoesNotExist represents a "UserDoesNotExist" kind of error.
type ErrUserDoesNotExist struct {
UserID int64
}
// This function is mostly used in unit tests to check if a returned error is of that type.
// Every error type should have one of these.
// The name should always start with IsErr... followed by the name of the error.
// IsErrUserDoesNotExist checks if an error is a ErrUserDoesNotExist.
func IsErrUserDoesNotExist(err error) bool {
_, ok := err.(ErrUserDoesNotExist)
return ok
}
// This is the definition of the actual error type.
// Your error type is _required_ to implement this in order to be able to be returned as an "error" from functions.
func (err ErrUserDoesNotExist) Error() string {
return fmt.Sprintf("User does not exist [user id: %d]", err.UserID)
}
// This const holds the vikunja error code used to be able to identify this error without having to
// rely on an error string.
// This needs to be unique, so you should check whether the error code exists or not.
// The general convention for error codes is as follows:
// * Every "group" errors lives in a thousend something. For example all user issues are 1000-something, all
// list errors are 3000-something and so on.
// * New error codes should be the current max error code + 1. Don't take free numbers to prevent old errors
// which are depricated and removed from being "new ones". For example, if there are error codes 1001, 1002, 1004,
// a new error should be 1005 and not 1003.
// ErrCodeUserDoesNotExist holds the unique world-error code of this error
const ErrCodeUserDoesNotExist = 1005
// This is the implementation which returns an http error which is then passed to the client.
// Here you define the http status code with which one the error will be returned, the vikunja error code and
// a human-readable error message.
// HTTPError holds the http error description
func (err ErrUserDoesNotExist) HTTPError() web.HTTPError {
return web.HTTPError{
HTTPCode: http.StatusNotFound,
Code: ErrCodeUserDoesNotExist,
Message: "The user does not exist.",
}
}
{{< /highlight >}}
@@ -0,0 +1,33 @@
---
date: "2019-02-12:00:00+02:00"
title: "Add a new api endpoint"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Add a new api endpoint/feature
Most of the api endpoints/features of Vikunja are using the [common web handler](https://code.vikunja.io/web).
This is a library created by Vikunja in an effort to facilitate the creation of REST endpoints.
This works by abstracting the handling of CRUD-Requests, including rights check.
You can learn more about the web handler on [the project's repo](https://code.vikunja.io/web).
### Helper for pagination
Pagination limits can be calculated with a helper function, `getLimitFromPageIndex(pageIndex)`
(only available in the `models` package) from any page number.
It returns the `limit` (max-length) and `offset` parameters needed for SQL-Queries.
You can feed this function directly into xorm's `Limit`-Function like so:
{{< highlight golang >}}
lists := []List{}
err := x.Limit(getLimitFromPageIndex(pageIndex, itemsPerPage)).Find(&lists)
{{< /highlight >}}
// TODO: Add a full example from start to finish, like a tutorial on how to create a new endpoint?
@@ -0,0 +1,86 @@
---
date: "2019-02-12:00:00+02:00"
title: "Mailer"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Mailer
This document explains how to use the mailer to send emails and what to do to create a new kind of email to be sent.
{{< table_of_contents >}}
## Sending emails
**Note:** You should use mail templates whenever possible (see below).
To send an email, use the function `mail.SendMail(options)`. The options are defined as follows:
{{< highlight golang >}}
type Opts struct {
To string // The email address of the recipent
Subject string // The subject of the mail
Message string // The plaintext message in the mail
HTMLMessage string // The html message
ContentType ContentType // The content type of the mail. Can be either mail.ContentTypePlain, mail.ContentTypeHTML, mail.ContentTypeMultipart. You should set this according to the kind of mail you want to send.
Boundary string
Headers []*header // Other headers to set in the mail.
}
{{< /highlight >}}
### Sending emails based on a template
For each mail with a template, there are two email templates: One for plaintext emails, one for html emails.
These are located in the `templates/mail` folder and follow the conventions of `template-name.{plain|hmtl}.tmpl`,
both the plaintext and html templates are in the same folder.
To send a mail based on a template, use the function `mail.SendMailWithTemplate(to, subject, tpl string, data map[string]interface{})`.
`to` and `subject` are pretty much self-explanatory, `tpl` is the name of the template, without `.html.tmpl` or `.plain.tmpl`.
`data` is a map you can pass additional data to your template.
### Sending a mail with a template
A basic html email template would look like this:
{{< highlight go-html-template >}}
{{template "mail-header.tmpl" .}}
<p>
Hey there!<br/>
This is a minimal html email example.<br/>
{{.Something}}
</p>
{{template "mail-footer.tmpl"}}
{{< /highlight >}}
And the corresponding plaintext template:
{{< highlight go-text-template >}}
Hey there!
This is a minimal html email example.
{{.Something}}
{{< /highlight >}}
You would then call this like so:
{{< highlight golang >}}
data := make(map[string]interface{})
data["Something"] = "I am some computed value"
to := "test@example.com"
subject := "A simple test mail"
tpl := "demo" // Assuming you saved the templates as demo.plain.tmpl and demo.html.tmpl
mail.SendMailWithTemplate(to, subject, tpl, data)
{{< /highlight >}}
The function does not return an error. If an error occures when sending a mail, it is logged but not returned because sending the mail happens asinchrounly.
Notice the `mail-header.tmpl` and `mail-footer.tmpl` in the template. These populate some basic css, a box for your content and the vikunja logo.
All that's left for you is to put the content in, which then will appear in a beautifully-styled box.
Remeber, these are email templates. This is different from normal html/css, you cannot use whatever you want (because most of the clients are wayyy to outdated).
@@ -0,0 +1,48 @@
---
date: "2019-02-12:00:00+02:00"
title: "Metrics"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Metrics
Metrics work by exposing a `/metrics` endpoint which can then be accessed by prometheus.
To keep the load on the database minimal, metrics are stored and updated in redis.
The `metrics` package provides several functions to create and update metrics.
{{< table_of_contents >}}
## New metrics
First, define a `const` with the metric key in redis. This is done in `pkg/metrics/metrics.go`.
To expose a new metric, you need to register it in the `init` function inside of the `metrics` package like so:
{{< highlight golang >}}
// Register total user count metric
promauto.NewGaugeFunc(prometheus.GaugeOpts{
Name: "vikunja_team_count", // The key of the metric. Must be unique.
Help: "The total number of teams on this instance", // A description about the metric itself.
}, func() float64 {
count, _ := GetCount(TeamCountKey) // TeamCountKey is the const we defined earlier.
return float64(count)
})
{{< /highlight >}}
Then you'll need to set the metrics initial value on every startup of vikunja.
This is done in `pkg/routes/routes.go` to avoid cyclic imports.
If metrics are enabled, it checks if a redis connection is available and then sets the initial values.
A convenience function is available if the metric is based on a database struct.
Because metrics are stored in redis, you are responsible to increase or decrease these based on criteria you define.
To do this, use `metrics.UpdateCount(value, key)` where `value` is the amount you want to cange it (you can pass
negative values to decrease it) and `key` it the redis key used to define the metric.
## Using it
A Prometheus config with a Grafana template is available at [our git repo](https://git.kolaente.de/vikunja/monitoring).
@@ -0,0 +1,31 @@
---
date: "2019-02-12:00:00+02:00"
title: "Adding new config options"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Adding new config options
Vikunja uses [viper](https://github.com/spf13/viper) to handle configuration options.
It handles parsing all different configuration sources.
The configuration is done in sections. These are represented with a `.` in viper.
Take a look at `pkg/config/config.go` to understand how these are set.
To add a new config option, you should add a default value to `pkg/config/config.go`.
Default values should always enable the feature to work somehow, or turn it off completely if it always needs
additional configuration.
Make sure to add the new config option to [the config document]({{< ref "../setup/config.md">}}) and the default config file
(`config.yml.sample` at the root of the repository) to make sure it is well documented.
If you're using a computed value as a default, make sure to update the sample config file and debian
post-install scripts to reflect that.
To get a configured option, use `viper.Get("config.option")`.
Take a look at [viper's documentation](https://github.com/spf13/viper#getting-values-from-viper) to learn of the
different ways available to get config options.
@@ -0,0 +1,47 @@
---
date: "2019-02-12:00:00+02:00"
title: "Modifying swagger api docs"
draft: false
type: "doc"
menu:
sidebar:
parent: "practical instructions"
---
# Adding/editing swagger api docs
The api documentation is generated using [swaggo](https://github.com/swaggo/swag) from comments.
## Documenting structs
You should always comment every field which will be exposed as a json in the api.
These comments will show up in the documentation, it'll make it easier for developers using the api.
As an example, this is the definition of a list with all comments:
{{< highlight golang >}}
// List represents a list of tasks
type List struct {
// The unique, numeric id of this list.
ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"list"`
// The title of the list. You'll see this in the namespace overview.
Title string `xorm:"varchar(250)" json:"title" valid:"required,runelength(3|250)" minLength:"3" maxLength:"250"`
// The description of the list.
Description string `xorm:"varchar(1000)" json:"description" valid:"runelength(0|1000)" maxLength:"1000"`
OwnerID int64 `xorm:"int(11) INDEX" json:"-"`
NamespaceID int64 `xorm:"int(11) INDEX" json:"-" param:"namespace"`
// The user who created this list.
Owner User `xorm:"-" json:"owner" valid:"-"`
// An array of tasks which belong to the list.
Tasks []*ListTask `xorm:"-" json:"tasks"`
// A unix timestamp when this list was created. You cannot change this value.
Created int64 `xorm:"created" json:"created"`
// A unix timestamp when this list was last updated. You cannot change this value.
Updated int64 `xorm:"updated" json:"updated"`
web.CRUDable `xorm:"-" json:"-"`
web.Rights `xorm:"-" json:"-"`
}
{{< /highlight >}}
+54
View File
@@ -0,0 +1,54 @@
---
date: "2019-02-12:00:00+02:00"
title: "What to backup"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# What to backup
Vikunja does not store any data outside of the database.
So, all you need to backup are the contents of that database and maybe the config file.
{{< table_of_contents >}}
## MySQL
To create a backup from mysql use the `mysqldump` command:
{{< highlight bash >}}
mysqldump -u <user> -p -h <db-host> <database> > vkunja-backup.sql
{{< /highlight >}}
You will be prompted for the password of the mysql user.
To restore it, simply pipe it back into the `mysql` command:
{{< highlight bash >}}
mysql -u <user> -p -h <db-host> <database> < vkunja-backup.sql
{{< /highlight >}}
## PostgreSQL
To create a backup from PostgreSQL use the `pg_dump` command:
{{< highlight bash >}}
pg_dump -U <user> -h <db-host> <database> > vikunja-backup.sql
{{< /highlight >}}
You might be prompted for the password of the database user.
To restore it, simply pipe it back into the `psql` command:
{{< highlight bash >}}
psql -U <user> -h <db-host> <database> < vikunja-backup.sql
{{< /highlight >}}
For more information, please visit the [relevant PostgreSQL documentation](https://www.postgresql.org/docs/12/backup-dump.html).
## SQLite
To backup sqllite databases, it is enough to copy the database elsewhere.
@@ -0,0 +1,29 @@
---
date: "2019-02-12:00:00+02:00"
title: "Build from sources"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Build Vikunja from source
Vikunja being a go application, has no other dependencies than go itself.
All libraries are bundeled inside the repo in the `vendor/` folder, so all it boils down to are these steps:
1. Make sure [Go](https://golang.org/doc/install) is properly installed on your system. You'll need at least Go `1.9`.
2. Make sure [Mage](https://magefile) is properly installed on your system.
3. Clone the repo with `git clone https://code.vikunja.io/api`
3. Run `mage build:build` in the source of this repo. This will build a binary in the root of the repo which will be able to run on your system.
*Note:* Static ressources such as email templates are built into the binary.
For these to work, you may need to run `mage build:generate` before building the vikunja binary.
When builing entirely with `mage`, you dont need to do this, `mage build:generate` will be run automatically when running `mage build:build`.
# Build for different architectures
To build for other platforms and architectures than the one you're currently on, simply run `mage release:release` or `mage release:{linux|windows|darwin}`.
More options are available, please refer to the [magefile docs]({{< ref "../development/mage.md">}}) for more details.
+565
View File
@@ -0,0 +1,565 @@
---
date: "2019-02-12:00:00+02:00"
title: "Config options"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Configuration options
You can either use a `config.yml` file in the root directory of vikunja or set all config option with
environment variables. If you have both, the value set in the config file is used.
Variables are nested in the `config.yml`, these nested variables become `VIKUNJA_FIRST_CHILD` when configuring via
environment variables. So setting
{{< highlight bash >}}
export VIKUNJA_FIRST_CHILD=true
{{< /highlight >}}
is the same as defining it in a `config.yml` like so:
{{< highlight yaml >}}
first:
child: true
{{< /highlight >}}
# Formats
Vikunja supports using `toml`, `yaml`, `hcl`, `ini`, `json`, envfile, env variables and Java Properties files.
We reccomend yaml or toml, but you're free to use whatever you want.
Vikunja provides a default [`config.yml`](https://kolaente.dev/vikunja/api/src/branch/master/config.yml.sample) file which you can use as a starting point.
# Config file locations
Vikunja will search on various places for a config file:
* Next to the location of the binary
* In the `service.rootpath` location set in a config (remember you can set config arguments via environment variables)
* In `/etc/vikunja`
* In `~/.config/vikunja`
# Default configuration with explanations
The following explains all possible config variables and their defaults.
You can find a full example configuration file in [here](https://code.vikunja.io/api/src/branch/master/config.yml.sample).
If you don't provide a value in your config file, their default will be used.
## Nesting
Most config variables are nested under some "higher-level" key.
For example, the `interface` config variable is a child of the `service` key.
The docs below aim to reflect that leveling, but please also have a lookt at [the default config](https://code.vikunja.io/api/src/branch/master/config.yml.sample) file
to better grasp how the nesting looks like.
<!-- Generated config will be injected here -->
---
## service
### JWTSecret
This token is used to verify issued JWT tokens.
Default is a random token which will be generated at each startup of vikunja.
(This means all already issued tokens will be invalid once you restart vikunja)
Default: `<jwt-secret>`
### interface
The interface on which to run the webserver
Default: `:3456`
### frontendurl
The URL of the frontend, used to send password reset emails.
Default: `<empty>`
### rootpath
The base path on the file system where the binary and assets are.
Vikunja will also look in this path for a config file, so you could provide only this variable to point to a folder
with a config file which will then be used.
Default: `<rootpath>`
### maxitemsperpage
The max number of items which can be returned per page
Default: `50`
### enablemetrics
If set to true, enables a /metrics endpoint for prometheus to collect metrics about the system
You'll need to use redis for this in order to enable common metrics over multiple nodes
Default: `false`
### enablecaldav
Enable the caldav endpoint, see the docs for more details
Default: `true`
### motd
Set the motd message, available from the /info endpoint
Default: `<empty>`
### enablelinksharing
Enable sharing of lists via a link
Default: `true`
### enableregistration
Whether to let new users registering themselves or not
Default: `true`
### enabletaskattachments
Whether to enable task attachments or not
Default: `true`
### timezone
The time zone all timestamps are in
Default: `GMT`
### enabletaskcomments
Whether task comments should be enabled or not
Default: `true`
### enabletotp
Whether totp is enabled. In most cases you want to leave that enabled.
Default: `true`
### sentrydsn
If not empty, enables logging of crashes and unhandled errors in sentry.
Default: `<empty>`
---
## database
### type
Database type to use. Supported types are mysql, postgres and sqlite.
Default: `sqlite`
### user
Database user which is used to connect to the database.
Default: `vikunja`
### password
Databse password
Default: `<empty>`
### host
Databse host
Default: `localhost`
### database
Databse to use
Default: `vikunja`
### path
When using sqlite, this is the path where to store the data
Default: `./vikunja.db`
### maxopenconnections
Sets the max open connections to the database. Only used when using mysql and postgres.
Default: `100`
### maxidleconnections
Sets the maximum number of idle connections to the db.
Default: `50`
### maxconnectionlifetime
The maximum lifetime of a single db connection in miliseconds.
Default: `10000`
### sslmode
Secure connection mode. Only used with postgres.
(see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters)
Default: `disable`
---
## cache
### enabled
If cache is enabled or not
Default: `false`
### type
Cache type. Possible values are "keyvalue", "memory" or "redis".
When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section.
When choosing "redis" you will need to configure the redis connection seperately.
Default: `keyvalue`
### maxelementsize
When using memory this defines the maximum size an element can take
Default: `1000`
---
## redis
### enabled
Whether to enable redis or not
Default: `false`
### host
The host of the redis server including its port.
Default: `localhost:6379`
### password
The password used to authenicate against the redis server
Default: `<empty>`
### db
0 means default database
Default: `0`
---
## cors
### enable
Whether to enable or disable cors headers.
Note: If you want to put the frontend and the api on seperate domains or ports, you will need to enable this.
Otherwise the frontend won't be able to make requests to the api through the browser.
Default: `true`
### origins
A list of origins which may access the api.
Default: `<empty>`
### maxage
How long (in seconds) the results of a preflight request can be cached.
Default: `0`
---
## mailer
### enabled
Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible.
Default: `false`
### host
SMTP Host
Default: `<empty>`
### port
SMTP Host port
Default: `587`
### username
SMTP username
Default: `user`
### password
SMTP password
Default: `<empty>`
### skiptlsverify
Wether to skip verification of the tls certificate on the server
Default: `false`
### fromemail
The default from address when sending emails
Default: `mail@vikunja`
### queuelength
The length of the mail queue.
Default: `100`
### queuetimeout
The timeout in seconds after which the current open connection to the mailserver will be closed.
Default: `30`
### forcessl
By default, vikunja will try to connect with starttls, use this option to force it to use ssl.
Default: `false`
---
## log
### path
A folder where all the logfiles should go.
Default: `<rootpath>logs`
### enabled
Whether to show any logging at all or none
Default: `true`
### standard
Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging.
Default: `stdout`
### level
Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
Default: `INFO`
### database
Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging.
Default: `off`
### databaselevel
The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
Default: `WARNING`
### http
Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging.
Default: `stdout`
### echo
Echo has its own logging which usually is unnessecary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging.
Default: `off`
---
## ratelimit
### enabled
whether or not to enable the rate limit
Default: `false`
### kind
The kind on which rates are based. Can be either "user" for a rate limit per user or "ip" for an ip-based rate limit.
Default: `user`
### period
The time period in seconds for the limit
Default: `60`
### limit
The max number of requests a user is allowed to do in the configured time period
Default: `100`
### store
The store where the limit counter for each user is stored.
Possible values are "keyvalue", "memory" or "redis".
When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section.
Default: `keyvalue`
---
## files
### basepath
The path where files are stored
Default: `./files`
### maxsize
The maximum size of a file, as a human-readable string.
Warning: The max size is limited 2^64-1 bytes due to the underlying datatype
Default: `20MB`
---
## migration
### wunderlist
These are the settings for the wunderlist migrator
Default: `<empty>`
### todoist
Default: `<empty>`
---
## avatar
### gravatarexpiration
When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires
Default: `3600`
---
## backgrounds
### enabled
Whether to enable backgrounds for lists at all.
Default: `true`
### providers
Default: `<empty>`
---
## legal
Legal urls
Will be shown in the frontend if configured here
### imprinturl
Default: `<empty>`
### privacyurl
Default: `<empty>`
---
## keyvalue
Key Value Storage settings
The Key Value Storage is used for different kinds of things like metrics and a few cache systems.
### type
The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately.
Default: `memory`
@@ -0,0 +1,231 @@
---
date: "2020-05-24:00:00+02:00"
title: "Docker Walkthrough"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Setup with docker from start to finish
This tutorial assumes basic knowledge of docker.
It is aimed at beginners and should get you up and running quickly.
We'll use [docker compose](https://docs.docker.com/compose/) to make handling the bunch of containers easier.
> If you have any issues setting up vikunja, please don't hesitate to reach out to us via [matrix](https://riot.im/app/#/room/!dCRiCiLaCCFVNlDnYs:matrix.org?via=matrix.org), the [community forum](https://community.vikunja.io/) or even [email](mailto:hello@vikunja.io).
{{< table_of_contents >}}
## Preparations (optional)
Create a directory for the project where all data and the compose file will live in.
## Create all necessary files
Create a `docker-compose.yml` file with the following contents in your directory:
{{< highlight yaml >}}
version: '3'
services:
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
api:
image: vikunja/api
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
frontend:
image: vikunja/frontend
restart: unless-stopped
proxy:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- api
- frontend
restart: unless-stopped
{{< /highlight >}}
This defines four services, each with their own container:
* An api service which runs the vikunja api. Most of the core logic lives here.
* The frontend which will make vikunja actually usable for most people.
* A database container which will store all lists, tasks, etc. We're using mariadb here, but you're free to use mysql or postgres if you want.
* A proxy service which makes the frontend and api available on the same port, redirecting all requests to `/api` to the api container.
If you already have a proxy on your host, you may want to check out the [reverse proxy examples]() to use that.
By default, it uses port 80 on the host.
To change to something different, you'll need to change the `ports` section in the service definition.
The number before the colon is the host port - This is where you can reach vikunja from the outside once all is up and running.
For the proxy service we'll need another bit of configuration.
Create an `nginx.conf` in your directory (next to the `docker-compose.yml` file) and add the following contents to it:
{{< highlight conf >}}
server {
listen 80;
location / {
proxy_pass http://frontend:80;
}
location ~* ^/(api|dav|\.well-known)/ {
proxy_pass http://api:3456;
client_max_body_size 20M;
}
}
{{< /highlight >}}
This is a simple proxy configuration which will forward all requests to `/api/` to the api container and everything else to the frontend.
<div class="notification is-info">
<b>NOTE:</b> Even if you want to make your installation available under a different port, you don't need to change anything in this configuration.
</div>
<div class="notification is-warning">
<b>NOTE:</b> If you change the max upload size in Vikunja's settings, you'll need to also change the <code>client_max_body_size</code> in the nginx proxy config.
</div>
## Run it
Run `sudo docker-compose up` in your directory and take a look at the output you get.
When first started, Vikunja will set up the database and run all migrations etc.
Once it is ready, you should see a message like this one in your console:
```
api_1 | 2020-05-24T11:15:37.560386009Z: INFO ▶ cmd/func1 025 Vikunja version 0.13.1+19-e9bc3246ce, built at Sun, 24 May 2020 11:10:36 +0000
api_1 | ⇨ http server started on [::]:3456
```
This indicates all setup has been successful.
If you get any errors, see below:
### Troubleshooting
Vikunja might not run on the first try.
There are a few potential issues that could be causing this.
#### No connection to the database
Indicated by an error message like this one from the api container:
```
2020/05/23 15:37:59 Config File "config" Not Found in "[/app/vikunja /etc/vikunja /app/vikunja/.config/vikunja]"
2020/05/23 15:37:59 Using default config.
2020-05-23T15:37:59.974435725Z: CRITICAL ▶ migration/Migrate 002 Migration failed: dial tcp 172.19.0.2:3306: connect: connection refused
```
Especially when using mysql, this can happen on first start, because the mysql database container will take a few seconds to start.
Vikunja does not know the container is not ready, therefore it will just try to connect to the db, fail since it is not ready and exit.
If you're using the docker compose example from above, you may notice the `restart: unless-stopped` option at the api service.
This tells docker to restart the api container if it exits, unless you explicitly stop it.
Therefore, it should "magically fix itself" by automatically restarting the container.
After a few seconds (or minutes) you should see a log message like this one from the mariadb container:
```
2020-05-24 11:42:15 0 [Note] mysqld: ready for connections.
Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
```
The next restart of Vikunja should be successful.
If not, there might be a different error or a bug with Vikunja, please reach out to us in that case.
(If you have an idea about how we could improve this, we'd like to hear it!)
#### "Not a directory"
If you get an error like this one:
```
ERROR: for vikunja_proxy_1 Cannot start service proxy: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"vikunja/nginx.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/9c8b8f9419c29dad0d1233fbb0a3c36cf403dabd7a55d6f0a47b0c1dd6029994/merged\\\" at \\\"/var/lib/docker/overlay2/9c8b8f9419c29dad0d1233fbb0a3c36cf403dabd7a55d6f0a47b0c1dd6029994/merged/etc/nginx/conf.d/default.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
```
this means docker tried to mount a directory from the host to a file in the container.
This can happen if you did not create the `nginx.conf` file.
Because there is a volume mount for it in the `docker-compose.yml`, Docker will create a folder because non exists, assuming you want to mount a folder into the container.
To fix this, create the file and restart the containers again.
#### Migration failed: commands out of sync
If you get an error like this one:
```
2020/05/23 15:53:38 Config File "config" Not Found in "[/app/vikunja /etc/vikunja /app/vikunja/.config/vikunja]"
2020/05/23 15:53:38 Using default config.
2020-05-23T15:53:38.762747276Z: CRITICAL ▶ migration/Migrate 002 Migration failed: commands out of sync. Did you run multiple statements at once?
```
This is a mysql issue.
Currently, we don't have a better solution than to completely wipe the database files and start over.
To do this, first stop everything by running `sudo docker-compose down`, then remove the `db/` folder in your current folder with `sudo rm -rf db` and start the whole stack again with `sudo docker-compose up -d`.
## Try it
Head over to `http://<host-ip or url>/api/v1/info` in a browser.
You should see something like this:
{{< highlight json >}}
{
"version": "0.13.1+19-e9bc3246ce",
"frontend_url": "http://localhost:8080/",
"motd": "test",
"link_sharing_enabled": true,
"max_file_size": "20MB",
"registration_enabled": true,
"available_migrators": [
"wunderlist",
"todoist"
],
"task_attachments_enabled": true
}
{{< /highlight >}}
This shows you can reach the api through the api proxy.
Now head over to `http://<host-ip or url>/` which should show the login mask.
## Make it persistent
Currently, Vikunja runs in foreground in your terminal.
For a real-world scenario this is not the best way.
Back in your terminal, stop the stack by pressing `CTRL-C` on your keyboard.
Then run `sudo docker-compose up -d` in your again.
The `-d` flag at the end of the command will tell docker to run the containers in the background.
If you need to check the logs after that, you can run `sudo docker-compose logs`.
Vikunja does not have any default users, you'll need to register and account.
After that, you can use it.
## Tear it all down
If you want to completely stop all containers run `sudo docker-compose down` in your terminal.
## Improve this guide
We'll happily accept suggestions and improvements for this guide.
Please [reach out to us](https://vikunja.io/contact/) if you have any.
@@ -0,0 +1,293 @@
---
date: "2019-02-12:00:00+02:00"
title: "Full docker example"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Full docker example
This docker compose configuration will run Vikunja with backend and frontend with a mariadb as database.
It uses an nginx container or traefik on the host to proxy backend and frontend into a single port.
For all available configuration options, see [configuration]({{< ref "config.md">}}).
<div class="notification is-warning">
<b>NOTE:</b> If you intend to run Vikunja with mysql and/or to use non-latin characters
<a href="{{< ref "utf-8.md">}}">make sure your db is utf-8 compatible</a>.<br/>
All examples on this page already reflect this and do not require additional work.
</div>
{{< table_of_contents >}}
## Redis
To use redis, you'll need to add this to the config examples below:
{{< highlight yaml >}}
version: '3'
services:
api:
image: vikunja/api
environment:
VIKUNJA_REDIS_ENABLED: 1
VIKUNJA_REDIS_HOST: 'redis:6379'
VIKUNJA_CACHE_ENABLED: 1
VIKUNJA_CACHE_TYPE: redis
volumes:
- ./files:/app/vikunja/files
redis:
image: redis
{{< /highlight >}}
## Example with traefik 2
This example assumes [traefik](https://traefik.io) version 2 installed and configured to [use docker as a configuration provider](https://docs.traefik.io/providers/docker/).
We also make a few assumtions here which you'll most likely need to adjust for your traefik setup:
* Your domain is `vikunja.example.com`
* The entrypoint you want to make vikunja available from is called `https`
* The tls cert resolver is called `acme`
{{< highlight yaml >}}
version: '3'
services:
api:
image: vikunja/api
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
- ./files:/app/vikunja/files
networks:
- web
- default
depends_on:
- db
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.vikunja-api.rule=Host(`vikunja.example.com`) && PathPrefix(`/api/v1`, `/dav/`, `/.well-known/`)"
- "traefik.http.routers.vikunja-api.entrypoints=https"
- "traefik.http.routers.vikunja-api.tls.certResolver=acme"
frontend:
image: vikunja/frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.vikunja-frontend.rule=Host(`vikunja.example.com`)"
- "traefik.http.routers.vikunja-frontend.entrypoints=https"
- "traefik.http.routers.vikunja-frontend.tls.certResolver=acme"
networks:
- web
- default
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
command: --max-connections=1000
networks:
web:
external: true
{{< /highlight >}}
## Example with traefik 1
This example assumes [traefik](https://traefik.io) in version 1 installed and configured to [use docker as a configuration provider](https://docs.traefik.io/v1.7/configuration/backends/docker/).
{{< highlight yaml >}}
version: '3'
services:
api:
image: vikunja/api
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: vikunja
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
- ./files:/app/vikunja/files
networks:
- web
- default
depends_on:
- db
restart: unless-stopped
labels:
- "traefik.docker.network=web"
- "traefik.enable=true"
- "traefik.frontend.rule=Host:vikunja.example.com;PathPrefix:/api/v1,/dav/,/.well-known"
- "traefik.port=3456"
- "traefik.protocol=http"
frontend:
image: vikunja/frontend
labels:
- "traefik.docker.network=web"
- "traefik.enable=true"
- "traefik.frontend.rule=Host:vikunja.example.com;PathPrefix:/"
- "traefik.port=80"
- "traefik.protocol=http"
networks:
- web
- default
restart: unless-stopped
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersupersecret
MYSQL_USER: vikunja
MYSQL_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
command: --max-connections=1000
networks:
web:
external: true
{{< /highlight >}}
## Example with nginx as proxy
You'll need to save this nginx configuration on your host under `nginx.conf`
(or elsewhere, but then you'd need to adjust the proxy mount at the bottom of the compose file):
{{< highlight conf >}}
server {
listen 80;
location / {
proxy_pass http://frontend:80;
}
location ~* ^/(api|dav|\.well-known)/ {
proxy_pass http://api:3456;
client_max_body_size 20M;
}
}
{{< /highlight >}}
<div class="notification is-warning">
<b>NOTE:</b> If you change the max upload size in Vikunja's settings, you'll need to also change the <code>client_max_body_size</code> in the nginx proxy config.
</div>
`docker-compose.yml` config:
{{< highlight yaml >}}
version: '3'
services:
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
api:
image: vikunja/api
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
frontend:
image: vikunja/frontend
restart: unless-stopped
proxy:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- api
- frontend
restart: unless-stopped
{{< /highlight >}}
## Example with Caddy v2 as proxy
You will need the following `Caddyfile` on your host (or elsewhere, but then you'd need to adjust the proxy mount at the bottom of the compose file):
{{< highlight conf >}}
vikunja.example.com {
reverse_proxy /api/* api:3456
reverse_proxy /.well-known/* api:3456
reverse_proxy /dav/* api:3456
reverse_proxy frontend:80
}
{{< /highlight >}}
`docker-compose.yml` config:
{{< highlight yaml >}}
version: '3'
services:
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
restart: unless-stopped
api:
image: vikunja/api
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: root
VIKUNJA_DATABASE_DATABASE: vikunja
volumes:
- ./files:/app/vikunja/files
depends_on:
- db
restart: unless-stopped
frontend:
image: vikunja/frontend
restart: unless-stopped
caddy:
image: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
depends_on:
- api
- frontend
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
{{< /highlight >}}
+277
View File
@@ -0,0 +1,277 @@
---
date: "2019-02-12:00:00+02:00"
title: "Install Backend"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Backend
<div class="notification is-warning">
<b>NOTE:</b> If you intend to run Vikunja with mysql and/or to use non-latin characters
<a href="{{< ref "utf-8.md">}}">make sure your db is utf-8 compatible</a>.
</div>
{{< table_of_contents >}}
## Install from binary
Download a copy of Vikunja from the [download page](https://vikunja.io/en/download/) for your architecture.
{{< highlight bash >}}
wget <download-url>
{{< /highlight >}}
### Verify the GPG signature
Starting with version `0.7`, all releases are signed using pgp.
Releases from `master` will always be signed.
To validate the downloaded zip file use the signiture file `.asc` and the key `FF054DACD908493A`:
{{< highlight bash >}}
gpg --keyserver keyserver.ubuntu.com --recv FF054DACD908493A
gpg --verify vikunja-0.7-linux-amd64-full.zip.asc vikunja-0.7-linux-amd64-full.zip
{{< /highlight >}}
### Set it up
Once you've verified the signature, you need to unzip it and make it executable, you'll also need to
create a symlink to it so you can execute Vikunja by typing `vikunja` on your system.
We'll install vikunja to `/opt/vikunja`, change the path where needed if you want to install it elsewhere.
{{< highlight bash >}}
mkdir -p /opt/vikunja
unzip <vikunja-zip-file> -d /opt/vikunja
chmod +x /opt/vikunja
ln -s /opt/vikunja/vikunja /usr/bin/vikunja
{{< /highlight >}}
### Systemd service
Take the following `service` file and adapt it to your needs:
{{< highlight service >}}
[Unit]
Description=Vikunja
After=syslog.target
After=network.target
# Depending on how you configured Vikunja, you may want to uncomment these:
#Requires=mysql.service
#Requires=mariadb.service
#Requires=postgresql.service
#Requires=redis.service
[Service]
RestartSec=2s
Type=simple
WorkingDirectory=/opt/vikunja
ExecStart=/usr/bin/vikunja
Restart=always
# If you want to bind Vikunja to a port below 1024 uncomment
# the two values below
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
{{< /highlight >}}
If you've installed Vikunja to a directory other than `/opt/vikunja`, you need to adapt `WorkingDirectory` accordingly.
Save the file to `/etc/systemd/system/vikunja.service`
After you made all nessecary modifications, it's time to start the service:
{{< highlight bash >}}
sudo systemctl enable vikunja
sudo systemctl start vikunja
{{< /highlight >}}
### Build from source
To build vikunja from source, see [building from source]({{< ref "build-from-source.md">}}).
### Updating
Simply replace the binary and templates with the new version, then restart Vikunja.
It will automatically run all nessecary database migrations.
**Make sure to take a look at the changelog for the new version to not miss any manual steps the update may involve!**
## Docker
(Note: this assumes some familarity with docker)
Usage with docker is pretty straightforward:
{{< highlight bash >}}
docker run -p 3456:3456 vikunja/api
{{< /highlight >}}
to run with a standard configuration.
This will expose vikunja on port `3456` on the host running the container.
You can mount a local configuration like so:
{{< highlight bash >}}
docker run -p 3456:3456 -v /path/to/config/on/host.yml:/app/vikunja/config.yml:ro vikunja/api
{{< /highlight >}}
Though it is recommended to use eviroment variables or `.env` files to configure Vikunja in docker.
See [config]({{< ref "config.md">}}) for a list of available configuration options.
### Files volume
By default the container stores all files uploaded and used through vikunja inside of `/app/vikunja/files` which is created as a docker volume.
You should mount the volume somewhere to the host to permanently store the files and don't loose them if the container restarts.
### Setting user and group id of the user running vikunja
You can set the user and group id of the user running vikunja with the `PUID` and `PGID` evironment variables.
This follows the pattern used by [the linuxserver.io](https://docs.linuxserver.io/general/understanding-puid-and-pgid) docker images.
This is useful to solve general permission problems when host-mounting volumes such as the volume used for task attachments.
### Docker compose
To run the backend with a mariadb database you can use this example [docker-compose](https://docs.docker.com/compose/) file:
{{< highlight yaml >}}
version: '2'
services:
api:
image: vikunja/api:latest
environment:
VIKUNJA_DATABASE_HOST: db
VIKUNJA_DATABASE_PASSWORD: supersecret
VIKUNJA_DATABASE_TYPE: mysql
VIKUNJA_DATABASE_USER: root
VIKUNJA_SERVICE_JWTSECRET: <generated secret>
volumes:
- ./files:/app/vikunja/files
db:
image: mariadb:10
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_DATABASE: vikunja
volumes:
- ./db:/var/lib/mysql
{{< /highlight >}}
See [full docker example]({{< ref "full-docker-example.md">}}) for more varations of this config.
## Debian packages
Since version 0.7 Vikunja is also released as debian packages.
To install these, grab a copy from [the download page](https://vikunja.io/en/download/) and run
{{< highlight bash >}}
dpkg -i vikunja.deb
{{< /highlight >}}
This will install the backend to `/opt/vikunja`.
To configure it, use the config file in `/etc/vikunja/config.yml`.
## FreeBSD / FreeNAS
Unfortunately, we currently can't provide pre-built binaries for FreeBSD.
As a workaround, it is possible to compile vikunja for FreeBSD directly on a FreeBSD machine, a guide is available below:
*Thanks to HungrySkeleton who originally created this guide [in the forum](https://community.vikunja.io/t/freebsd-support/69/11).*
### Jail Setup
1. Create jail named ```vikunja```
2. Set jail properties to 'auto start'
3. Mount storage (```/mnt``` to ```jailData/vikunja```)
4. Start jail & SSH into it
### Installing packages
{{< highlight bash >}}
pkg update && pkg upgrade -y
pkg install nano git go gmake
go install github.com/magefile/mage
{{< /highlight >}}
### Clone vikunja repo
{{< highlight bash >}}
mkdir /mnt/GO/code.vikunja.io
cd /mnt/GO/code.vikunja.io
git clone https://code.vikunja.io/api
cd /mnt/GO/code.vikunja.io/api
{{< /highlight >}}
### Compile binaries
{{< highlight bash >}}
go install
mage build
{{< /highlight >}}
### Create folder to install backend server into
{{< highlight bash >}}
mkdir /mnt/backend
cp /mnt/GO/code.vikunja.io/api/vikunja /mnt/backend/vikunja
cd /mnt/backend
chmod +x /mnt/backend/vikunja
{{< /highlight >}}
### Set vikunja to boot on startup
{{< highlight bash >}}
nano /etc/rc.d/vikunja
{{< /highlight >}}
Then paste into the file:
{{< highlight bash >}}
#!/bin/sh
. /etc/rc.subr
name=vikunja
rcvar=vikunja_enable
command="/mnt/backend/${name}"
load_rc_config $name
run_rc_command "$1"
{{< /highlight >}}
Save and exit. Then execute:
{{< highlight bash >}}
chmod +x /etc/rc.d/vikunja
nano /etc/rc.conf
{{< /highlight >}}
Then add line to bottom of file:
{{< highlight bash >}}
vikunja_enable="YES"
{{< /highlight >}}
Test vikunja now works with
{{< highlight bash >}}
service vikunja start
{{< /highlight >}}
The API is now available through IP:
```
192.168.1.XXX:3456
```
## Configuration
See [available configuration options]({{< ref "config.md">}}).
+142
View File
@@ -0,0 +1,142 @@
---
date: "2019-02-12:00:00+02:00"
title: "Install Frontend"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Frontend
Installing the frontend is just a matter of hosting a bunch of static files somewhere.
With nginx or apache, you have to [download](https://vikunja.io/en/download/) the frontend files first.
Unzip them and store them somewhere your server can access them.
You also need to configure a rewrite condition to internally redirect all requests to `index.html` which handles all urls.
{{< table_of_contents >}}
## API URL configuration
By default, the frontend assumes it can reach the api at `/api/v1` relative to the frontend url.
This means that if you make the frontend available at, say `https://vikunja.example.com`, it tries to reach the api
at `https://vikunja.example.com/api/v1`.
In this scenario it is not possible for the frontend and the api to live on seperate servers or even just seperate
ports on the same server with [the use of a reverse proxy]({{< ref "reverse-proxies.md">}}).
To make configurations like this possible, the api url can be set in the `index.html` file of the frontend releases.
Just open the file with a text editor - there are comments which will explain how to set the url.
**Note:** This needs to be done again after every update.
(If you have a good idea for a better solution than this, we'd love to [hear it](https://vikunja.io/contact/))
## Docker
The docker image is based on nginx and just contains all nessecary files for the frontend.
To run it, all you need is
{{< highlight bash >}}
docker run -p 80:80 vikunja/frontend
{{< /highlight >}}
which will run the docker image and expose port 80 on the host.
See [full docker example]({{< ref "full-docker-example.md">}}) for more varations of this config.
### Setting user and group id of the user running vikunja
You can set the user and group id of the user running vikunja with the `PUID` and `PGID` evironment variables.
This follows the pattern used by [the linuxserver.io](https://docs.linuxserver.io/general/understanding-puid-and-pgid) docker images.
### API URL configuration in docker
When running the frontend with docker, it is possible to set the environment variable `$VIKUNJA_API_URL` to the api url.
It is therefore not needed to change the url manually inside the docker container.
## NGINX
Below are two example configurations which you can put in your `nginx.conf`:
You may need to adjust `server_name` and `root` accordingly.
After configuring them, you need to reload nginx (`service nginx reload`).
### with gzip enabled (recommended)
{{< highlight conf >}}
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml;
server {
listen 80;
server_name localhost;
location / {
root /path/to/vikunja/static/frontend/files;
try_files $uri $uri/ /;
index index.html index.htm;
}
}
{{< /highlight >}}
### without gzip
{{< highlight conf >}}
server {
listen 80;
server_name localhost;
location / {
root /path/to/vikunja/static/frontend/files;
try_files $uri $uri/ /;
index index.html index.htm;
}
}
{{< /highlight >}}
## Apache
Apache needs to have `mod_rewrite` enabled for this to work properly:
{{< highlight bash >}}
a2enmod rewrite
service apache2 restart
{{< /highlight >}}
Put the following config in `cat /etc/apache2/sites-available/vikunja.conf`:
{{< highlight aconf >}}
<VirtualHost *:80>
ServerName localhost
DocumentRoot /path/to/vikunja/static/frontend/files
RewriteEngine On
RewriteRule ^\/?(config\.json|favicon\.ico|css|fonts|images|img|js) - [L]
RewriteRule ^(.*)$ /index.html [QSA,L]
</VirtualHost>
{{< /highlight >}}
You probably want to adjust `ServerName` and `DocumentRoot`.
Once you've customized your config, you need to enable it:
{{< highlight bash >}}
a2ensite vikunja
service apache2 reload
{{< /highlight >}}
## Updating
To update, it should be enough to download the new files and overwrite the old ones.
The paths contain hashes, so all caches are invalidated automatically.
+41
View File
@@ -0,0 +1,41 @@
---
date: "2019-02-12:00:00+02:00"
title: "Installing"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
weight: 10
---
# Installing
Vikunja consists of two parts: [Backend](https://code.vikunja.io/api) and [frontend](https://code.vikunja.io/frontend).
While the backend is required, the frontend is not.
You don't neccesarily need to have a web-frontend, using Vikunja via the [mobile app](https://code.vikunja.io/app) is totally fine.
However, using the web frontend is highly reccommended.
Vikunja can be installed in various forms.
This document provides an overview and instructions for the different methods.
* [Backend]({{< ref "install-backend.md">}})
* [Installing from binary]({{< ref "install-backend.md#install-from-binary">}})
* [Verify the GPG signature]({{< ref "install-backend.md#verify-the-gpg-signature">}})
* [Set it up]({{< ref "install-backend.md#set-it-up">}})
* [Systemd service]({{< ref "install-backend.md#systemd-service">}})
* [Updating]({{< ref "install-backend.md#updating">}})
* [Build from source]({{< ref "install-backend.md#build-from-source">}})
* [Docker]({{< ref "install-backend.md#docker">}})
* [Debian packages]({{< ref "install-backend.md#debian-packages">}})
* [Configuration]({{< ref "config.md">}})
* [UTF-8 Settings]({{< ref "utf-8.md">}})
* [Frontend]({{< ref "install-frontend.md">}})
* [Docker]({{< ref "install-frontend.md#docker">}})
* [NGINX]({{< ref "install-frontend.md#nginx">}})
* [Apache]({{< ref "install-frontend.md#apache">}})
* [Updating]({{< ref "install-frontend.md#updating">}})
* [Reverse proxies]({{< ref "reverse-proxies.md">}})
* [Full docker example]({{< ref "full-docker-example.md">}})
* [Backups]({{< ref "backups.md">}})
+111
View File
@@ -0,0 +1,111 @@
---
date: "2019-02-12:00:00+02:00"
title: "Reverse Proxy"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# Setup behind a reverse proxy which also serves the frontend
These examples assume you have an instance of the backend running on your server listening on port `3456`.
If you've changed this setting, you need to update the server configurations accordingly.
{{< table_of_contents >}}
## NGINX
Below are two example configurations which you can put in your `nginx.conf`:
You may need to adjust `server_name` and `root` accordingly.
### with gzip enabled (recommended)
{{< highlight conf >}}
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml;
server {
listen 80;
server_name localhost;
location / {
root /path/to/vikunja/static/frontend/files;
try_files $uri $uri/ /;
index index.html index.htm;
}
location ~* ^/(api|dav|\.well-known)/ {
proxy_pass http://localhost:3456;
client_max_body_size 20M;
}
}
{{< /highlight >}}
<div class="notification is-warning">
<b>NOTE:</b> If you change the max upload size in Vikunja's settings, you'll need to also change the <code>client_max_body_size</code> in the nginx proxy config.
</div>
### without gzip
{{< highlight conf >}}
server {
listen 80;
server_name localhost;
location / {
root /path/to/vikunja/static/frontend/files;
try_files $uri $uri/ /;
index index.html index.htm;
}
location ~* ^/(api|dav|\.well-known)/ {
proxy_pass http://localhost:3456;
client_max_body_size 20M;
}
}
{{< /highlight >}}
<div class="notification is-warning">
<b>NOTE:</b> If you change the max upload size in Vikunja's settings, you'll need to also change the <code>client_max_body_size</code> in the nginx proxy config.
</div>
## Apache
Put the following config in `cat /etc/apache2/sites-available/vikunja.conf`:
{{< highlight aconf >}}
<VirtualHost *:80>
ServerName localhost
<Proxy *>
Order Deny,Allow
Allow from all
</Proxy>
ProxyPass /api http://localhost:3456/api
ProxyPassReverse /api http://localhost:3456/api
ProxyPass /dav http://localhost:3456/dav
ProxyPassReverse /dav http://localhost:3456/dav
ProxyPass /.well-known http://localhost:3456/.well-known
ProxyPassReverse /.well-known http://localhost:3456/.well-known
DocumentRoot /var/www/html
RewriteEngine On
RewriteRule ^\/?(config\.json|favicon\.ico|css|fonts|images|img|js|api|dav|\.well-known) - [L]
RewriteRule ^(.*)$ /index.html [QSA,L]
</VirtualHost>
{{< /highlight >}}
**Note:** The apache modules `proxy`, `proxy_http` and `rewrite` must be enabled for this.
For more details see the [frontend apache configuration]({{< ref "install-frontend.md#apache">}}).
+108
View File
@@ -0,0 +1,108 @@
---
date: "2020-07-06:00:00+02:00"
title: "UTF-8 Settings"
draft: false
type: "doc"
menu:
sidebar:
parent: "setup"
---
# UTF-8 Settings
Vikunja itself is always fully capable of handling utf-8 characters.
However, your database might be not.
Vikunja itself will work just fine until you want to use non-latin characters in your tasks/lists/etc.
On this page, you will find information about how to fully ensure non-latin characters like aüäß or emojis work
with your installation.
{{< table_of_contents >}}
## Postgresql & SQLite
Postgresql and SQLite should handle utf-8 just fine - If you discover any issues nonetheless, please
[drop us a message](https://vikunja.io/contact/).
## MySQL
MySQL is not able to handle utf-8 by default.
To fix this, follow the steps below.
To find out if your db supports utf-8, run the following in a shell or similar, assuming the database
you're using for vikunja is called `vikunja`:
{{< highlight sql >}}
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'vikunja';
{{< /highlight >}}
This will get you a result like the following:
```
+----------------------------+
| default_character_set_name |
+----------------------------+
| latin1 |
+----------------------------+
1 row in set (0.001 sec)
```
The charset `latin1` means the db is encoded in the `latin1` encoding which does not support utf-8 characters.
(The following guide is based on [this thread from stackoverflow](https://dba.stackexchange.com/a/104866))
### 0. Backup your database
Before attempting any conversion, please [back up your database]({{< ref "backups.md">}}).
### 1. Create a pre-conversion script
Copy the following sql statements in a file called `preAlterTables.sql` and replace all occurences of `vikunja` with
the name of your database:
{{< highlight sql >}}
use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like 'vikunja' and TABLE_TYPE='BASE TABLE' group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like 'vikunja' and TABLE_TYPE='BASE TABLE' group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like 'vikunja' and data_type in ('varchar','char');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like 'vikunja' and data_type in ('text','tinytext','mediumtext','longtext');
{{< /highlight >}}
### 2. Run the pre-conversion script
Running this will create the actual migration script for your particular database structure and save it in a file called `alterTables.sql`:
{{< highlight bash >}}
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
{{< /highlight >}}
### 3. Convert the database
At this point converting is just a matter of executing the previously generated sql script:
{{< highlight bash >}}
mysql -uroot < alterTables.sql
{{< /highlight >}}
### 4. Verify it was successfully converted
If everything worked as intended, your db collation should now look like this:
{{< highlight sql >}}
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'vikunja';
{{< /highlight >}}
Should get you:
```
+----------------------------+
| default_character_set_name |
+----------------------------+
| utf8mb4 |
+----------------------------+
1 row in set (0.001 sec)
```
+19
View File
@@ -0,0 +1,19 @@
---
date: "2019-02-12:00:00+02:00"
title: "API Documentation"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# API Documentation
You can find the api docs under `http://vikunja.tld/api/v1/docs` of your instance.
A public instance is available on [try.vikunja.io](http://try.vikunja.io/api/v1/docs).
These docs are autgenerated from annotations in the code with swagger.
The specification is hosted at `http://vikunja.tld/api/v1/docs.json`.
You can use this to embed it into other openapi compatible applications if you want.
+144
View File
@@ -0,0 +1,144 @@
---
date: "2019-05-12:00:00+01:00"
title: "Caldav"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Caldav
> **Warning:** The caldav integration is in an early alpha stage and has bugs.
> It works well with some clients while having issues with others.
> If you encounter issues, please [report them](https://code.vikunja.io/api/issues/new?body=[caldav])
Vikunja supports managing tasks via the [caldav VTODO](https://tools.ietf.org/html/rfc5545#section-3.6.2) extension.
{{< table_of_contents >}}
## URLs
All urls are located under the `/dav` subspace.
Urls are:
* `/principals/<username>/`: Returns urls for list discovery. *Use this url to initially make connections to new clients.*
* `/lists/`: Used to manage lists
* `/lists/<List ID>/`: Used to manage a single list
* `/lists/<List ID>/<Task UID>`: Used to manage a task on a list
## Supported properties
Vikunja currently supports the following properties:
* `UID`
* `SUMMARY`
* `DESCRIPTION`
* `PRIORITY`
* `COMPLETED`
* `DUE`
* `DTSTART`
* `DURATION`
* `ORGANIZER`
* `RELATED-TO`
* `CREATED`
* `DTSTAMP`
* `LAST-MODIFIED`
Vikunja **currently does not** support these properties:
* `ATTACH`
* `CATEGORIES`
* `CLASS`
* `COMMENT`
* `GEO`
* `LOCATION`
* `PERCENT-COMPLETE`
* `RESOURCES`
* `STATUS`
* `CONTACT`
* `RECURRENCE-ID`
* `URL`
* Recurrence
* `SEQUENCE`
## Tested Clients
### Working
* [Evolution](https://wiki.gnome.org/Apps/Evolution/)
* [OpenTasks](https://opentasks.app/) + [DAVx⁵](https://www.davx5.com/)
### Not working
* [Tasks (Android)](https://tasks.org/)
* [Thunderbird (68)](https://www.thunderbird.net/)
## Dev logs
The whole thing is not optimized at all and probably pretty inefficent.
Request body and headers are logged if the debug output is enabled.
```
Creating a new task:
PUT /dav/lists/1/cd4dd0e1b3c19cc9d787829b6e08be536e3df3a4.ics
Body:
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VTODO
UID:cd4dd0e1b3c19cc9d787829b6e08be536e3df3a4
DTSTAMP:20190508T134538Z
SUMMARY:test2000
PRIORITY:0
CLASS:PUBLIC
CREATED:20190508T134710Z
LAST-MODIFIED:20190508T134710Z
END:VTODO
END:VCALENDAR
Marking a task as done:
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VTODO
UID:3ada92f28b4ceda38562ebf047c6ff05400d4c572352a
DTSTAMP:20190511T183631
DTSTART:19700101T000000
DTEND:19700101T000000
SUMMARY:sdgs
ORGANIZER;CN=:user
CREATED:20190511T183631
PRIORITY:0
LAST-MODIFIED:20190512T193428Z
COMPLETED:20190512T193428Z
PERCENT-COMPLETE:100
STATUS:COMPLETED
END:VTODO
END:VCALENDAR
Requests from the app:::
[CALDAV] Request Body: <?xml version="1.0" encoding="UTF-8" ?><propfind xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav"><prop><current-user-principal /></prop></propfind>
[CALDAV] GetResources: rpath: /dav/
2019-05-18T23:25:49.971140654+02:00: WEB ▶ 192.168.1.134 PROPFIND 207 /dav/ 1.021705664s - okhttp/3.12.2
[CALDAV] Request Body: <?xml version="1.0" encoding="UTF-8" ?><propfind xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav"><prop><CAL:calendar-home-set /></prop></propfind>
[CALDAV] GetResources: rpath: /dav/
2019-05-18T23:25:52.166996113+02:00: WEB ▶ 192.168.1.134 PROPFIND 207 /dav/ 1.042834467s - okhttp/3.12.2
And then it just stops.
... and complains about not being able to find the home set
... without even requesting it...
```
+183
View File
@@ -0,0 +1,183 @@
---
date: "2019-03-31:00:00+01:00"
title: "CLI"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Command line interface
You can interact with Vikunja using its `cli` interface.
The following commands are available:
* [dump](#dump)
* [help](#help)
* [migrate](#migrate)
* [restore](#restore)
* [testmail](#testmail)
* [user](#user)
* [version](#version)
* [web](#web)
If you don't specify a command, the [`web`](#web) command will be executed.
All commands use the same standard [config file]({{< ref "../setup/config.md">}}).
### `dump`
Creates a zip file with all vikunja-related files.
This includes config, version, all files and the full database.
Usage:
{{< highlight bash >}}
$ vikunja dump
{{< /highlight >}}
### `help`
Shows more detailed help about any command.
Usage:
{{< highlight bash >}}
$ vikunja help [command]
{{< /highlight >}}
### `migrate`
Run all database migrations which didn't already run.
Usage:
{{< highlight bash >}}
$ vikunja migrate [flags]
$ vikunja migrate [command]
{{< /highlight >}}
#### `migrate list`
Shows a list with all database migrations.
Usage:
{{< highlight bash >}}
$ vikunja migrate list
{{< /highlight >}}
#### `migrate rollback`
Roll migrations back until a certain point.
Usage:
{{< highlight bash >}}
$ vikunja migrate rollback [flags]
{{< /highlight >}}
Flags:
* `-n`, `--name` string: The id of the migration you want to roll back until.
### `restore`
Restores a previously created dump from a zip file, see `dump`.
Usage:
{{< highlight bash >}}
$ vikunja restore <path to dump zip file>
{{< /highlight >}}
### `testmail`
Sends a test mail using the configured smtp connection.
Usage:
{{< highlight bash >}}
$ vikunja testmail <email to send the test mail to>
{{< /highlight >}}
### `user`
Bundles a few commands to manage users.
#### `user change-status`
Enable or disable a user. Will toggle the current status if no flag (`--enable` or `--disable`) is provided.
Usage:
{{< highlight bash >}}
$ vikunja user change-status <user id> <flags>
{{< /highlight >}}
Flags:
* `-d`, `--disable`: Disable the user.
* `-e`, `--enable`: Enable the user.
#### `user create`
Create a new user.
Usage:
{{< highlight bash >}}
$ vikunja user create <flags>
{{< /highlight >}}
Flags:
* `-a`, `--avatar-provider`: The avatar provider of the new user. Optional.
* `-e`, `--email`: The email address of the new user.
* `-p`, `--password`: The password of the new user. You will be asked to enter it if not provided through the flag.
* `-u`, `--username`: The username of the new user.
#### `user list`
Shows a list of all users.
Usage:
{{< highlight bash >}}
$ vikunja user list
{{< /highlight >}}
#### `user reset-password`
Reset a users password, either through mailing them a reset link or directly.
Usage:
{{< highlight bash >}}
$ vikunja user reset-password <flags>
{{< /highlight >}}
Flags:
* `-d`, `--direct`: If provided, reset the password directly instead of sending the user a reset mail.
* `-p`, `--password`: The new password of the user. Only used in combination with --direct. You will be asked to enter it if not provided through the flag.
#### `user update`
Update an existing user.
Usage:
{{< highlight bash >}}
$ vikunja user update <user id>
{{< /highlight >}}
Flags:
* `-a`, `--avatar-provider`: The new avatar provider of the new user.
* `-e`, `--email`: The new email address of the user.
* `-u`, `--username`: The new username of the user.
### `version`
Prints the version of Vikunja.
This is either the semantic version (something like `0.7`) or version + git commit hash.
Usage:
{{< highlight bash >}}
$ vikunja version
{{< /highlight >}}
### `web`
Starts Vikunja's REST api server.
Usage:
{{< highlight bash >}}
$ vikunja web
{{< /highlight >}}
+144
View File
@@ -0,0 +1,144 @@
---
date: "2019-02-12:00:00+02:00"
title: "Errors"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Errors
This document describes the different errors Vikunja can return.
{{< table_of_contents >}}
## Generic
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 0001 | 403 | Generic forbidden error. |
## User
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 1001 | 400 | A user with this username already exists. |
| 1002 | 400 | A user with this email address already exists. |
| 1004 | 400 | No username and password specified. |
| 1005 | 404 | The user does not exist. |
| 1006 | 400 | Could not get the user id. |
| 1008 | 412 | No password reset token provided. |
| 1009 | 412 | Invalid password reset token. |
| 1010 | 412 | Invalid email confirm token. |
| 1011 | 412 | Wrong username or password. |
| 1012 | 412 | Email address of the user not confirmed. |
| 1013 | 412 | New password is empty. |
| 1014 | 412 | Old password is empty. |
| 1015 | 412 | Totp is already enabled for this user. |
| 1016 | 412 | Totp is not enabled for this user. |
| 1017 | 412 | The provided Totp passcode is invalid. |
| 1018 | 412 | The provided user avatar provider type setting is invalid. |
## Validation
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 2001 | 400 | ID cannot be empty or 0. |
| 2002 | 400 | Some of the request data was invalid. The response contains an aditional array with all invalid fields. |
## List
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 3001 | 404 | The list does not exist. |
| 3004 | 403 | The user needs to have read permissions on that list to perform that action. |
| 3005 | 400 | The list title cannot be empty. |
| 3006 | 404 | The list share does not exist. |
| 3007 | 400 | A list with this identifier already exists. |
| 3008 | 412 | The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list. |
## Task
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 4001 | 400 | The list task text cannot be empty. |
| 4002 | 404 | The list task does not exist. |
| 4003 | 403 | All bulk editing tasks must belong to the same list. |
| 4004 | 403 | Need at least one task when bulk editing tasks. |
| 4005 | 403 | The user does not have the right to see the task. |
| 4006 | 403 | The user tried to set a parent task as the task itself. |
| 4007 | 400 | The user tried to create a task relation with an invalid kind of relation. |
| 4008 | 409 | The user tried to create a task relation which already exists. |
| 4009 | 404 | The task relation does not exist. |
| 4010 | 400 | Cannot relate a task with itself. |
| 4011 | 404 | The task attachment does not exist. |
| 4012 | 400 | The task attachment is too large. |
| 4013 | 400 | The task sort param is invalid. |
| 4014 | 400 | The task sort order is invalid. |
| 4015 | 404 | The task comment does not exist. |
| 4016 | 403 | Invalid task field. |
| 4017 | 403 | Invalid task filter comparator. |
| 4018 | 403 | Invalid task filter concatinator. |
| 4019 | 403 | Invalid task filter value. |
## Namespace
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 5001 | 404 | The namspace does not exist. |
| 5003 | 403 | The user does not have access to the specified namespace. |
| 5006 | 400 | The namespace name cannot be empty. |
| 5009 | 403 | The user needs to have namespace read access to perform that action. |
| 5010 | 403 | This team does not have access to that namespace. |
| 5011 | 409 | This user has already access to that namespace. |
| 5012 | 412 | The namespace is archived and can therefore only be accessed read only. |
## Team
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 6001 | 400 | The team name cannot be emtpy. |
| 6002 | 404 | The team does not exist. |
| 6004 | 409 | The team already has access to that namespace or list. |
| 6005 | 409 | The user is already a member of that team. |
| 6006 | 400 | Cannot delete the last team member. |
| 6007 | 403 | The team does not have access to the list to perform that action. |
## User List Access
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 7002 | 409 | The user already has access to that list. |
| 7003 | 403 | The user does not have access to that list. |
## Label
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 8001 | 403 | This label already exists on that task. |
| 8002 | 404 | The label does not exist. |
| 8003 | 403 | The user does not have access to this label. |
## Right
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 9001 | 403 | The right is invalid. |
## Kanban
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 10001 | 404 | The bucket does not exist. |
| 10002 | 400 | The bucket does not belong to that list. |
| 10003 | 412 | You cannot remove the last bucket on a list. |
| 10004 | 412 | You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold. |
## Saved Filters
| ErrorCode | HTTP Status Code | Description |
|-----------|------------------|-------------|
| 11001 | 404 | The saved filter does not exist. |
| 11002 | 412 | Saved filters are not available for link shares. |
+25
View File
@@ -0,0 +1,25 @@
---
date: "2019-09-25:00:00+02:00"
title: "Task Relation kinds"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# Available task relation kinds
| Code | Description |
|------|-------------|
| subtask | Task is a subtask of the other task. This is the opposite of `parenttask`. |
| parenttask | Task is a parent task of the other task. This is the opposite of `subtask`. |
| related | Both tasks are related to each other. How is not more specified. |
| duplicateof | Task is a duplicate of the other task. This is the opposite of `duplicates`. |
| duplicates | Task duplicates the other task. This is the opposite of `duplicateof`. |
| blocking | Task is blocking the other task. This is the opposite of `blocked`. |
| blocked | Task is blocked by the other task. This is the opposite of `blocking`. |
| precedes | Task precedes the other task. This is the opposite of `follows`. |
| follows | Task follows the other task. This is the opposite of `precedes`. |
| copiedfrom | Task is copied from the other task. This is the opposite of `copiedto`. |
| copiedto | Task is copied to the other task. This is the opposite of `copiedfrom`. |
+29
View File
@@ -0,0 +1,29 @@
---
date: "2019-02-12:00:00+02:00"
title: "Rights"
draft: false
type: "doc"
menu:
sidebar:
parent: "usage"
---
# List and namespace rights for teams and users
Whenever you share a list or namespace with a user or team, you can specify a `rights` parameter.
This parameter controls the rights that team or user is going to have (or has, if you request the current sharing status).
Rights are being specified using integers.
The following values are possible:
| Right (int) | Meaning |
|-------------|---------|
| 0 (Default) | Read only. Anything which is shared with this right cannot be edited. |
| 1 | Read and write. Namespaces or lists shared with this right can be read and written to by the team or user. |
| 2 | Admin. Can do anything like read and write, but can additionally manage sharing options. |
## Team admins
When adding or querying a team, every member has an additional boolean value stating if it is admin or not.
A team admin can also add and remove team members and also change whether a user in the team is admin or not.
+21
View File
@@ -0,0 +1,21 @@
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /docs/404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /docs/contact {
return 301 $scheme://vikunja.io/en/contact;
}
}
Vendored Submodule
+1
Submodule docs/themes/vikunja added at 958219fc84
+101
View File
@@ -0,0 +1,101 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
module code.vikunja.io/api
require (
4d63.com/tz v1.2.0
code.vikunja.io/web v0.0.0-20200809154828-8767618f181f
gitea.com/xorm/xorm-redis-cache v0.2.0
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
github.com/beevik/etree v1.1.0 // indirect
github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2
github.com/client9/misspell v0.3.4
github.com/cweill/gotests v1.5.3
github.com/d4l3k/messagediff v1.2.1 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/disintegration/imaging v1.6.2
github.com/fzipp/gocyclo v0.3.0
github.com/gabriel-vasile/mimetype v1.1.1
github.com/getsentry/sentry-go v0.7.0
github.com/go-errors/errors v1.1.1
github.com/go-openapi/swag v0.19.9 // indirect
github.com/go-redis/redis/v7 v7.4.0
github.com/go-sql-driver/mysql v1.5.0
github.com/go-testfixtures/testfixtures/v3 v3.4.1
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/google/go-cmp v0.5.2 // indirect
github.com/gordonklaus/ineffassign v0.0.0-20200809085317-e36bfde3bb78
github.com/iancoleman/strcase v0.1.2
github.com/imdario/mergo v0.3.11
github.com/jgautheron/goconst v0.0.0-20200920201509-8f5268ce89d5
github.com/kr/text v0.2.0 // indirect
github.com/labstack/echo/v4 v4.1.17
github.com/labstack/gommon v0.3.0
github.com/laurent22/ical-go v0.1.1-0.20181107184520-7e5d6ade8eef
github.com/lib/pq v1.8.0
github.com/magefile/mage v1.10.0
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-sqlite3 v1.14.4
github.com/mitchellh/mapstructure v1.3.2 // indirect
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/olekukonko/tablewriter v0.0.4
github.com/onsi/ginkgo v1.13.0 // indirect
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
github.com/pelletier/go-toml v1.8.0 // indirect
github.com/pquerna/otp v1.2.0
github.com/prometheus/client_golang v1.8.0
github.com/samedi/caldav-go v3.0.0+incompatible
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546
github.com/spf13/afero v1.4.1
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/cobra v1.1.1
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/viper v1.7.1
github.com/stretchr/testify v1.6.1
github.com/swaggo/swag v1.6.8
github.com/ulule/limiter/v3 v3.5.0
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5
golang.org/x/lint v0.0.0-20200302205851-738671d3881b
golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 // indirect
golang.org/x/sync v0.0.0-20201008141435-b3e1573b7520
golang.org/x/tools v0.0.0-20201017001424-6003fad69a88 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/d4l3k/messagediff.v1 v1.2.1
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.57.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c
honnef.co/go/tools v0.0.1-2020.1.5
src.techknowlogick.com/xgo v1.1.1-0.20200811225412-bff6512e7c9c
src.techknowlogick.com/xormigrate v1.3.0
xorm.io/builder v0.3.7
xorm.io/core v0.7.3
xorm.io/xorm v1.0.2
)
replace (
github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.4
github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0
github.com/hpcloud/tail => github.com/jeffbean/tail v1.0.1 // See https://github.com/hpcloud/tail/pull/159
github.com/samedi/caldav-go => github.com/kolaente/caldav-go v3.0.1-0.20190524174923-9e5cd1688227+incompatible // Branch: feature/dynamic-supported-components, PR: https://github.com/samedi/caldav-go/pull/6 and https://github.com/samedi/caldav-go/pull/7
gopkg.in/fsnotify.v1 => github.com/kolaente/fsnotify v1.4.10-0.20200411160148-1bc3c8ff4048 // See https://github.com/fsnotify/fsnotify/issues/328 and https://github.com/golang/go/issues/26904
)
go 1.13
+1145
View File
File diff suppressed because it is too large Load Diff
+925
View File
@@ -0,0 +1,925 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// +build mage
package main
import (
"bufio"
"bytes"
"context"
"crypto/sha256"
"fmt"
"github.com/magefile/mage/mg"
"golang.org/x/sync/errgroup"
"gopkg.in/yaml.v3"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"time"
)
const (
PACKAGE = `code.vikunja.io/api`
DIST = `dist`
)
var (
Goflags = []string{
"-v",
}
Executable = "vikunja"
Ldflags = ""
Tags = ""
VersionNumber = "dev"
Version = "master" // This holds the built version, master by default, when building from a tag or release branch, their name
BinLocation = ""
PkgVersion = "master"
ApiPackages = []string{}
RootPath = ""
GoFiles = []string{}
// Aliases are mage aliases of targets
Aliases = map[string]interface{}{
"build": Build.Build,
"do-the-swag": DoTheSwag,
"check:got-swag": Check.GotSwag,
"release:os-package": Release.OsPackage,
"dev:create-migration": Dev.CreateMigration,
"generate-docs": GenerateDocs,
}
)
func setVersion() {
versionCmd := exec.Command("git", "describe", "--tags", "--always", "--abbrev=10")
version, err := versionCmd.Output()
if err != nil {
fmt.Printf("Error getting version: %s\n", err)
os.Exit(1)
}
VersionNumber = strings.Trim(string(version), "\n")
VersionNumber = strings.Replace(VersionNumber, "-", "+", 1)
VersionNumber = strings.Replace(VersionNumber, "-g", "-", 1)
if os.Getenv("DRONE_TAG") != "" {
Version = os.Getenv("DRONE_TAG")
} else if os.Getenv("DRONE_BRANCH") != "" {
Version = strings.Replace(os.Getenv("DRONE_BRANCH"), "release/v", "", 1)
}
}
func setBinLocation() {
if os.Getenv("DRONE_WORKSPACE") != "" {
BinLocation = DIST + `/binaries/` + Executable + `-` + Version + `-linux-amd64`
} else {
BinLocation = Executable
}
}
func setPkgVersion() {
if Version == "master" {
PkgVersion = VersionNumber
}
}
func setExecutable() {
if runtime.GOOS == "windows" {
Executable += ".exe"
}
}
func setApiPackages() {
cmd := exec.Command("go", "list", "all")
pkgs, err := cmd.Output()
if err != nil {
fmt.Printf("Error getting packages: %s\n", err)
os.Exit(1)
}
for _, p := range strings.Split(string(pkgs), "\n") {
if strings.Contains(p, "code.vikunja.io/api") && !strings.Contains(p, "code.vikunja.io/api/pkg/integrations") {
ApiPackages = append(ApiPackages, p)
}
}
}
func setRootPath() {
pwd, err := os.Getwd()
if err != nil {
fmt.Printf("Error getting pwd: %s\n", err)
os.Exit(1)
}
if err := os.Setenv("VIKUNJA_SERVICE_ROOTPATH", pwd); err != nil {
fmt.Printf("Error setting root path: %s\n", err)
os.Exit(1)
}
RootPath = pwd
}
func setGoFiles() {
// GOFILES := $(shell find . -name "*.go" -type f ! -path "*/bindata.go")
cmd := exec.Command("find", ".", "-name", "*.go", "-type", "f", "!", "-path", "*/bindata.go")
files, err := cmd.Output()
if err != nil {
fmt.Printf("Error getting go files: %s\n", err)
os.Exit(1)
}
for _, f := range strings.Split(string(files), "\n") {
if strings.HasSuffix(f, ".go") {
GoFiles = append(GoFiles, RootPath+strings.TrimLeft(f, "."))
}
}
}
// Some variables can always get initialized, so we do just that.
func init() {
setExecutable()
setRootPath()
}
// Some variables have external dependencies (like git) which may not always be available.
func initVars() {
Tags = os.Getenv("TAGS")
setVersion()
setBinLocation()
setPkgVersion()
setApiPackages()
setGoFiles()
Ldflags = `-X "` + PACKAGE + `/pkg/version.Version=` + VersionNumber + `" -X "main.Tags=` + Tags + `"`
}
func runAndStreamOutput(cmd string, args ...string) {
c := exec.Command(cmd, args...)
c.Env = os.Environ()
c.Dir = RootPath
fmt.Printf("%s\n\n", c.String())
stdout, _ := c.StdoutPipe()
errbuf := bytes.Buffer{}
c.Stderr = &errbuf
c.Start()
reader := bufio.NewReader(stdout)
line, err := reader.ReadString('\n')
for err == nil {
fmt.Print(line)
line, err = reader.ReadString('\n')
}
if err := c.Wait(); err != nil {
fmt.Printf(errbuf.String())
fmt.Printf("Error: %s\n", err)
os.Exit(1)
}
}
// Will check if the tool exists and if not install it from the provided import path
// If any errors occur, it will exit with a status code of 1.
func checkAndInstallGoTool(tool, importPath string) {
if err := exec.Command(tool).Run(); err != nil && strings.Contains(err.Error(), "executable file not found") {
fmt.Printf("%s not installed, installing %s...\n", tool, importPath)
if err := exec.Command("go", "install", Goflags[0], importPath).Run(); err != nil {
fmt.Printf("Error installing %s\n", tool)
os.Exit(1)
}
fmt.Println("Installed.")
}
}
// Calculates a hash of a file
func calculateSha256FileHash(path string) (hash string, err error) {
f, err := os.Open(path)
if err != nil {
return "", err
}
defer f.Close()
h := sha256.New()
if _, err := io.Copy(h, f); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
// Copy the src file to dst. Any existing file will be overwritten and will not
// copy file attributes.
func copyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
si, err := os.Stat(src)
if err != nil {
return err
}
if err := os.Chmod(dst, si.Mode()); err != nil {
return err
}
return out.Close()
}
// os.Rename has issues with moving files between docker volumes.
// Because of this limitaion, it fails in drone.
// Source: https://gist.github.com/var23rav/23ae5d0d4d830aff886c3c970b8f6c6b
func moveFile(src, dst string) error {
inputFile, err := os.Open(src)
defer inputFile.Close()
if err != nil {
return fmt.Errorf("couldn't open source file: %s", err)
}
outputFile, err := os.Create(dst)
defer outputFile.Close()
if err != nil {
return fmt.Errorf("couldn't open dest file: %s", err)
}
_, err = io.Copy(outputFile, inputFile)
if err != nil {
return fmt.Errorf("writing to output file failed: %s", err)
}
// Make sure to copy copy the permissions of the original file as well
si, err := os.Stat(src)
if err != nil {
return err
}
if err := os.Chmod(dst, si.Mode()); err != nil {
return err
}
// The copy was successful, so now delete the original file
err = os.Remove(src)
if err != nil {
return fmt.Errorf("failed removing original file: %s", err)
}
return nil
}
// Formats the code using go fmt
func Fmt() {
mg.Deps(initVars)
args := append([]string{"-s", "-w"}, GoFiles...)
runAndStreamOutput("gofmt", args...)
}
// Generates the swagger docs from the code annotations
func DoTheSwag() {
mg.Deps(initVars)
checkAndInstallGoTool("swag", "github.com/swaggo/swag/cmd/swag")
runAndStreamOutput("swag", "init", "-g", "./pkg/routes/routes.go", "--parseDependency", "-d", RootPath, "-o", RootPath+"/pkg/swagger")
}
type Test mg.Namespace
// Runs all tests except integration tests
func (Test) Unit() {
mg.Deps(initVars)
// We run everything sequentially and not in parallel to prevent issues with real test databases
args := append([]string{"test", Goflags[0], "-p", "1"}, ApiPackages...)
runAndStreamOutput("go", args...)
}
// Runs the tests and builds the coverage html file from coverage output
func (Test) Coverage() {
mg.Deps(initVars)
mg.Deps(Test.Unit)
runAndStreamOutput("go", "tool", "cover", "-html=cover.out", "-o", "cover.html")
}
// Runs the integration tests
func (Test) Integration() {
mg.Deps(initVars)
// We run everything sequentially and not in parallel to prevent issues with real test databases
runAndStreamOutput("go", "test", Goflags[0], "-p", "1", PACKAGE+"/pkg/integrations")
}
type Check mg.Namespace
// Checks if the swagger docs need to be re-generated from the code annotations
func (Check) GotSwag() {
mg.Deps(initVars)
// The check is pretty cheaply done: We take the hash of the swagger.json file, generate the docs,
// hash the file again and compare the two hashes to see if anything changed. If that's the case,
// regenerating the docs is necessary.
// swag is not capable of just outputting the generated docs to stdout, therefore we need to do it this way.
// Another drawback of this is obviously it will only work once - we're not resetting the newly generated
// docs after the check. This behaviour is good enough for ci though.
oldHash, err := calculateSha256FileHash(RootPath + "/pkg/swagger/swagger.json")
if err != nil {
fmt.Printf("Error getting old hash of the swagger docs: %s", err)
os.Exit(1)
}
DoTheSwag()
newHash, err := calculateSha256FileHash(RootPath + "/pkg/swagger/swagger.json")
if err != nil {
fmt.Printf("Error getting new hash of the swagger docs: %s", err)
os.Exit(1)
}
if oldHash != newHash {
fmt.Println("Swagger docs are not up to date.")
fmt.Println("Please run 'mage do-the-swag' and commit the result.")
os.Exit(1)
}
}
func checkGolangCiLintInstalled() {
mg.Deps(initVars)
if err := exec.Command("golangci-lint").Run(); err != nil && strings.Contains(err.Error(), "executable file not found") {
fmt.Println("Please manually install golangci-lint by running")
fmt.Println("curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.31.0")
os.Exit(1)
}
}
func (Check) Golangci() {
checkGolangCiLintInstalled()
runAndStreamOutput("golangci-lint", "run")
}
func (Check) GolangciFix() {
checkGolangCiLintInstalled()
runAndStreamOutput("golangci-lint", "run", "--fix")
}
// Runs fmt-check, lint, got-swag, misspell-check, ineffasign-check, gocyclo-check, static-check, gosec-check, goconst-check all in parallel
func (Check) All() {
mg.Deps(initVars)
mg.Deps(
Check.Golangci,
Check.GotSwag,
)
}
type Build mg.Namespace
// Cleans all build, executable and bindata files
func (Build) Clean() error {
mg.Deps(initVars)
if err := exec.Command("go", "clean", "./...").Run(); err != nil {
return err
}
if err := os.Remove(Executable); err != nil && !os.IsNotExist(err) {
return err
}
if err := os.RemoveAll(DIST); err != nil && !os.IsNotExist(err) {
return err
}
if err := os.RemoveAll(BinLocation); err != nil && !os.IsNotExist(err) {
return err
}
return nil
}
// Generates static content into the final binary
func (Build) Generate() {
mg.Deps(initVars)
runAndStreamOutput("go", "generate", PACKAGE+"/pkg/static")
}
// Builds a vikunja binary, ready to run
func (Build) Build() {
mg.Deps(initVars)
mg.Deps(Build.Generate)
runAndStreamOutput("go", "build", Goflags[0], "-tags", Tags, "-ldflags", "-s -w "+Ldflags, "-o", Executable)
}
type Release mg.Namespace
// Runs all steps in the right order to create release packages for various platforms
func (Release) Release(ctx context.Context) error {
mg.Deps(initVars)
mg.Deps(Build.Generate, Release.Dirs)
mg.Deps(Release.Windows, Release.Linux, Release.Darwin)
// Run compiling in parallel to speed it up
errs, _ := errgroup.WithContext(ctx)
errs.Go((Release{}).Windows)
errs.Go((Release{}).Linux)
errs.Go((Release{}).Darwin)
if err := errs.Wait(); err != nil {
return err
}
if err := (Release{}).Compress(ctx); err != nil {
return err
}
if err := (Release{}).Copy(); err != nil {
return err
}
if err := (Release{}).Check(); err != nil {
return err
}
if err := (Release{}).OsPackage(); err != nil {
return err
}
if err := (Release{}).Zip(); err != nil {
return err
}
return nil
}
// Creates all directories needed to release vikunja
func (Release) Dirs() error {
for _, d := range []string{"binaries", "release", "zip"} {
if err := os.MkdirAll(RootPath+"/"+DIST+"/"+d, 0755); err != nil {
return err
}
}
return nil
}
func runXgo(targets string) error {
mg.Deps(initVars)
checkAndInstallGoTool("xgo", "src.techknowlogick.com/xgo")
extraLdflags := `-linkmode external -extldflags "-static" `
// See https://github.com/techknowlogick/xgo/issues/79
if strings.HasPrefix(targets, "darwin") {
extraLdflags = ""
}
runAndStreamOutput("xgo",
"-dest", RootPath+"/"+DIST+"/binaries",
"-tags", "netgo "+Tags,
"-ldflags", extraLdflags+Ldflags,
"-targets", targets,
"-out", Executable+"-"+Version,
RootPath)
if os.Getenv("DRONE_WORKSPACE") != "" {
return filepath.Walk("/build/", func(path string, info os.FileInfo, err error) error {
// Skip directories
if info.IsDir() {
return nil
}
return moveFile(path, RootPath+"/"+DIST+"/binaries/"+info.Name())
})
}
return nil
}
// Builds binaries for windows
func (Release) Windows() error {
return runXgo("windows/*")
}
// Builds binaries for linux
func (Release) Linux() error {
return runXgo("linux/*")
}
// Builds binaries for darwin
func (Release) Darwin() error {
return runXgo("darwin/*")
}
// Compresses the built binaries in dist/binaries/ to reduce their filesize
func (Release) Compress(ctx context.Context) error {
// $(foreach file,$(filter-out $(wildcard $(wildcard $(DIST)/binaries/$(EXECUTABLE)-*mips*)),$(wildcard $(DIST)/binaries/$(EXECUTABLE)-*)), upx -9 $(file);)
errs, _ := errgroup.WithContext(ctx)
filepath.Walk(RootPath+"/"+DIST+"/binaries/", func(path string, info os.FileInfo, err error) error {
// Only executable files
if !strings.Contains(info.Name(), Executable) {
return nil
}
// No mips or s390x for you today
if strings.Contains(info.Name(), "mips") || strings.Contains(info.Name(), "s390x") {
return nil
}
// Runs compressing in parallel since upx is single-threaded
errs.Go(func() error {
runAndStreamOutput("chmod", "+x", path) // Make sure all binaries are executable. Sometimes the CI does weired things and they're not.
runAndStreamOutput("upx", "-9", path)
return nil
})
return nil
})
return errs.Wait()
}
// Copies all built binaries to dist/release/ in preparation for creating the os packages
func (Release) Copy() error {
return filepath.Walk(RootPath+"/"+DIST+"/binaries/", func(path string, info os.FileInfo, err error) error {
// Only executable files
if !strings.Contains(info.Name(), Executable) {
return nil
}
return copyFile(path, RootPath+"/"+DIST+"/release/"+info.Name())
})
}
// Creates sha256 checksum files for each binary in dist/release/
func (Release) Check() error {
p := RootPath + "/" + DIST + "/release/"
return filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
f, err := os.Create(p + info.Name() + ".sha256")
if err != nil {
return err
}
hash, err := calculateSha256FileHash(path)
if err != nil {
return err
}
_, err = f.WriteString(hash + " " + info.Name())
if err != nil {
return err
}
return f.Close()
})
}
// Creates a folder for each
func (Release) OsPackage() error {
p := RootPath + "/" + DIST + "/release/"
// We first put all files in a map to then iterate over it since the walk function would otherwise also iterate
// over the newly created files, creating some kind of endless loop.
bins := make(map[string]os.FileInfo)
if err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
if strings.Contains(info.Name(), ".sha256") || info.IsDir() {
return nil
}
bins[path] = info
return nil
}); err != nil {
return err
}
for path, info := range bins {
folder := p + info.Name() + "-full/"
if err := os.Mkdir(folder, 0755); err != nil {
return err
}
if err := moveFile(p+info.Name()+".sha256", folder+info.Name()+".sha256"); err != nil {
return err
}
if err := moveFile(path, folder+info.Name()); err != nil {
return err
}
if err := copyFile(RootPath+"/config.yml.sample", folder+"config.yml.sample"); err != nil {
return err
}
if err := copyFile(RootPath+"/LICENSE", folder+"LICENSE"); err != nil {
return err
}
}
return nil
}
// Creates a zip file from all os-package folders in dist/release
func (Release) Zip() error {
p := RootPath + "/" + DIST + "/release/"
if err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() || info.Name() == "release" {
return nil
}
fmt.Printf("Zipping %s...\n", info.Name())
c := exec.Command("zip", "-r", RootPath+"/"+DIST+"/zip/"+info.Name(), ".", "-i", "*")
c.Dir = path
out, err := c.Output()
fmt.Print(string(out))
return err
}); err != nil {
return err
}
return nil
}
// Creates a debian repo structure
func (Release) Reprepro() {
mg.Deps(setVersion, setBinLocation)
runAndStreamOutput("reprepro_expect", "debian", "includedeb", "strech", RootPath+"/"+DIST+"/os-packages/"+Executable+"_"+strings.ReplaceAll(VersionNumber, "v0", "0")+"_amd64.deb")
}
// Creates deb, rpm and apk packages
func (Release) Packages() error {
mg.Deps(initVars)
var err error
binpath := "nfpm"
err = exec.Command(binpath).Run()
if err != nil && strings.Contains(err.Error(), "executable file not found") {
binpath = "/nfpm"
err = exec.Command(binpath).Run()
}
if err != nil && strings.Contains(err.Error(), "executable file not found") {
fmt.Println("Please manually install nfpm by running")
fmt.Println("curl -sfL https://install.goreleaser.com/github.com/goreleaser/nfpm.sh | sh -s -- -b $(go env GOPATH)/bin")
os.Exit(1)
}
// Because nfpm does not support templating, we replace the values in the config file and restore it after running
nfpmConfigPath := RootPath + "/nfpm.yaml"
nfpmconfig, err := ioutil.ReadFile(nfpmConfigPath)
if err != nil {
return err
}
fixedConfig := strings.ReplaceAll(string(nfpmconfig), "<version>", VersionNumber)
fixedConfig = strings.ReplaceAll(fixedConfig, "<binlocation>", BinLocation)
if err := ioutil.WriteFile(nfpmConfigPath, []byte(fixedConfig), 0); err != nil {
return err
}
releasePath := RootPath + "/" + DIST + "/os-packages/"
if err := os.MkdirAll(releasePath, 0755); err != nil {
return err
}
runAndStreamOutput(binpath, "pkg", "--packager", "deb", "--target", releasePath)
runAndStreamOutput(binpath, "pkg", "--packager", "rpm", "--target", releasePath)
runAndStreamOutput(binpath, "pkg", "--packager", "apk", "--target", releasePath)
return ioutil.WriteFile(nfpmConfigPath, nfpmconfig, 0)
}
type Dev mg.Namespace
// Creates a new bare db migration skeleton in pkg/migration with the current date
func (Dev) CreateMigration() error {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter the name of the struct: ")
str, _ := reader.ReadString('\n')
str = strings.Trim(str, "\n")
date := time.Now().Format("20060102150405")
migration := `// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package migration
import (
"src.techknowlogick.com/xormigrate"
"xorm.io/xorm"
)
type ` + str + date + ` struct {
}
func (` + str + date + `) TableName() string {
return "` + str + `"
}
func init() {
migrations = append(migrations, &xormigrate.Migration{
ID: "` + date + `",
Description: "",
Migrate: func(tx *xorm.Engine) error {
return tx.Sync2(` + str + date + `{})
},
Rollback: func(tx *xorm.Engine) error {
return nil
},
})
}
`
f, err := os.Create(RootPath + "/pkg/migration/" + date + ".go")
defer f.Close()
if err != nil {
return err
}
_, err = f.WriteString(migration)
return err
}
type configOption struct {
key string
description string
defaultValue string
children []*configOption
}
func parseYamlConfigNode(node *yaml.Node) (config *configOption) {
config = &configOption{
key: node.Value,
description: strings.ReplaceAll(node.HeadComment, "# ", ""),
}
valMap := make(map[string]*configOption)
var lastOption *configOption
for i, n2 := range node.Content {
coo := &configOption{
key: n2.Value,
description: strings.ReplaceAll(n2.HeadComment, "# ", ""),
}
// If there's a key in valMap for the current key we should use that to append etc
// Else we just create a new configobject
co, exists := valMap[n2.Value]
if exists {
co.description = coo.description
} else {
valMap[n2.Value] = coo
config.children = append(config.children, coo)
}
// fmt.Println(i, coo.key, coo.description, n2.Value)
if i%2 == 0 {
lastOption = coo
continue
} else {
lastOption.defaultValue = n2.Value
}
if i-1 >= 0 && i-1 <= len(node.Content) && node.Content[i-1].Value != "" {
coo.defaultValue = n2.Value
coo.key = node.Content[i-1].Value
}
if len(n2.Content) > 0 {
for _, n := range n2.Content {
coo.children = append(coo.children, parseYamlConfigNode(n))
}
}
}
return config
}
func printConfig(config []*configOption, level int) (rendered string) {
// Keep track of what we already printed to prevent printing things twice
printed := make(map[string]bool)
for _, option := range config {
if option.key != "" {
// Filter out all config objects where the default value == key
// Yaml is weired: It gives you a slice with an entry each for the key and their value.
if printed[option.key] {
continue
}
if level == 0 {
rendered += "---\n\n"
}
rendered += "#"
for i := 0; i <= level; i++ {
rendered += "#"
}
rendered += " " + option.key + "\n\n"
if option.description != "" {
rendered += option.description + "\n\n"
}
// Top level config values never have a default value
if level > 0 {
rendered += "Default: `" + option.defaultValue
if option.defaultValue == "" {
rendered += "<empty>"
}
rendered += "`\n"
}
}
printed[option.key] = true
rendered += "\n" + printConfig(option.children, level+1)
}
return
}
const (
configDocPath = `docs/content/doc/setup/config.md`
configInjectComment = `<!-- Generated config will be injected here -->`
)
// Generates the error docs from a commented config.yml.sample file in the repo root.
func GenerateDocs() error {
config, err := ioutil.ReadFile("config.yml.sample")
if err != nil {
return err
}
var d yaml.Node
err = yaml.Unmarshal(config, &d)
if err != nil {
return err
}
conf := []*configOption{}
for _, node := range d.Content {
for _, n := range node.Content {
co := parseYamlConfigNode(n)
conf = append(conf, co)
}
}
renderedConfig := printConfig(conf, 0)
// Rebuild the config
file, err := os.OpenFile(configDocPath, os.O_RDWR, 0)
if err != nil {
return err
}
defer file.Close()
// We read the config doc up until the marker, then stop and append our generated config
fullConfig := ""
scanner := bufio.NewScanner(file)
for scanner.Scan() {
t := scanner.Text()
fullConfig += t + "\n"
if t == configInjectComment {
break
}
}
if err := scanner.Err(); err != nil {
return err
}
fullConfig += "\n" + renderedConfig
// We write the full file to prevent old content leftovers at the end
// I know, there are probably better ways to do this.
if err := ioutil.WriteFile(configDocPath, []byte(fullConfig), 0); err != nil {
return err
}
return nil
}
+23
View File
@@ -0,0 +1,23 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package main
import "code.vikunja.io/api/pkg/cmd"
func main() {
cmd.Execute()
}
-68
View File
@@ -1,68 +0,0 @@
const {app, BrowserWindow, shell} = require('electron')
const path = require('path')
const express = require('express')
const eApp = express()
const portInUse = require('./portInUse.js')
const frontendPath = 'frontend/'
function createWindow() {
// Create the browser window.
const mainWindow = new BrowserWindow({
width: 1680,
height: 960,
webPreferences: {
nodeIntegration: true,
}
})
// Open external links in the browser
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
shell.openExternal(url);
return { action: 'deny' };
});
// Hide the toolbar
mainWindow.setMenuBarVisibility(false)
// We try to use the same port every time and only use a different one if that does not succeed.
let port = 45735
portInUse(port, used => {
if(used) {
console.log(`Port ${port} already used, switching to a random one`)
port = 0 // This lets express choose a random port
}
// Start a local express server to serve static files
eApp.use(express.static(path.join(__dirname, frontendPath)))
// Handle urls set by the frontend
eApp.get('*', (request, response, next) => {
response.sendFile(`${__dirname}/${frontendPath}index.html`);
})
const server = eApp.listen(port, '127.0.0.1', () => {
console.log(`Server started on port ${server.address().port}`)
mainWindow.loadURL(`http://127.0.0.1:${server.address().port}`)
})
})
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
createWindow()
app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})
+18
View File
@@ -0,0 +1,18 @@
name: "vikunja"
arch: "amd64"
platform: "linux"
version: "<version>"
description: "Vikunja is an open-source todo application, written in Go. It lets you create lists,tasks and share them via teams or directly between users."
maintainer: "Vikunja Maintainers <maintainers@vikunja.io>"
homepage: "https://vikunja.io"
section: "default"
priority: "extra"
license: "GPLv3"
files:
<binlocation>: /opt/vikunja/vikunja
config_files:
./config.yml.sample: /etc/vikunja/config.yml
symlinks:
/opt/vikunja/vikunja: /usr/local/bin/vikunja
scripts:
postinstall: ./build/after-install.sh
-61
View File
@@ -1,61 +0,0 @@
{
"name": "vikunja-desktop",
"version": "0.21.0",
"description": "Vikunja's frontend as a standalone desktop application.",
"main": "main.js",
"repository": "https://code.vikunja.io/desktop",
"license": "GPL-3.0-or-later",
"author": {
"email": "maintainers@vikunja.io",
"name": "Vikunja Team"
},
"homepage": "https://vikunja.io",
"scripts": {
"start": "electron .",
"pack": "electron-builder --dir",
"dist": "electron-builder"
},
"build": {
"appId": "io.vikunja.desktop",
"productName": "Vikunja Desktop",
"artifactName": "${productName}-${version}.${ext}",
"icon": "build/icon.icns",
"linux": {
"target": [
"deb",
"AppImage",
"snap",
"pacman",
"apk",
"freebsd",
"rpm",
"zip",
"tar.gz"
],
"category": "Productivity"
},
"win": {
"target": [
"nsis",
"portable",
"msi",
"zip"
]
},
"mac": {
"category": "public.app-category.productivity",
"target": [
"dmg",
"zip"
]
}
},
"devDependencies": {
"electron": "25.2.0",
"electron-builder": "24.4.0"
},
"dependencies": {
"connect-history-api-fallback": "^2.0.0",
"express": "^4.17.1"
}
}
+220
View File
@@ -0,0 +1,220 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package caldav
import (
"fmt"
"strconv"
"strings"
"time"
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/user"
"code.vikunja.io/api/pkg/utils"
)
// DateFormat is the caldav date format
const DateFormat = `20060102T150405`
// Event holds a single caldav event
type Event struct {
Summary string
Description string
UID string
Alarms []Alarm
Timestamp time.Time
Start time.Time
End time.Time
}
// Todo holds a single VTODO
type Todo struct {
// Required
Timestamp time.Time
UID string
// Optional
Summary string
Description string
Completed time.Time
Organizer *user.User
Priority int64 // 0-9, 1 is highest
RelatedToUID string
Start time.Time
End time.Time
DueDate time.Time
Duration time.Duration
Created time.Time
Updated time.Time // last-mod
}
// Alarm holds infos about an alarm from a caldav event
type Alarm struct {
Time time.Time
Description string
}
// Config is the caldav calendar config
type Config struct {
Name string
ProdID string
}
// ParseEvents parses an array of caldav events and gives them back as string
func ParseEvents(config *Config, events []*Event) (caldavevents string) {
caldavevents += `BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
X-PUBLISHED-TTL:PT4H
X-WR-CALNAME:` + config.Name + `
PRODID:-//` + config.ProdID + `//EN`
for _, e := range events {
if e.UID == "" {
e.UID = makeCalDavTimeFromTimeStamp(e.Timestamp) + utils.Sha256(e.Summary)
}
caldavevents += `
BEGIN:VEVENT
UID:` + e.UID + `
SUMMARY:` + e.Summary + `
DESCRIPTION:` + e.Description + `
DTSTAMP:` + makeCalDavTimeFromTimeStamp(e.Timestamp) + `
DTSTART:` + makeCalDavTimeFromTimeStamp(e.Start) + `
DTEND:` + makeCalDavTimeFromTimeStamp(e.End)
for _, a := range e.Alarms {
if a.Description == "" {
a.Description = e.Summary
}
caldavevents += `
BEGIN:VALARM
TRIGGER:` + calcAlarmDateFromReminder(e.Start, a.Time) + `
ACTION:DISPLAY
DESCRIPTION:` + a.Description + `
END:VALARM`
}
caldavevents += `
END:VEVENT`
}
caldavevents += `
END:VCALENDAR` // Need a line break
return
}
// ParseTodos returns a caldav vcalendar string with todos
func ParseTodos(config *Config, todos []*Todo) (caldavtodos string) {
caldavtodos = `BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
X-PUBLISHED-TTL:PT4H
X-WR-CALNAME:` + config.Name + `
PRODID:-//` + config.ProdID + `//EN`
for _, t := range todos {
if t.UID == "" {
t.UID = makeCalDavTimeFromTimeStamp(t.Timestamp) + utils.Sha256(t.Summary)
}
caldavtodos += `
BEGIN:VTODO
UID:` + t.UID + `
DTSTAMP:` + makeCalDavTimeFromTimeStamp(t.Timestamp) + `
SUMMARY:` + t.Summary
if t.Start.Unix() > 0 {
caldavtodos += `
DTSTART: ` + makeCalDavTimeFromTimeStamp(t.Start)
}
if t.End.Unix() > 0 {
caldavtodos += `
DTEND: ` + makeCalDavTimeFromTimeStamp(t.End)
}
if t.Description != "" {
caldavtodos += `
DESCRIPTION:` + t.Description
}
if t.Completed.Unix() > 0 {
caldavtodos += `
COMPLETED: ` + makeCalDavTimeFromTimeStamp(t.Completed)
}
if t.Organizer != nil {
caldavtodos += `
ORGANIZER;CN=:` + t.Organizer.Username
}
if t.RelatedToUID != "" {
caldavtodos += `
RELATED-TO:` + t.RelatedToUID
}
if t.DueDate.Unix() > 0 {
caldavtodos += `
DUE:` + makeCalDavTimeFromTimeStamp(t.DueDate)
}
if t.Created.Unix() > 0 {
caldavtodos += `
CREATED:` + makeCalDavTimeFromTimeStamp(t.Created)
}
if t.Duration != 0 {
caldavtodos += `
DURATION:PT` + fmt.Sprintf("%.6f", t.Duration.Hours()) + `H` + fmt.Sprintf("%.6f", t.Duration.Minutes()) + `M` + fmt.Sprintf("%.6f", t.Duration.Seconds()) + `S`
}
if t.Priority != 0 {
caldavtodos += `
PRIORITY:` + strconv.Itoa(int(t.Priority))
}
caldavtodos += `
LAST-MODIFIED:` + makeCalDavTimeFromTimeStamp(t.Updated)
caldavtodos += `
END:VTODO`
}
caldavtodos += `
END:VCALENDAR` // Need a line break
return
}
func makeCalDavTimeFromTimeStamp(ts time.Time) (caldavtime string) {
return ts.In(config.GetTimeZone()).Format(DateFormat)
}
func calcAlarmDateFromReminder(eventStart, reminder time.Time) (alarmTime string) {
diff := reminder.Sub(eventStart)
diffStr := strings.ToUpper(diff.String())
if diff < 0 {
alarmTime += `-`
// We append the - at the beginning of the caldav flag, that would get in the way if the minutes
// themselves are also containing it
diffStr = diffStr[1:]
}
alarmTime += `PT` + diffStr
return
}
+251
View File
@@ -0,0 +1,251 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package caldav
import (
"testing"
"time"
"code.vikunja.io/api/pkg/config"
"github.com/stretchr/testify/assert"
)
func TestParseEvents(t *testing.T) {
type args struct {
config *Config
events []*Event
}
tests := []struct {
name string
args args
wantCaldavevents string
}{
{
name: "Test caldavparsing without reminders",
args: args{
config: &Config{
Name: "test",
ProdID: "RandomProdID which is not random",
},
events: []*Event{
{
Summary: "Event #1",
Description: "Lorem Ipsum",
UID: "randommduid",
Timestamp: time.Unix(1543626724, 0).In(config.GetTimeZone()),
Start: time.Unix(1543626724, 0).In(config.GetTimeZone()),
End: time.Unix(1543627824, 0).In(config.GetTimeZone()),
},
{
Summary: "Event #2",
UID: "randommduidd",
Timestamp: time.Unix(1543726724, 0).In(config.GetTimeZone()),
Start: time.Unix(1543726724, 0).In(config.GetTimeZone()),
End: time.Unix(1543738724, 0).In(config.GetTimeZone()),
},
{
Summary: "Event #3 with empty uid",
UID: "20181202T0600242aaef4a81d770c1e775e26bc5abebc87f1d3d7bffaa83",
Timestamp: time.Unix(1543726824, 0).In(config.GetTimeZone()),
Start: time.Unix(1543726824, 0).In(config.GetTimeZone()),
End: time.Unix(1543727000, 0).In(config.GetTimeZone()),
},
},
},
wantCaldavevents: `BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
X-PUBLISHED-TTL:PT4H
X-WR-CALNAME:test
PRODID:-//RandomProdID which is not random//EN
BEGIN:VEVENT
UID:randommduid
SUMMARY:Event #1
DESCRIPTION:Lorem Ipsum
DTSTAMP:20181201T011204
DTSTART:20181201T011204
DTEND:20181201T013024
END:VEVENT
BEGIN:VEVENT
UID:randommduidd
SUMMARY:Event #2
DESCRIPTION:
DTSTAMP:20181202T045844
DTSTART:20181202T045844
DTEND:20181202T081844
END:VEVENT
BEGIN:VEVENT
UID:20181202T0600242aaef4a81d770c1e775e26bc5abebc87f1d3d7bffaa83
SUMMARY:Event #3 with empty uid
DESCRIPTION:
DTSTAMP:20181202T050024
DTSTART:20181202T050024
DTEND:20181202T050320
END:VEVENT
END:VCALENDAR`,
},
{
name: "Test caldavparsing with reminders",
args: args{
config: &Config{
Name: "test2",
ProdID: "RandomProdID which is not random",
},
events: []*Event{
{
Summary: "Event #1",
Description: "Lorem Ipsum",
UID: "randommduid",
Timestamp: time.Unix(1543626724, 0).In(config.GetTimeZone()),
Start: time.Unix(1543626724, 0).In(config.GetTimeZone()),
End: time.Unix(1543627824, 0).In(config.GetTimeZone()),
Alarms: []Alarm{
{Time: time.Unix(1543626524, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626224, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626024, 0)},
},
},
{
Summary: "Event #2",
UID: "randommduidd",
Timestamp: time.Unix(1543726724, 0).In(config.GetTimeZone()),
Start: time.Unix(1543726724, 0).In(config.GetTimeZone()),
End: time.Unix(1543738724, 0).In(config.GetTimeZone()),
Alarms: []Alarm{
{Time: time.Unix(1543626524, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626224, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626024, 0).In(config.GetTimeZone())},
},
},
{
Summary: "Event #3 with empty uid",
Timestamp: time.Unix(1543726824, 0).In(config.GetTimeZone()),
Start: time.Unix(1543726824, 0).In(config.GetTimeZone()),
End: time.Unix(1543727000, 0).In(config.GetTimeZone()),
Alarms: []Alarm{
{Time: time.Unix(1543626524, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626224, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543626024, 0).In(config.GetTimeZone())},
{Time: time.Unix(1543826824, 0).In(config.GetTimeZone())},
},
},
{
Summary: "Event #4 without any",
Timestamp: time.Unix(1543726824, 0),
Start: time.Unix(1543726824, 0),
End: time.Unix(1543727000, 0),
},
},
},
wantCaldavevents: `BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
X-PUBLISHED-TTL:PT4H
X-WR-CALNAME:test2
PRODID:-//RandomProdID which is not random//EN
BEGIN:VEVENT
UID:randommduid
SUMMARY:Event #1
DESCRIPTION:Lorem Ipsum
DTSTAMP:20181201T011204
DTSTART:20181201T011204
DTEND:20181201T013024
BEGIN:VALARM
TRIGGER:-PT3M20S
ACTION:DISPLAY
DESCRIPTION:Event #1
END:VALARM
BEGIN:VALARM
TRIGGER:-PT8M20S
ACTION:DISPLAY
DESCRIPTION:Event #1
END:VALARM
BEGIN:VALARM
TRIGGER:-PT11M40S
ACTION:DISPLAY
DESCRIPTION:Event #1
END:VALARM
END:VEVENT
BEGIN:VEVENT
UID:randommduidd
SUMMARY:Event #2
DESCRIPTION:
DTSTAMP:20181202T045844
DTSTART:20181202T045844
DTEND:20181202T081844
BEGIN:VALARM
TRIGGER:-PT27H50M0S
ACTION:DISPLAY
DESCRIPTION:Event #2
END:VALARM
BEGIN:VALARM
TRIGGER:-PT27H55M0S
ACTION:DISPLAY
DESCRIPTION:Event #2
END:VALARM
BEGIN:VALARM
TRIGGER:-PT27H58M20S
ACTION:DISPLAY
DESCRIPTION:Event #2
END:VALARM
END:VEVENT
BEGIN:VEVENT
UID:20181202T0500242aaef4a81d770c1e775e26bc5abebc87f1d3d7bffaa83
SUMMARY:Event #3 with empty uid
DESCRIPTION:
DTSTAMP:20181202T050024
DTSTART:20181202T050024
DTEND:20181202T050320
BEGIN:VALARM
TRIGGER:-PT27H51M40S
ACTION:DISPLAY
DESCRIPTION:Event #3 with empty uid
END:VALARM
BEGIN:VALARM
TRIGGER:-PT27H56M40S
ACTION:DISPLAY
DESCRIPTION:Event #3 with empty uid
END:VALARM
BEGIN:VALARM
TRIGGER:-PT28H0M0S
ACTION:DISPLAY
DESCRIPTION:Event #3 with empty uid
END:VALARM
BEGIN:VALARM
TRIGGER:PT27H46M40S
ACTION:DISPLAY
DESCRIPTION:Event #3 with empty uid
END:VALARM
END:VEVENT
BEGIN:VEVENT
UID:20181202T050024ae7548ce9556df85038abe90dc674d4741a61ce74d1cf
SUMMARY:Event #4 without any
DESCRIPTION:
DTSTAMP:20181202T050024
DTSTART:20181202T050024
DTEND:20181202T050320
END:VEVENT
END:VCALENDAR`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotCaldavevents := ParseEvents(tt.args.config, tt.args.events)
assert.Equal(t, gotCaldavevents, tt.wantCaldavevents)
})
}
}
+48
View File
@@ -0,0 +1,48 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "vikunja",
Short: "Vikunja is the to-do app to organize your life.",
Long: `Vikunja (/vɪˈkuːnjə/)
The to-do app to organize your life.
Also one of the two wild South American camelids which live in the high
alpine areas of the Andes and a relative of the llama.
Vikunja is a self-hosted To-Do list application with a web app and mobile apps for all platforms. It is licensed under the GPLv3.
Find more info at vikunja.io.`,
PreRun: webCmd.PreRun,
Run: webCmd.Run,
}
// Execute starts the application
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
+44
View File
@@ -0,0 +1,44 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"time"
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/modules/dump"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(dumpCmd)
}
var dumpCmd = &cobra.Command{
Use: "dump",
Short: "Dump all vikunja data into a zip file. Includes config, files and db.",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
filename := "vikunja-dump_" + time.Now().Format("2006-01-02_15-03-05") + ".zip"
if err := dump.Dump(filename); err != nil {
log.Critical(err.Error())
}
},
}
+63
View File
@@ -0,0 +1,63 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/migration"
"github.com/spf13/cobra"
)
func init() {
migrateCmd.AddCommand(migrateListCmd)
migrationRollbackCmd.Flags().StringVarP(&rollbackUntilFlag, "name", "n", "", "The id of the migration you want to roll back until.")
_ = migrationRollbackCmd.MarkFlagRequired("name")
migrateCmd.AddCommand(migrationRollbackCmd)
rootCmd.AddCommand(migrateCmd)
}
// TODO: add args to run migrations up or down, until a certain point etc
// Rollback until
// list -> Essentially just show the table, maybe with an extra column if the migration did run or not
var migrateCmd = &cobra.Command{
Use: "migrate",
Short: "Run all database migrations which didn't already run.",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
initialize.LightInit()
},
Run: func(cmd *cobra.Command, args []string) {
migration.Migrate(nil)
},
}
var migrateListCmd = &cobra.Command{
Use: "list",
Short: "Show a list with all database migrations.",
Run: func(cmd *cobra.Command, args []string) {
migration.ListMigrations()
},
}
var rollbackUntilFlag string
var migrationRollbackCmd = &cobra.Command{
Use: "rollback",
Short: "Roll migrations back until a certain point.",
Run: func(cmd *cobra.Command, args []string) {
migration.Rollback(rollbackUntilFlag)
},
}
+42
View File
@@ -0,0 +1,42 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/modules/dump"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(restoreCmd)
}
var restoreCmd = &cobra.Command{
Use: "restore [filename]",
Short: "Restores all vikunja data from a vikunja dump.",
Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
if err := dump.Restore(args[0]); err != nil {
log.Critical(err.Error())
}
},
}
+49
View File
@@ -0,0 +1,49 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/mail"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(testmailCmd)
}
var testmailCmd = &cobra.Command{
Use: "testmail [email]",
Short: "Send a test mail using the configured smtp connection",
Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
initialize.LightInit()
// Start the mail daemon
mail.StartMailDaemon()
},
Run: func(cmd *cobra.Command, args []string) {
log.Info("Sending testmail...")
email := args[0]
if err := mail.SendTestMail(email); err != nil {
log.Errorf("Error sending test mail: %s", err.Error())
return
}
log.Info("Testmail successfully sent.")
},
}
+249
View File
@@ -0,0 +1,249 @@
// Copyright 2020 Vikunja and contriubtors. All rights reserved.
//
// This file is part of Vikunja.
//
// Vikunja is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Vikunja is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Vikunja. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"fmt"
"os"
"strconv"
"strings"
"time"
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/user"
"github.com/olekukonko/tablewriter"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh/terminal"
)
var (
userFlagUsername string
userFlagEmail string
userFlagPassword string
userFlagAvatar = "default"
userFlagResetPasswordDirectly bool
userFlagEnableUser bool
userFlagDisableUser bool
)
func init() {
// User create flags
userCreateCmd.Flags().StringVarP(&userFlagUsername, "username", "u", "", "The username of the new user.")
_ = userCreateCmd.MarkFlagRequired("username")
userCreateCmd.Flags().StringVarP(&userFlagEmail, "email", "e", "", "The email address of the new user.")
_ = userCreateCmd.MarkFlagRequired("email")
userCreateCmd.Flags().StringVarP(&userFlagPassword, "password", "p", "", "The password of the new user. You will be asked to enter it if not provided through the flag.")
userCreateCmd.Flags().StringVarP(&userFlagAvatar, "avatar-provider", "a", "", "The avatar provider of the new user. Optional.")
// User update flags
userUpdateCmd.Flags().StringVarP(&userFlagUsername, "username", "u", "", "The new username of the user.")
userUpdateCmd.Flags().StringVarP(&userFlagEmail, "email", "e", "", "The new email address of the user.")
userUpdateCmd.Flags().StringVarP(&userFlagAvatar, "avatar-provider", "a", "", "The new avatar provider of the new user.")
// Reset PW flags
userResetPasswordCmd.Flags().BoolVarP(&userFlagResetPasswordDirectly, "direct", "d", false, "If provided, reset the password directly instead of sending the user a reset mail.")
userResetPasswordCmd.Flags().StringVarP(&userFlagPassword, "password", "p", "", "The new password of the user. Only used in combination with --direct. You will be asked to enter it if not provided through the flag.")
// Change status flags
userChangeEnabledCmd.Flags().BoolVarP(&userFlagDisableUser, "disable", "d", false, "Disable the user.")
userChangeEnabledCmd.Flags().BoolVarP(&userFlagEnableUser, "enable", "e", false, "Enable the user.")
userCmd.AddCommand(userListCmd, userCreateCmd, userUpdateCmd, userResetPasswordCmd, userChangeEnabledCmd)
rootCmd.AddCommand(userCmd)
}
func getPasswordFromFlagOrInput() (pw string) {
pw = userFlagPassword
if userFlagPassword == "" {
fmt.Print("Enter Password: ")
bytePW, err := terminal.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
log.Fatalf("Error reading password: %s", err)
}
fmt.Printf("\nConfirm Password: ")
byteConfirmPW, err := terminal.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
log.Fatalf("Error reading password: %s", err)
}
if string(bytePW) != string(byteConfirmPW) {
log.Critical("Passwords don't match!")
}
fmt.Printf("\n")
pw = strings.TrimSpace(string(bytePW))
}
return
}
func getUserFromArg(arg string) *user.User {
id, err := strconv.ParseInt(arg, 10, 64)
if err != nil {
log.Fatalf("Invalid user id: %s", err)
}
u, err := user.GetUserByID(id)
if err != nil {
log.Fatalf("Could not get user: %s", err)
}
return u
}
var userCmd = &cobra.Command{
Use: "user",
Short: "Manage users locally through the cli.",
}
var userListCmd = &cobra.Command{
Use: "list",
Short: "Shows a list of all users.",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
users, err := user.ListUsers("")
if err != nil {
log.Fatalf("Error getting users: %s", err)
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{
"ID",
"Username",
"Email",
"Active",
"Created",
"Updated",
})
for _, u := range users {
table.Append([]string{
strconv.FormatInt(u.ID, 10),
u.Username,
u.Email,
strconv.FormatBool(u.IsActive),
u.Created.Format(time.RFC3339),
u.Updated.Format(time.RFC3339),
})
}
table.Render()
},
}
var userCreateCmd = &cobra.Command{
Use: "create",
Short: "Create a new user.",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
u := &user.User{
Username: userFlagUsername,
Email: userFlagEmail,
Password: getPasswordFromFlagOrInput(),
}
_, err := user.CreateUser(u)
if err != nil {
log.Fatalf("Error creating new user: %s", err)
}
fmt.Printf("\nUser was created successfully.\n")
},
}
var userUpdateCmd = &cobra.Command{
Use: "update [user id]",
Short: "Update an existing user.",
Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
u := getUserFromArg(args[0])
if userFlagUsername != "" {
u.Username = userFlagUsername
}
if userFlagEmail != "" {
u.Email = userFlagEmail
}
if userFlagAvatar != "default" {
u.AvatarProvider = userFlagAvatar
}
_, err := user.UpdateUser(u)
if err != nil {
log.Fatalf("Error updating the user: %s", err)
}
fmt.Println("User updated successfully.")
},
}
var userResetPasswordCmd = &cobra.Command{
Use: "reset-password [user id]",
Short: "Reset a users password, either through mailing them a reset link or directly.",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
u := getUserFromArg(args[0])
// By default we reset as usual, only with specific flag directly.
if userFlagResetPasswordDirectly {
err := user.UpdateUserPassword(u, getPasswordFromFlagOrInput())
if err != nil {
log.Fatalf("Could not update user password: %s", err)
}
fmt.Println("Password updated successfully.")
} else {
err := user.RequestUserPasswordResetToken(u)
if err != nil {
log.Fatalf("Could not send password reset email: %s", err)
}
fmt.Println("Password reset email sent successfully.")
}
},
}
var userChangeEnabledCmd = &cobra.Command{
Use: "change-status [user id]",
Short: "Enable or disable a user. Will toggle the current status if no flag (--enable or --disable) is provided.",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
u := getUserFromArg(args[0])
if userFlagEnableUser {
u.IsActive = true
} else if userFlagDisableUser {
u.IsActive = false
} else {
u.IsActive = !u.IsActive
}
_, err := user.UpdateUser(u)
if err != nil {
log.Fatalf("Could not enable the user")
}
fmt.Printf("User status successfully changed, user is now active: %t.\n", u.IsActive)
},
}
+38
View File
@@ -0,0 +1,38 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"fmt"
"runtime"
"code.vikunja.io/api/pkg/version"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(versionCmd)
}
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print the version number of Vikunja",
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Vikunja api version %s\n", version.Version)
fmt.Printf("Built with %s\n", runtime.Version())
},
}
+74
View File
@@ -0,0 +1,74 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package cmd
import (
"context"
"os"
"os/signal"
"time"
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/initialize"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/routes"
"code.vikunja.io/api/pkg/swagger"
"code.vikunja.io/api/pkg/version"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(webCmd)
}
var webCmd = &cobra.Command{
Use: "web",
Short: "Starts the rest api web server",
PreRun: func(cmd *cobra.Command, args []string) {
initialize.FullInit()
},
Run: func(cmd *cobra.Command, args []string) {
// Version notification
log.Infof("Vikunja version %s", version.Version)
// Additional swagger information
swagger.SwaggerInfo.Version = version.Version
// Start the webserver
e := routes.NewEcho()
routes.RegisterRoutes(e)
// Start server
go func() {
if err := e.Start(config.ServiceInterface.GetString()); err != nil {
e.Logger.Info("shutting down...")
}
}()
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 10 seconds.
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
log.Infof("Shutting down...")
if err := e.Shutdown(ctx); err != nil {
e.Logger.Fatal(err)
}
},
}
+335
View File
@@ -0,0 +1,335 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package config
import (
"crypto/rand"
"fmt"
"log"
"os"
"path"
"path/filepath"
"strings"
"time"
"4d63.com/tz"
"github.com/spf13/viper"
)
// Key is used as a config key
type Key string
// These constants hold all config value keys
const (
// #nosec
ServiceJWTSecret Key = `service.JWTSecret`
ServiceInterface Key = `service.interface`
ServiceFrontendurl Key = `service.frontendurl`
ServiceEnableCaldav Key = `service.enablecaldav`
ServiceRootpath Key = `service.rootpath`
ServiceMaxItemsPerPage Key = `service.maxitemsperpage`
ServiceEnableMetrics Key = `service.enablemetrics`
ServiceMotd Key = `service.motd`
ServiceEnableLinkSharing Key = `service.enablelinksharing`
ServiceEnableRegistration Key = `service.enableregistration`
ServiceEnableTaskAttachments Key = `service.enabletaskattachments`
ServiceTimeZone Key = `service.timezone`
ServiceEnableTaskComments Key = `service.enabletaskcomments`
ServiceEnableTotp Key = `service.enabletotp`
ServiceSentryDsn Key = `service.sentrydsn`
LegalImprintURL Key = `legal.imprinturl`
LegalPrivacyURL Key = `legal.privacyurl`
DatabaseType Key = `database.type`
DatabaseHost Key = `database.host`
DatabaseUser Key = `database.user`
DatabasePassword Key = `database.password`
DatabaseDatabase Key = `database.database`
DatabasePath Key = `database.path`
DatabaseMaxOpenConnections Key = `database.maxopenconnections`
DatabaseMaxIdleConnections Key = `database.maxidleconnections`
DatabaseMaxConnectionLifetime Key = `database.maxconnectionlifetime`
DatabaseSslMode Key = `database.sslmode`
CacheEnabled Key = `cache.enabled`
CacheType Key = `cache.type`
CacheMaxElementSize Key = `cache.maxelementsize`
MailerEnabled Key = `mailer.enabled`
MailerHost Key = `mailer.host`
MailerPort Key = `mailer.port`
MailerUsername Key = `mailer.username`
MailerPassword Key = `mailer.password`
MailerSkipTLSVerify Key = `mailer.skiptlsverify`
MailerFromEmail Key = `mailer.fromemail`
MailerQueuelength Key = `mailer.queuelength`
MailerQueueTimeout Key = `mailer.queuetimeout`
MailerForceSSL Key = `mailer.forcessl`
RedisEnabled Key = `redis.enabled`
RedisHost Key = `redis.host`
RedisPassword Key = `redis.password`
RedisDB Key = `redis.db`
LogEnabled Key = `log.enabled`
LogStandard Key = `log.standard`
LogLevel Key = `log.level`
LogDatabase Key = `log.database`
LogDatabaseLevel Key = `log.databaselevel`
LogHTTP Key = `log.http`
LogEcho Key = `log.echo`
LogPath Key = `log.path`
RateLimitEnabled Key = `ratelimit.enabled`
RateLimitKind Key = `ratelimit.kind`
RateLimitPeriod Key = `ratelimit.period`
RateLimitLimit Key = `ratelimit.limit`
RateLimitStore Key = `ratelimit.store`
FilesBasePath Key = `files.basepath`
FilesMaxSize Key = `files.maxsize`
MigrationWunderlistEnable Key = `migration.wunderlist.enable`
MigrationWunderlistClientID Key = `migration.wunderlist.clientid`
MigrationWunderlistClientSecret Key = `migration.wunderlist.clientsecret`
MigrationWunderlistRedirectURL Key = `migration.wunderlist.redirecturl`
MigrationTodoistEnable Key = `migration.todoist.enable`
MigrationTodoistClientID Key = `migration.todoist.clientid`
MigrationTodoistClientSecret Key = `migration.todoist.clientsecret`
MigrationTodoistRedirectURL Key = `migration.todoist.redirecturl`
CorsEnable Key = `cors.enable`
CorsOrigins Key = `cors.origins`
CorsMaxAge Key = `cors.maxage`
AvatarGravaterExpiration Key = `avatar.gravatarexpiration`
BackgroundsEnabled Key = `backgrounds.enabled`
BackgroundsUploadEnabled Key = `backgrounds.providers.upload.enabled`
BackgroundsUnsplashEnabled Key = `backgrounds.providers.unsplash.enabled`
BackgroundsUnsplashAccessToken Key = `backgrounds.providers.unsplash.accesstoken`
BackgroundsUnsplashApplicationID Key = `backgrounds.providers.unsplash.applicationid`
KeyvalueType Key = `keyvalue.type`
)
// GetString returns a string config value
func (k Key) GetString() string {
return viper.GetString(string(k))
}
// GetBool returns a bool config value
func (k Key) GetBool() bool {
return viper.GetBool(string(k))
}
// GetInt returns an int config value
func (k Key) GetInt() int {
return viper.GetInt(string(k))
}
// GetInt64 returns an int64 config value
func (k Key) GetInt64() int64 {
return viper.GetInt64(string(k))
}
// GetDuration returns a duration config value
func (k Key) GetDuration() time.Duration {
return viper.GetDuration(string(k))
}
// GetStringSlice returns a string slice from a config option
func (k Key) GetStringSlice() []string {
return viper.GetStringSlice(string(k))
}
var timezone *time.Location
// GetTimeZone returns the time zone configured for vikunja
// It is a separate function and not done through viper because that makes handling
// it way easier, especially when testing.
func GetTimeZone() *time.Location {
if timezone == nil {
loc, err := tz.LoadLocation(ServiceTimeZone.GetString())
if err != nil {
fmt.Printf("Error parsing time zone: %s", err)
os.Exit(1)
}
timezone = loc
}
return timezone
}
// Set sets a value
func (k Key) Set(i interface{}) {
viper.Set(string(k), i)
}
// sets the default config value
func (k Key) setDefault(i interface{}) {
viper.SetDefault(string(k), i)
}
// InitDefaultConfig sets default config values
// This is an extra function so we can call it when initializing tests without initializing the full config
func InitDefaultConfig() {
// Service config
random, err := random(32)
if err != nil {
log.Fatal(err.Error())
}
// Service
ServiceJWTSecret.setDefault(random)
ServiceInterface.setDefault(":3456")
ServiceFrontendurl.setDefault("")
ServiceEnableCaldav.setDefault(true)
ex, err := os.Executable()
if err != nil {
panic(err)
}
exPath := filepath.Dir(ex)
ServiceRootpath.setDefault(exPath)
ServiceMaxItemsPerPage.setDefault(50)
ServiceEnableMetrics.setDefault(false)
ServiceMotd.setDefault("")
ServiceEnableLinkSharing.setDefault(true)
ServiceEnableRegistration.setDefault(true)
ServiceEnableTaskAttachments.setDefault(true)
ServiceTimeZone.setDefault("GMT")
ServiceEnableTaskComments.setDefault(true)
ServiceEnableTotp.setDefault(true)
// Database
DatabaseType.setDefault("sqlite")
DatabaseHost.setDefault("localhost")
DatabaseUser.setDefault("vikunja")
DatabasePassword.setDefault("")
DatabaseDatabase.setDefault("vikunja")
DatabasePath.setDefault("./vikunja.db")
DatabaseMaxOpenConnections.setDefault(100)
DatabaseMaxIdleConnections.setDefault(50)
DatabaseMaxConnectionLifetime.setDefault(10000)
DatabaseSslMode.setDefault("disable")
// Cacher
CacheEnabled.setDefault(false)
CacheType.setDefault("memory")
CacheMaxElementSize.setDefault(1000)
// Mailer
MailerEnabled.setDefault(false)
MailerHost.setDefault("")
MailerPort.setDefault("587")
MailerUsername.setDefault("user")
MailerPassword.setDefault("")
MailerSkipTLSVerify.setDefault(false)
MailerFromEmail.setDefault("mail@vikunja")
MailerQueuelength.setDefault(100)
MailerQueueTimeout.setDefault(30)
MailerForceSSL.setDefault(false)
// Redis
RedisEnabled.setDefault(false)
RedisHost.setDefault("localhost:6379")
RedisPassword.setDefault("")
RedisDB.setDefault(0)
// Logger
LogEnabled.setDefault(true)
LogStandard.setDefault("stdout")
LogLevel.setDefault("INFO")
LogDatabase.setDefault("off")
LogDatabaseLevel.setDefault("WARNING")
LogHTTP.setDefault("stdout")
LogEcho.setDefault("off")
LogPath.setDefault(ServiceRootpath.GetString() + "/logs")
// Rate Limit
RateLimitEnabled.setDefault(false)
RateLimitKind.setDefault("user")
RateLimitLimit.setDefault(100)
RateLimitPeriod.setDefault(60)
RateLimitStore.setDefault("memory")
// Files
FilesBasePath.setDefault("files")
FilesMaxSize.setDefault("20MB")
// Cors
CorsEnable.setDefault(true)
CorsOrigins.setDefault([]string{"*"})
CorsMaxAge.setDefault(0)
// Migration
MigrationWunderlistEnable.setDefault(false)
MigrationTodoistEnable.setDefault(false)
// Avatar
AvatarGravaterExpiration.setDefault(3600)
// List Backgrounds
BackgroundsEnabled.setDefault(true)
BackgroundsUploadEnabled.setDefault(true)
BackgroundsUnsplashEnabled.setDefault(false)
// Key Value
KeyvalueType.setDefault("memory")
}
// InitConfig initializes the config, sets defaults etc.
func InitConfig() {
// Set defaults
InitDefaultConfig()
// Init checking for environment variables
viper.SetEnvPrefix("vikunja")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv()
// Load the config file
viper.AddConfigPath(ServiceRootpath.GetString())
viper.AddConfigPath("/etc/vikunja/")
homeDir, err := os.UserHomeDir()
if err != nil {
log.Printf("No home directory found, not using config from ~/.config/vikunja/. Error was: %s\n", err.Error())
} else {
viper.AddConfigPath(path.Join(homeDir, ".config", "vikunja"))
}
viper.AddConfigPath(".")
viper.SetConfigName("config")
err = viper.ReadInConfig()
if err != nil {
log.Println(err.Error())
log.Println("Using default config.")
return
}
if CacheType.GetString() == "keyvalue" {
CacheType.Set(KeyvalueType.GetString())
}
if RateLimitStore.GetString() == "keyvalue" {
RateLimitStore.Set(KeyvalueType.GetString())
}
log.Printf("Using config file: %s", viper.ConfigFileUsed())
}
func random(length int) (string, error) {
b := make([]byte, length)
if _, err := rand.Read(b); err != nil {
return "", err
}
return fmt.Sprintf("%X", b), nil
}
+213
View File
@@ -0,0 +1,213 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package db
import (
"encoding/gob"
"fmt"
"net/url"
"os"
"strconv"
"strings"
"time"
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/log"
xrc "gitea.com/xorm/xorm-redis-cache"
"xorm.io/core"
"xorm.io/xorm"
"xorm.io/xorm/caches"
_ "github.com/go-sql-driver/mysql" // Because.
_ "github.com/lib/pq" // Because.
_ "github.com/mattn/go-sqlite3" // Because.
)
// We only want one instance of the engine, so we can reate it once and reuse it
var x *xorm.Engine
// CreateDBEngine initializes a db engine from the config
func CreateDBEngine() (engine *xorm.Engine, err error) {
if x != nil {
return x, nil
}
// If the database type is not set, this likely means we need to initialize the config first
if config.DatabaseType.GetString() == "" {
config.InitConfig()
}
// Use Mysql if set
switch config.DatabaseType.GetString() {
case "mysql":
engine, err = initMysqlEngine()
if err != nil {
return
}
case "postgres":
engine, err = initPostgresEngine()
if err != nil {
return
}
case "sqlite":
// Otherwise use sqlite
engine, err = initSqliteEngine()
if err != nil {
return
}
default:
log.Fatalf("Unknown database type %s", config.DatabaseType.GetString())
}
engine.SetTZLocation(config.GetTimeZone()) // Vikunja's timezone
loc, err := time.LoadLocation("GMT") // The db data timezone
if err != nil {
log.Fatalf("Error parsing time zone: %s", err)
}
engine.SetTZDatabase(loc)
engine.SetMapper(core.GonicMapper{})
logger := log.NewXormLogger("")
engine.SetLogger(logger)
// Cache
// We have to initialize the cache here to avoid import cycles
if config.CacheEnabled.GetBool() {
switch config.CacheType.GetString() {
case "memory":
cacher := caches.NewLRUCacher(caches.NewMemoryStore(), config.CacheMaxElementSize.GetInt())
engine.SetDefaultCacher(cacher)
case "redis":
cacher := xrc.NewRedisCacher(config.RedisHost.GetString(), config.RedisPassword.GetString(), xrc.DEFAULT_EXPIRATION, engine.Logger())
engine.SetDefaultCacher(cacher)
default:
log.Info("Did not find a valid cache type. Caching disabled. Please refer to the docs for poosible cache types.")
}
}
x = engine
return
}
// RegisterTableStructsForCache registers tables in gob encoding for redis cache
func RegisterTableStructsForCache(val interface{}) {
gob.Register(val)
}
func initMysqlEngine() (engine *xorm.Engine, err error) {
// We're using utf8mb here instead of just utf8 because we want to use non-BMP characters.
// See https://stackoverflow.com/a/30074553/10924593 for more info.
connStr := fmt.Sprintf(
"%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true",
config.DatabaseUser.GetString(),
config.DatabasePassword.GetString(),
config.DatabaseHost.GetString(),
config.DatabaseDatabase.GetString())
engine, err = xorm.NewEngine("mysql", connStr)
if err != nil {
return
}
engine.SetMaxOpenConns(config.DatabaseMaxOpenConnections.GetInt())
engine.SetMaxIdleConns(config.DatabaseMaxIdleConnections.GetInt())
max, err := time.ParseDuration(strconv.Itoa(config.DatabaseMaxConnectionLifetime.GetInt()) + `ms`)
if err != nil {
return
}
engine.SetConnMaxLifetime(max)
return
}
// parsePostgreSQLHostPort parses given input in various forms defined in
// https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
// and returns proper host and port number.
func parsePostgreSQLHostPort(info string) (string, string) {
host, port := "127.0.0.1", "5432"
if strings.Contains(info, ":") && !strings.HasSuffix(info, "]") {
idx := strings.LastIndex(info, ":")
host = info[:idx]
port = info[idx+1:]
} else if len(info) > 0 {
host = info
}
return host, port
}
func initPostgresEngine() (engine *xorm.Engine, err error) {
host, port := parsePostgreSQLHostPort(config.DatabaseHost.GetString())
connStr := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
host,
port,
url.PathEscape(config.DatabaseUser.GetString()),
url.PathEscape(config.DatabasePassword.GetString()),
config.DatabaseDatabase.GetString(),
config.DatabaseSslMode.GetString(),
)
engine, err = xorm.NewEngine("postgres", connStr)
if err != nil {
return
}
engine.SetMaxOpenConns(config.DatabaseMaxOpenConnections.GetInt())
engine.SetMaxIdleConns(config.DatabaseMaxIdleConnections.GetInt())
max, err := time.ParseDuration(strconv.Itoa(config.DatabaseMaxConnectionLifetime.GetInt()) + `ms`)
if err != nil {
return
}
engine.SetConnMaxLifetime(max)
return
}
func initSqliteEngine() (engine *xorm.Engine, err error) {
path := config.DatabasePath.GetString()
if path == "" {
path = "./db.db"
}
// Try opening the db file to return a better error message if that does not work
var exists = true
if _, err := os.Stat(path); err != nil {
exists = !os.IsNotExist(err)
}
file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0)
if err != nil {
return nil, fmt.Errorf("could not open database file [uid=%d, gid=%d]: %s", os.Getuid(), os.Getgid(), err)
}
_ = file.Close() // We directly close the file because we only want to check if it is writable. It will be reopened lazily later by xorm.
if !exists {
_ = os.Remove(path) // Remove the file to not prevent the db from creating another one
}
return xorm.NewEngine("sqlite3", path)
}
// WipeEverything wipes all tables and their data. Use with caution...
func WipeEverything() error {
tables, err := x.DBMetas()
if err != nil {
return err
}
for _, t := range tables {
if err := x.DropTables(t.Name); err != nil {
return err
}
}
return nil
}
+54
View File
@@ -0,0 +1,54 @@
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2020 Vikunja and contributors. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package db
import "encoding/json"
// Dump dumps all database tables
func Dump() (data map[string][]byte, err error) {
tables, err := x.DBMetas()
if err != nil {
return
}
data = make(map[string][]byte, len(tables))
for _, table := range tables {
entries := []map[string]interface{}{}
err := x.Table(table.Name).Find(&entries)
if err != nil {
return nil, err
}
data[table.Name], err = json.Marshal(entries)
if err != nil {
return nil, err
}
}
return
}
// Restore restores a table with all its entries
func Restore(table string, contents []map[string]interface{}) (err error) {
for _, content := range contents {
if _, err := x.Table(table).Insert(content); err != nil {
return err
}
}
return
}
+209
View File
@@ -0,0 +1,209 @@
- id: 1
title: testbucket1
list_id: 1
created_by_id: 1
limit: 9999999 # This bucket has a limit we will never exceed in the tests to make sure the logic allows for buckets with limits
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 2
title: testbucket2
list_id: 1
created_by_id: 1
limit: 3
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 3
title: testbucket3
list_id: 1
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 4
title: testbucket4 - other list
list_id: 2
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
# The following are not or only partly owned by user 1
- id: 5
title: testbucket5
list_id: 20
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 6
title: testbucket6
list_id: 6
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 7
title: testbucket7
list_id: 7
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 8
title: testbucket8
list_id: 8
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 9
title: testbucket9
list_id: 9
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 10
title: testbucket10
list_id: 10
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 11
title: testbucket11
list_id: 11
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 12
title: testbucket13
list_id: 12
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 13
title: testbucket13
list_id: 13
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 14
title: testbucket14
list_id: 14
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 15
title: testbucket15
list_id: 15
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 16
title: testbucket16
list_id: 16
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 17
title: testbucket17
list_id: 17
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 18
title: testbucket18
list_id: 5
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 19
title: testbucket19
list_id: 21
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 20
title: testbucket20
list_id: 22
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 21
title: testbucket21
list_id: 3
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
# Duplicate buckets to make deletion of one of them possible
- id: 22
title: testbucket22
list_id: 6
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 23
title: testbucket23
list_id: 7
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 24
title: testbucket24
list_id: 8
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 25
title: testbucket25
list_id: 9
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 26
title: testbucket26
list_id: 10
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 27
title: testbucket27
list_id: 11
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 28
title: testbucket28
list_id: 12
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 29
title: testbucket29
list_id: 13
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 30
title: testbucket30
list_id: 14
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 31
title: testbucket31
list_id: 15
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 32
title: testbucket32
list_id: 16
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
- id: 33
title: testbucket33
list_id: 17
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
# This bucket is the last one in its list
- id: 34
title: testbucket34
list_id: 18
created_by_id: 1
created: 2020-04-18 21:13:52
updated: 2020-04-18 21:13:52
+5
View File
@@ -0,0 +1,5 @@
- id: 1
name: test
size: 100
created: 2019-10-13 20:33:11
created_by_id: 1
+16
View File
@@ -0,0 +1,16 @@
- id: 1
task_id: 1
label_id: 4
created: 2018-12-01 15:13:12
- id: 2
task_id: 2
label_id: 4
created: 2018-12-01 15:13:12
- id: 3
task_id: 35
label_id: 4
created: 2018-12-01 15:13:12
- id: 4
task_id: 36
label_id: 4
created: 2018-12-01 15:13:12
+20
View File
@@ -0,0 +1,20 @@
- id: 1
title: 'Label #1'
created_by_id: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 2
title: 'Label #2'
created_by_id: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 3
title: 'Label #3 - other user'
created_by_id: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 4
title: 'Label #4 - visible via other task'
created_by_id: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
+24
View File
@@ -0,0 +1,24 @@
- id: 1
hash: test
list_id: 1
right: 0
sharing_type: 1
shared_by_id: 1
created: 2018-12-01 15:13:12
updated: 2018-12-02 15:13:12
- id: 2
hash: test2
list_id: 2
right: 1
sharing_type: 1
shared_by_id: 1
created: 2018-12-01 15:13:12
updated: 2018-12-02 15:13:12
- id: 3
hash: test3
list_id: 3
right: 2
sharing_type: 1
shared_by_id: 1
created: 2018-12-01 15:13:12
updated: 2018-12-02 15:13:12
+211
View File
@@ -0,0 +1,211 @@
-
id: 1
title: Test1
description: Lorem Ipsum
identifier: test1
owner_id: 1
namespace_id: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 2
title: Test2
description: Lorem Ipsum
identifier: test2
owner_id: 3
namespace_id: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 3
title: Test3
description: Lorem Ipsum
identifier: test3
owner_id: 3
namespace_id: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 4
title: Test4
description: Lorem Ipsum
identifier: test4
owner_id: 3
namespace_id: 3
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 5
title: Test5
description: Lorem Ipsum
identifier: test5
owner_id: 5
namespace_id: 5
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 6
title: Test6
description: Lorem Ipsum
identifier: test6
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 7
title: Test7
description: Lorem Ipsum
identifier: test7
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 8
title: Test8
description: Lorem Ipsum
identifier: test8
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 9
title: Test9
description: Lorem Ipsum
identifier: test9
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 10
title: Test10
description: Lorem Ipsum
identifier: test10
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 11
title: Test11
description: Lorem Ipsum
identifier: test11
owner_id: 6
namespace_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 12
title: Test12
description: Lorem Ipsum
identifier: test12
owner_id: 6
namespace_id: 7
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 13
title: Test13
description: Lorem Ipsum
identifier: test13
owner_id: 6
namespace_id: 8
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 14
title: Test14
description: Lorem Ipsum
identifier: test14
owner_id: 6
namespace_id: 9
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 15
title: Test15
description: Lorem Ipsum
identifier: test15
owner_id: 6
namespace_id: 10
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 16
title: Test16
description: Lorem Ipsum
identifier: test16
owner_id: 6
namespace_id: 11
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 17
title: Test17
description: Lorem Ipsum
identifier: test17
owner_id: 6
namespace_id: 12
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# This list is owned by user 7, and several other users have access to it via different methods.
# It is used to test the listUsers method.
-
id: 18
title: Test18
description: Lorem Ipsum
identifier: test18
owner_id: 7
namespace_id: 13
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 19
title: Test19
description: Lorem Ipsum
identifier: test19
owner_id: 7
namespace_id: 14
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 20
title: Test20
description: Lorem Ipsum
identifier: test20
owner_id: 13
namespace_id: 15
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 21
title: Test21 archived through namespace
description: Lorem Ipsum
identifier: test21
owner_id: 1
namespace_id: 16
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 22
title: Test22 archived individually
description: Lorem Ipsum
identifier: test22
owner_id: 1
namespace_id: 1
is_archived: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
-
id: 23
title: Test23
description: Lorem Ipsum
identifier: test23
owner_id: 12
namespace_id: 17
is_favorite: true
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
+90
View File
@@ -0,0 +1,90 @@
- id: 1
title: testnamespace
description: Lorem Ipsum
owner_id: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 2
title: testnamespace2
description: Lorem Ipsum
owner_id: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 3
title: testnamespace3
description: Lorem Ipsum
owner_id: 3
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 6
title: testnamespace6
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 7
title: testnamespace7
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 8
title: testnamespace8
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 9
title: testnamespace9
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 10
title: testnamespace10
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 11
title: testnamespace11
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 12
title: testnamespace12
description: Lorem Ipsum
owner_id: 6
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 13
title: testnamespace13
description: Lorem Ipsum
owner_id: 7
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 14
title: testnamespace14
description: Lorem Ipsum
owner_id: 7
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 15
title: testnamespace15
description: Lorem Ipsum
owner_id: 13
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 16
title: Archived testnamespace16
owner_id: 1
is_archived: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 17
title: testnamespace17
description: Lorem Ipsum
owner_id: 12
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
+6
View File
@@ -0,0 +1,6 @@
- id: 1
filters: '{"sort_by":null,"order_by":null,"filter_by":["start_date","end_date","due_date"],"filter_value":["2018-12-11T03:46:40+00:00","2018-12-13T11:20:01+00:00","2018-11-29T14:00:00+00:00"],"filter_comparator":["greater","less","greater"],"filter_concat":"","filter_include_nulls":false}'
title: testfilter1
owner_id: 1
updated: 2020-09-08 15:13:12
created: 2020-09-08 14:13:12
+16
View File
@@ -0,0 +1,16 @@
- id: 1
task_id: 30
user_id: 1
created: 2018-12-01 15:13:12
- id: 2
task_id: 30
user_id: 2
created: 2018-12-01 15:13:12
- id: 3
task_id: 35
user_id: 2
created: 2018-12-01 15:13:12
- id: 4
task_id: 36
user_id: 2
created: 2018-12-01 15:13:12
+11
View File
@@ -0,0 +1,11 @@
- id: 1
task_id: 1
file_id: 1
created_by_id: 1
created: 2018-12-01 15:13:12
# The file for this attachment does not exist
- id: 2
task_id: 1
file_id: 9999
created_by_id: 1
created: 2018-12-01 15:13:12
+96
View File
@@ -0,0 +1,96 @@
- id: 1
comment: Lorem Ipsum Dolor Sit Amet
author_id: 1
task_id: 1
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 2
comment: comment 2
author_id: 5
task_id: 14
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 3
comment: comment 3
author_id: 5
task_id: 15
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 4
comment: comment 4
author_id: 6
task_id: 16
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 5
comment: comment 5
author_id: 6
task_id: 17
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 6
comment: comment 6
author_id: 6
task_id: 18
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 7
comment: comment 7
author_id: 6
task_id: 19
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 8
comment: comment 8
author_id: 6
task_id: 20
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 9
comment: comment 9
author_id: 6
task_id: 21
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 10
comment: comment 10
author_id: 6
task_id: 22
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 11
comment: comment 11
author_id: 6
task_id: 23
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 12
comment: comment 12
author_id: 6
task_id: 24
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 13
comment: comment 13
author_id: 6
task_id: 25
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 14
comment: comment 14
author_id: 6
task_id: 26
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 15
comment: comment 15
author_id: 1
task_id: 35
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
- id: 16
comment: comment 16
author_id: 1
task_id: 36
created: 2020-02-19 18:07:06
updated: 2020-02-19 18:07:06
+36
View File
@@ -0,0 +1,36 @@
- id: 1
task_id: 1
other_task_id: 29
relation_kind: 'subtask'
created_by_id: 1
created: 2018-12-01 15:13:12
- id: 2
task_id: 29
other_task_id: 1
relation_kind: 'parenttask'
created_by_id: 1
created: 2018-12-01 15:13:12
- id: 3
task_id: 35
other_task_id: 1
relation_kind: 'related'
created_by_id: 1
created: 2018-12-01 15:13:12
- id: 4
task_id: 35
other_task_id: 1
relation_kind: 'related'
created_by_id: 1
created: 2018-12-01 15:13:12
- id: 5
task_id: 36
other_task_id: 1
relation_kind: 'related'
created_by_id: 1
created: 2018-12-01 15:13:12
- id: 6
task_id: 36
other_task_id: 1
relation_kind: 'related'
created_by_id: 1
created: 2018-12-01 15:13:12
+8
View File
@@ -0,0 +1,8 @@
- id: 1
task_id: 27
reminder: 2018-12-01 01:12:04
created: 2018-12-01 01:12:04
- id: 2
task_id: 27
reminder: 2018-12-01 01:13:44
created: 2018-12-01 01:12:04
+342
View File
@@ -0,0 +1,342 @@
- id: 1
title: 'task #1'
description: 'Lorem Ipsum'
done: false
created_by_id: 1
list_id: 1
index: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
bucket_id: 1
is_favorite: true
- id: 2
title: 'task #2 done'
done: true
created_by_id: 1
list_id: 1
index: 2
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
bucket_id: 1
- id: 3
title: 'task #3 high prio'
done: false
created_by_id: 1
list_id: 1
index: 3
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
priority: 100
bucket_id: 2
- id: 4
title: 'task #4 low prio'
done: false
created_by_id: 1
list_id: 1
index: 4
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
priority: 1
bucket_id: 2
- id: 5
title: 'task #5 higher due date'
done: false
created_by_id: 1
list_id: 1
index: 5
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
due_date: 2018-12-01 03:58:44
bucket_id: 2
- id: 6
title: 'task #6 lower due date'
done: false
created_by_id: 1
list_id: 1
index: 6
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
due_date: 2018-11-30 22:25:24
bucket_id: 3
- id: 7
title: 'task #7 with start date'
done: false
created_by_id: 1
list_id: 1
index: 7
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
start_date: 2018-12-12 07:33:20
bucket_id: 3
- id: 8
title: 'task #8 with end date'
done: false
created_by_id: 1
list_id: 1
index: 8
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
end_date: 2018-12-13 11:20:00
bucket_id: 3
- id: 9
title: 'task #9 with start and end date'
done: false
created_by_id: 1
list_id: 1
index: 9
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
start_date: 2018-12-12 07:33:20
end_date: 2018-12-13 11:20:00
bucket_id: 1
- id: 10
title: 'task #10 basic'
done: false
created_by_id: 1
list_id: 1
index: 10
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 11
title: 'task #11 basic'
done: false
created_by_id: 1
list_id: 1
index: 11
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 12
title: 'task #12 basic'
done: false
created_by_id: 1
list_id: 1
index: 12
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 13
title: 'task #13 basic other list'
done: false
created_by_id: 1
list_id: 2
index: 1
bucket_id: 4
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 14
title: 'task #14 basic other list'
done: false
created_by_id: 5
list_id: 5
index: 1
bucket_id: 18
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 15
title: 'task #15'
done: false
created_by_id: 6
list_id: 6
index: 1
bucket_id: 6
is_favorite: true
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 16
title: 'task #16'
done: false
created_by_id: 6
list_id: 7
index: 1
bucket_id: 7
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 17
title: 'task #17'
done: false
created_by_id: 6
list_id: 8
index: 1
bucket_id: 8
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 18
title: 'task #18'
done: false
created_by_id: 6
list_id: 9
index: 1
bucket_id: 9
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 19
title: 'task #19'
done: false
created_by_id: 6
list_id: 10
index: 1
bucket_id: 10
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 20
title: 'task #20'
done: false
created_by_id: 6
list_id: 11
index: 1
bucket_id: 11
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 21
title: 'task #21'
done: false
created_by_id: 6
list_id: 12
index: 1
bucket_id: 12
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 22
title: 'task #22'
done: false
created_by_id: 6
list_id: 13
index: 1
bucket_id: 13
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 23
title: 'task #23'
done: false
created_by_id: 6
list_id: 14
index: 1
bucket_id: 14
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 24
title: 'task #24'
done: false
created_by_id: 6
list_id: 15
index: 1
bucket_id: 15
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 25
title: 'task #25'
done: false
created_by_id: 6
list_id: 16
index: 1
bucket_id: 16
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 26
title: 'task #26'
done: false
created_by_id: 6
list_id: 17
index: 1
bucket_id: 17
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 27
title: 'task #27 with reminders'
done: false
created_by_id: 1
list_id: 1
index: 12
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 28
title: 'task #28 with repeat after'
done: false
created_by_id: 1
repeat_after: 3600
list_id: 1
index: 13
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 29
title: 'task #29 with parent task (1)'
done: false
created_by_id: 1
list_id: 1
index: 14
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 30
title: 'task #30 with assignees'
done: false
created_by_id: 1
list_id: 1
index: 15
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 31
title: 'task #31 with color'
done: false
created_by_id: 1
list_id: 1
index: 16
hex_color: f0f0f0
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 32
title: 'task #32'
done: false
created_by_id: 1
list_id: 3
index: 1
bucket_id: 21
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 33
title: 'task #33 with percent done'
done: false
created_by_id: 1
list_id: 1
index: 17
percent_done: 0.5
bucket_id: 1
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
# This task is forbidden for user1
- id: 34
title: 'task #34'
done: false
created_by_id: 13
list_id: 20
index: 20
bucket_id: 5
is_favorite: true
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 35
title: 'task #35'
done: false
created_by_id: 1
list_id: 21
index: 1
bucket_id: 19
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
- id: 36
title: 'task #36'
done: false
created_by_id: 1
list_id: 22
index: 1
bucket_id: 20
created: 2018-12-01 01:12:04
updated: 2018-12-01 01:12:04
+48
View File
@@ -0,0 +1,48 @@
- id: 1
team_id: 1
list_id: 3
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# This team has read only access on list 6
- id: 2
team_id: 2
list_id: 6
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# This team has write access on list 7
- id: 3
team_id: 3
list_id: 7
right: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# This team has admin access on list 8
- id: 4
team_id: 4
list_id: 8
right: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# Readonly acces on list 19
- id: 5
team_id: 8
list_id: 19
right: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# Write acces on list 19
- id: 6
team_id: 9
list_id: 19
right: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
# Admin acces on list 19
- id: 7
team_id: 10
list_id: 19
right: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
+57
View File
@@ -0,0 +1,57 @@
-
team_id: 1
user_id: 1
admin: true
created: 2018-12-01 15:13:12
-
team_id: 1
user_id: 2
created: 2018-12-01 15:13:12
-
team_id: 2
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 3
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 4
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 5
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 6
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 7
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 8
user_id: 1
created: 2018-12-01 15:13:12
-
team_id: 9
user_id: 2
created: 2018-12-01 15:13:12
-
team_id: 10
user_id: 3
created: 2018-12-01 15:13:12
-
team_id: 11
user_id: 8
created: 2018-12-01 15:13:12
-
team_id: 12
user_id: 9
created: 2018-12-01 15:13:12
-
team_id: 13
user_id: 10
created: 2018-12-01 15:13:12
+52
View File
@@ -0,0 +1,52 @@
- id: 1
team_id: 1
namespace_id: 3
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 2
team_id: 2
namespace_id: 3
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 3
team_id: 5
namespace_id: 7
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 4
team_id: 6
namespace_id: 8
right: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 5
team_id: 7
namespace_id: 9
right: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 6
team_id: 11
namespace_id: 14
right: 0
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 7
team_id: 12
namespace_id: 14
right: 1
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
- id: 8
team_id: 13
namespace_id: 14
right: 2
updated: 2018-12-02 15:13:12
created: 2018-12-01 15:13:12
+40
View File
@@ -0,0 +1,40 @@
- id: 1
name: testteam1
description: Lorem Ipsum
created_by_id: 1
- id: 2
name: testteam2_read_only_on_list6
created_by_id: 1
- id: 3
name: testteam3_write_on_list7
created_by_id: 1
- id: 4
name: testteam4_admin_on_list8
created_by_id: 1
- id: 5
name: testteam2_read_only_on_namespace7
created_by_id: 1
- id: 6
name: testteam3_write_on_namespace8
created_by_id: 1
- id: 7
name: testteam4_admin_on_namespace9
created_by_id: 1
- id: 8
name: testteam8
created_by_id: 7
- id: 9
name: testteam9
created_by_id: 7
- id: 10
name: testteam10
created_by_id: 7
- id: 11
name: testteam11
created_by_id: 7
- id: 12
name: testteam12
created_by_id: 7
- id: 13
name: testteam13
created_by_id: 7

Some files were not shown because too many files have changed in this diff Show More