2018-06-10 15:32:25 +02:00
# Featurecreep
2018-12-25 21:29:16 +01:00
This is the place where I write down ideas to work on at some point.
Sorry for some of them being in German, I'll tranlate them at some point.
2018-09-07 08:24:15 +02:00
2019-02-17 20:53:04 +01:00
## Feature Ideas
2018-06-10 15:32:25 +02:00
2018-12-02 01:49:30 +01:00
* [x] Priorities
2018-11-26 21:24:00 +01:00
* [x] Repeating tasks
2019-02-17 20:53:04 +01:00
* [x] Get all tasks which are due between two given dates
2018-12-02 01:49:30 +01:00
* [x] Subtasks
2018-06-10 15:32:25 +02:00
2018-06-12 19:57:48 +02:00
## Anderes
2019-02-17 20:53:04 +01:00
* [x] Refactor!!!! Delete everything not being used anymore, simplify.
* [x] Drone
* [x] Tests
* [x] Find a nme
* [x] Move packages to a better structure
* [x] Swagger UI
2019-10-20 17:54:32 +02:00
* [x] Fix CORS
2019-02-17 20:53:04 +01:00
* [x] Use echo.NewHTTPError instead of c.JSON(Message{})
* [x] Better error messages when the model which is sent to the server is wrong
* [x] Better error handling to show useful error messages and status codes
* [x] Viper for config instead of ini
* [x] Docs for installing
* [x] Tests for rights managemnt
* [x] Rights checks:
2019-10-20 17:54:32 +02:00
* [x] Create lists
* [x] Edit lists
* [x] Add tasks
* [x] Edit tasks
2019-02-17 20:53:04 +01:00
* [x] The -1 namespace should also be accessible seperately
2018-09-12 22:59:45 +02:00
### Short Term
2019-02-17 20:53:04 +01:00
* [x] Cacher configurable
* [x] Should throw an error when an id < 1
* [x] /users should also return the rights
* [x] Extra endpoint /teams/members /list/users to update rights without needing to remove and re-add them
* [x] namespaces & listen update does not work, returns 500
* [x] Logging for all errors somewhere
2018-10-06 15:08:38 +02:00
* [x] Ne extra funktion für list exists machen, damit die nicht immer über GetListByID gehen, um sql-abfragen zu sparen
2018-10-21 22:19:51 +02:00
* [x] Rausfinden warum xorm teilweise beim einfügen IDs mit einfügen will -> Das schlägt dann wegen duplicate fehl
2018-10-05 19:16:31 +02:00
* [x] Bei den Structs "AfterLoad" raus, das verbraucht bei Gruppenabfragen zu viele SQL-Abfragen -> Die sollen einfach die entsprechenden Read()-Methoden verwenden (Krassestes bsp. ist GET /namespaces mit so ca 50 Abfragen)
2018-11-09 18:33:06 +01:00
* [x] General search endpoints
2018-11-17 00:17:37 +01:00
* [x] Validation der ankommenden structs, am besten mit https://github.com/go-validator/validator oder mit dem Ding von echo
2018-11-09 11:30:17 +01:00
* [x] Pagination
2018-10-21 22:19:51 +02:00
* Sollte in der Config definierbar sein, wie viel pro Seite angezeigt werden soll, die CRUD-Methoden übergeben dann ein "gibt mir die Seite sowieso" an die CRUDable-Funktionenen, die müssen das dann Auswerten. Geht leider nicht anders, wenn man erst 2342352 Einträge hohlt und die dann nachträglich auf 200 begrenzt ist das ne massive Ressourcenverschwendung.
2018-11-17 00:17:37 +01:00
* [x] Testen, ob man über die Routen methode von echo irgendwie ein swagger spec generieren könnte -> Andere Swagger library
2019-05-22 19:48:48 +02:00
* [x] CalDAV
2018-11-06 23:09:54 +01:00
* [x] Basics
* [x] Reminders
2019-05-22 19:48:48 +02:00
* [x] Discovery, stichwort PROPFIND
2018-11-19 12:37:59 +01:00
* [x] Wir brauchen noch ne gute idee, wie man die listen kriegt, auf die man nur so Zugriff hat (ohne namespace)
2018-11-17 00:20:48 +01:00
* Dazu am Besten nen pseudonamespace anlegen (id -1 oder so), der hat das dann alles
2018-12-12 16:25:39 +01:00
* [x] Testing mit locust: https://locust.io/
2019-07-18 18:38:21 +02:00
* [x] Endpoint to get all users who have access to a list - regardless of via team, user share or via namespace
2018-09-12 22:59:45 +02:00
2018-10-21 22:21:37 +02:00
#### Userstuff
2018-11-17 00:20:48 +01:00
* [x] Userstuff aufräumen
2018-10-21 22:21:37 +02:00
-> Soweit es geht und Sinnvoll ist auf den neuen Handler umziehen
-> Login/Register/Password-reset geht natürlich nicht
-> Bleibt noch Profile abrufen und Einstellungen -> Macht also keinen Sinn das auf den neuen Handler umzuziehen
2018-10-27 15:14:55 +02:00
* [x] Email-Verifizierung beim Registrieren
2019-04-28 23:50:38 +02:00
* [x] Password Reset
2019-05-31 09:24:59 +02:00
* [x] New field in user model which holds a url of an avatar image - for now just Gravatar, later more
2018-10-22 22:20:45 +02:00
* [ ] Settings
2018-12-27 23:37:25 +01:00
* [ ] Password update
* [ ] Email update
* [ ] Ob man über email oder Benutzernamen gefunden werden darf
2018-11-03 16:05:45 +01:00
2018-12-14 17:45:31 +01:00
### Bugfixes
2018-12-19 22:05:25 +01:00
* [x] Panic wenn mailer nicht erreichbar -> Als workaround mailer deaktivierbar machen, bzw keine mails verschicken
2018-12-17 13:22:06 +01:00
* [x] "unexpected EOF"
2018-12-19 22:05:25 +01:00
* [x] Beim Login & Password reset gibt die API zurück dass der Nutzer nicht existiert
2019-04-01 21:48:48 +02:00
* [x] Re-check rights checks to see if all information which is compared against is properly read from the db and not only based on user input
* [x] Lists
* [x] List users
* [x] List Teams
* [x] Labels
* [x] Tasks
* [x] Namespaces
* [x] Namespace users
* [x] Namespace teams
* [x] Teams
* [x] Team member handling
* [x] Also check `ReadOne()` for unnessecary database operations since the inital query is already done in `CanRead()`
2019-04-01 20:19:55 +02:00
* [x] Add a `User.AfterLoad()` which obfuscates the email address
2019-04-05 12:40:40 +02:00
* [x] Fix priority not updating to 0
2018-12-14 17:45:31 +01:00
2018-12-12 23:56:00 +01:00
### Docs
2019-02-17 20:53:04 +01:00
* [x] Readme
2018-12-27 23:37:25 +01:00
* [x] Auch noch nen "link" zum Featurecreep
2019-02-17 20:53:04 +01:00
* [x] ToC
* [x] Logo
* [x] How to build -> Docs
* [x] How to dev -> Docs
* [x] License
* [x] Contributing
2019-01-03 23:22:06 +01:00
* [x] Redocs
* [x] Swaggerdocs verbessern
* [x] Descriptions in structs
* [x] Maxlength specify etc. (see swaggo docs)
* [x] Rights
* [x] API
2019-02-17 20:53:04 +01:00
* [x] Anleitung zum Makefile
* [x] How to build from source
* [x] Struktur erklären
* [x] Deploy in die docs
* [x] Docker
* [x] Native (systemd + nginx/apache)
* [x] Backups
* [x] Docs aufsetzen
2018-10-21 22:21:37 +02:00
2019-07-16 01:04:19 +02:00
#### Better caldav support
* [x] VTODO
* [x] Fix organizer prop
* [x] Depricate the events thing for now
* [x] PROPFIND/OPTIONS : caldav discovery
* [x] Create new tasks
* [x] Save uid from the client
* [x] Update tasks
* [x] Marking as done
* [x] Fix OPTIONS Requests to the rest of the api being broken
* [x] Parse all props defined in rfc5545
* [x] COMPLETED -> Need to actually save the time the task was completed
* [x] Whenever a task ist created/updated, update the `updated` prop on the list so the etag changes and clients get notified
* [x] Fix not all tasks being displayed (My guess: Something about that f*cking etag)
* [x] Delete tasks
* [x] Last modified
* [x] Content Size
* [x] Modify the caldav lib as proposed in the pr
* [x] Improve login performance, each request taking > 1.5 sec is just too much, maybe just use the default value for hash iterations in the login/register function
* [x] Only show priority when we have one
* [x] Show a proper calendar title
* [x] Fix home principal propfind stuff
* [x] Docs
* [x] Setting to disable caldav completely
* [ ] Make it work with the app
* [ ] Cleanup the whole mess I made with the handlers and storage providers etc -> Probably a good idea to create a seperate storage provider etc for lists and tasks
* [ ] Tests
* [ ] Check if only needed things are queried from the db when accessing dav (for ex. no need to get all tasks when we act
2019-07-18 22:54:55 +02:00
### General features
* [x] Deps nach mod umziehen
* [x] Performance bei rechtchecks verbessern
* User & Teamright sollte sich für n rechte in einer Funktion testen lassen
* [x] Colors for tasks
* [x] /info endpoint, in dem dann zb die limits und version etc steht
* [x] Bindata for templates
* [x] User struct should have a field for the avatar url (-> gravatar md5 calculated by the backend)
2019-07-21 23:27:30 +02:00
* [x] Middleware to have configurable rate-limiting per user
2019-07-21 23:53:04 +02:00
* [ ] Colors for lists and namespaces -> Up to the frontend to implement these
2019-07-18 22:54:55 +02:00
* [ ] Reminders via mail
2019-09-20 18:16:31 +02:00
* [ ] Be able to "really" delete the account -> delete all lists and move ownership for others
2019-07-18 22:54:55 +02:00
* [ ] All `ReadAll` methods should return the number of items per page, the number of items on this page, the total pages and the items
-> Check if there's a way to do that efficently. Maybe only implementing it in the web handler.
* [ ] Move lists between namespaces -> Extra endpoint
2019-07-16 01:04:19 +02:00
### Infra
* [ ] Debian package should have a service file
* [ ] Downloads should be served via nginx (with theme?), minio should only be used for pushing artifacts.
2018-12-28 23:15:05 +01:00
2019-01-10 00:08:12 +01:00
### Refactor
2019-01-14 22:49:50 +01:00
* [x] ListTaskRights, sollte überall gleich funktionieren, gibt ja mittlerweile auch eine Methode um liste von nem Task aus zu kriegen oder so
2019-01-14 23:32:56 +01:00
* [x] Re-check all `{List|Namespace}{User|Team}` if really all parameters need to be exposed via json or are overwritten via param anyway.
2019-02-18 19:06:15 +01:00
* [x] Things like list/task order should use queries and not url params
2019-02-18 20:32:41 +01:00
* [x] Fix lint errors
2019-05-25 07:49:52 +02:00
* [x] Add settings for max open/idle connections and max connection lifetime
2019-05-25 09:33:57 +02:00
* [x] Reminders should use an extra table so we can make reverse lookups aka "give me all tasks with reminders in this period" which we'll need for things like email reminders notifications
2019-05-25 11:47:16 +02:00
* [x] When giving a user access to a list/namespace, they should be reffered to by uuid, not numeric id
* [x] Adding users to a team should also use uuid
2019-05-25 12:16:55 +02:00
* [x] Check if the team/user really exist before updating them on lists/namespaces
2019-07-16 01:04:19 +02:00
* [x] Refactor config handling: Custom type "key" or so which holds the viper const and then mixins on that type to get the values from viper
2019-07-18 18:38:21 +02:00
* [x] Less files, but with some kind of logic
2019-07-20 20:12:10 +02:00
* [x] Have extra functions for logging to call so it is possible to call `log.Info` instead of `log.Log.Info`
2019-08-14 21:59:31 +02:00
* [x] `GetUserByID` and the likes should return pointers
2019-08-14 22:19:04 +02:00
* [x] `ListTask` should be just `Task`
2019-09-20 18:39:02 +02:00
* [x] Move `teams_{namespace|list}_*` to `{namespace|list}_teams_*` for better consistency
2019-03-03 17:43:25 +01:00
2018-12-28 23:15:05 +01:00
### Linters
* [x] goconst
2019-03-31 22:31:03 +02:00
* [x] Staticcheck
2019-02-18 20:32:41 +01:00
* [x] gocyclo-check
* [ ] gosec-check -> waiting for mod
2019-03-31 22:31:03 +02:00
* [x] goconst-check
* [ ] golangci -> docker in drone, will probably make all other linters obsolete
2019-01-17 00:57:13 +01:00
2019-05-30 22:32:24 +02:00
### Tasks
* [x] Start/Enddatum für Tasks
* [x] Timeline/Calendar view -> Dazu tasks die in einem Bestimmten Bereich due sind, macht dann das Frontend
* [x] Tasks innerhalb eines definierbarem Bereich, sollte aber trotzdem der server machen, so à la "Gib mir alles für diesen Monat"
* [x] Bulk-edit -> Transactions
* [x] Assignees
* [x] Check if something changed at all before running everything
* [x] Don't use `list.ReadOne()` , gets too much unnessecary shit
* [x] Wegen Performance auf eigene endpoints umziehen, wie labels
* [x] "One endpoint to rule them all" -> Array-addable
* [x] Labels
* [x] Check if something changed at all before running everything
* [x] Editable via task edit, like assignees
* [x] "One endpoint to rule them all" -> Array-addable
2019-07-18 21:56:34 +02:00
* [x] Description should be longtext
2019-09-21 12:52:10 +02:00
* [x] Percent done - For now just a float, may later depend on how many sub tasks are done or so
2019-10-16 22:52:29 +02:00
* [x] Attachments
* Extra file handling package
* Files are saved "somewhere" (configurable) using their ID -> now only fs, later other things, based on afero
* A files table which holds metadata like filename, created by etc
* The files sub package should have methods to return files as byte slice or so
* -> The concrete implementation (in this case task attachments) handles the rights for a file
* task attachments are just a n:m between a task and a file id
2019-09-25 20:45:20 +02:00
* [x] Related tasks -> settable with a "kind" of relation like blocked, subtask, or just related or so
2019-09-25 20:44:41 +02:00
* [x] Should be possible to relate tasks which are not in the same list
2019-09-25 20:45:20 +02:00
* [x] Replace the old subtask implementation
2019-09-20 18:45:28 +02:00
* New Struct for the relation
* Endpoint to get all full related tasks for a task
* When using task.ReadOne() or ReadAll() only get the relation kind + title etc, not everything
* Only check if the user has the right to see the task when creating it, not when viewing it -> put a warning in frontend
* Relation Kinds (for now): Subtask/Parent Task (from subtask, no extra relation), Related, later also Blocked/Blocking
* Should also be possible to create a new task with relations directly
* For everything else dedicated endpoints to manage relations
2019-05-30 22:32:24 +02:00
* [ ] Move tasks between lists
2019-07-16 01:04:19 +02:00
* [ ] "Status" field for things like "New", "In Progress", "Done", etc (customizable statuses)
2019-05-30 22:32:24 +02:00
#### Events
* [ ] Whenever something happens an event should be registered in the db, sse, mail, etc. -> Abstract with implementations for various things
* [ ] Activity Feed, so à la "der und der hat das und das gemacht etc"
* [ ] Per list
* [ ] For the current user
* [ ] ~~Websockets~~ SSE https://github.com/kljensen/golang-html5-sse-example
* User authenticates (with jwt)
* When updating/creating/etc an event struct is sent to the broker
* The broker has a list of subscribed users
* It then checks who is allowed to the see the event it recieved and sends it
* [ ] Being able to define filters for notifications or turn them silent completely -> Probably frontend only
2019-08-11 14:56:50 +02:00
* [ ] Settings for which notifications to recieve over which channel
* [ ] Different time-based filters
* [ ] Subscriptions to tasks or whole project/namespace
2019-05-30 22:32:24 +02:00
2019-01-20 00:56:36 +01:00
### More server settings
2019-05-25 10:09:47 +02:00
* [x] Caldav disable/enable
2019-01-20 00:56:36 +01:00
* [ ] Assignees disable/enable
2019-05-27 18:30:08 +02:00
* [ ] Max number of assignees
2019-01-20 00:56:36 +01:00
* [ ] List/Namespace limits
* [ ] Attachements disable/enable
* [ ] Attachements size
* [ ] Templates disable/enable
* [ ] Stats disable/enable
* [ ] Activity notifications disable/enable
* [ ] IMAP integration disable/enable
* [ ] Reminders via mail disable/enable
2019-01-17 00:57:13 +01:00
### Later
2019-07-16 01:04:19 +02:00
* [ ] Public lists
* [ ] Sorting lists by members, tasks, teams, last modified, etc (all possible fields)
2019-05-22 19:48:48 +02:00
* [ ] Backgrounds for lists -> needs uploading and storing and so on
2019-01-17 00:57:13 +01:00
* [ ] Plugins
2019-09-05 22:48:51 +02:00
* [ ] Rename Namespaces to collections (or spaces?)? Or discard the whole namespace concept alltogether since it may be too confusing? -> Projects only
2019-05-25 10:09:47 +02:00
* [ ] Collections n-n (one list can be in multiple collections)?
* [ ] Rename lists to projects
2019-07-18 22:54:55 +02:00
* [ ] "Performance-Statistik" -> Wie viele Tasks man in bestimmten Zeiträumen so geschafft hat etc
* [ ] List stats to see how many tasks are done, how many are there in total, how many people have acces to a list etc
* [ ] IMAP-Integration -> Man schickt eine email an Vikunja und es macht daraus dann nen task -> Achtung missbrauchsmöglichkeiten
* [ ] In und Out webhooks, mit Templates vom Payload
* [ ] Some kind of milestones for tasks
2019-10-16 22:52:29 +02:00
* [ ] Global/Per Namespace labels
2019-07-18 22:54:55 +02:00
* [ ] Get Weekly/Daily summary of the tasks to come per mail
2019-09-05 22:48:51 +02:00
* [ ] Boards (Boards)
* [ ] Sprints
2019-09-05 22:00:21 +02:00
* [ ] Epics
* [ ] Stories
* Maybe we can do both epics and stories with a new field "kind" on tasks, since epics and stories are basically high-level-overview tasks
* Needs proper subtask stuff / relatsions
2019-01-17 00:57:13 +01:00
* [ ] Per-User limits of lists/namespaces
* [ ] Admin-Interface to do stuff like settings and user management
* [ ] Enable/Disable users
2019-05-27 18:30:08 +02:00
* [ ] Manage user groups -> Creating new roles and defining what they're allowed to do etc.
* [ ] Manage custom fields task templates
2019-01-17 00:57:13 +01:00
* [ ] Enable/disable allowing user adding to lists/namespaces for specific lists or namespaces
* [ ] Admins should be able to see and mange all the boards
2019-05-27 18:30:08 +02:00
* [ ] Admin interface also usable via cli
* [ ] `dump` and `restore` cli commands
* [ ] Better rights system with user roles, to be able to manage fine-graded permissions on fields -> Giving read/write right for each field/action
* [ ] Roles which enable or disable chaning certain fields of a task -> includes custm fields
* [ ] Pre-defined roles to make it easier to set up (creatable via admin)
2019-01-17 00:57:13 +01:00
* [ ] Limit registration to users with a defined email domain
* [ ] Close the instance, either no registration or only one with defined email
* [ ] 2fa
2019-05-27 18:30:08 +02:00
* [ ] Custom fields for tasks: Templates at List > Namespace > Global level, overwriting each other
* [ ] Task-Templates in namespaces and lists (-> Multiple which are selectable)
2019-09-05 22:48:51 +02:00
* The frontend would then GET the template, offer them in a drop down kind of thing and prefill the values, the api won't do anything
about creating a task based on a template except providing it to the frontend
2019-01-17 00:57:13 +01:00
* [ ] "Favourite lists" -> A user can favourize boards which will then show up in a pseudonamespace
2019-09-05 22:48:51 +02:00
* [ ] Internal lists -> Only registered users can see the list, but without explicit sharing
2019-01-17 00:57:13 +01:00
* [ ] Rights management for both public and internal lists
2019-05-27 18:30:08 +02:00
* [ ] Export all data from Vikunja to json (related: `dump` cli command)
* [ ] Per user and for the whole instance
2019-01-20 00:56:36 +01:00
* [ ] Watch a (n internal) list -> Will get notification for everything
2019-09-05 22:48:51 +02:00
* [ ] Automatically subscribe when mentioning/commenting/assigning a user
* [ ] Archive a task/project/namespace instead of deleting -> When archived, everything is read only
* [ ] Task dependencies -> Can be implemented by using relations
2019-01-17 00:57:13 +01:00
* [ ] Time tracking (possible plugin)
* [ ] IFTTT
2019-07-18 22:54:55 +02:00
* [ ] Task automation: Being able to create own flows "if this event is fired, do this" and so on
2019-09-05 22:48:51 +02:00
* [ ] User online status -> Maybe just take that from metrics?
* [ ] Add new users via to a list which don't have an account yet, they'd get a link to sign up for vikunja.
* [ ] Respect registration email domain limits
2019-02-17 20:53:04 +01:00
* [ ] More sharing features (all of these with the already existing permissions)
2019-08-31 22:56:41 +02:00
* [x] Share a link with/without password
2019-09-05 22:48:51 +02:00
* [ ] Invite users per mail -> can easily be based off the link sharing stuff
2019-02-17 20:53:04 +01:00
* [ ] Comments on tasks
* [ ] @mention users in tasks or comments to get them notified
* [ ] Summary of tasks to do in a configurable interval (every day/week or so)
2019-05-25 10:09:47 +02:00
* [ ] Disable/enable task fields in a list
* [ ] With inheritence from namespaces
2019-08-11 14:56:50 +02:00
* [ ] Custom statuses for tasks and projects, configurable in the list settings
2019-05-25 10:09:47 +02:00
* [ ] With inheritence from namespaces
2019-09-05 22:48:51 +02:00
* [ ] (sub-)Project start/end/deadline dates
2019-05-27 18:30:08 +02:00
* [ ] Better filters
2019-05-25 10:09:47 +02:00
* [ ] by lables
* [ ] Due dates
* [ ] Start/End dates
* [ ] Assignees
* [ ] Priorities
2019-07-16 01:04:19 +02:00
* [ ] Status
2019-05-27 18:30:08 +02:00
* [ ] "Smart Lists", filtered lists, saved in some kind of pseudonamespace
* [ ] Global and per list
2019-07-21 23:53:04 +02:00
* [ ] Bulk-create lists/tasks -> needed for importer
2019-02-17 20:53:04 +01:00
* [ ] Importer (maybe frontend only)
* [ ] Trello
* [ ] Wunderlist
* [ ] Zenkit
* [ ] Asana
* [ ] Microsoft Todo
* [ ] Nozbe
* [ ] Lanes
* [ ] Nirvana
2019-05-22 19:48:48 +02:00
* [ ] Any.do
2019-02-17 20:53:04 +01:00
* [ ] Good ol' Caldav (Tasks)
2019-05-25 10:09:47 +02:00
* [ ] ClickUp
2019-08-13 22:31:05 +02:00
* [ ] Plutoio
* [ ] Clubhouse
* [ ] Roadmap
* [ ] Joplin
2019-07-21 23:53:04 +02:00
* [ ] A markdown file like this one
* [ ] Vikunja json export
2019-02-17 20:53:04 +01:00
* [ ] More auth providers
* [ ] LDAP/AD
* [ ] Kerberos
* [ ] SAML (what?)
* [ ] smtp
* [ ] OpenID