Add migration function stubs
This commit is contained in:
parent
d49eaac191
commit
4876542124
|
@ -189,16 +189,14 @@ migration:
|
||||||
# Wheter to enable the trello migrator or not
|
# Wheter to enable the trello migrator or not
|
||||||
enable: false
|
enable: false
|
||||||
# The client id, required for making requests to the trello api
|
# The client id, required for making requests to the trello api
|
||||||
# You need to register your vikunja instance at to get this
|
# You need to register your vikunja instance at https://trello.com/app-key (log in before you visit that link) to get this
|
||||||
clientid:
|
key:
|
||||||
# The client secret, also required for making requests to the trello api
|
|
||||||
clientsecret:
|
|
||||||
# The url where clients are redirected after they authorized Vikunja to access their trello cards.
|
# The url where clients are redirected after they authorized Vikunja to access their trello cards.
|
||||||
# This needs to match the url you entered when registering your Vikunja instance at trello.
|
# This needs to match the url you entered when registering your Vikunja instance at trello.
|
||||||
# This is usually the frontend url where the frontend then makes a request to /migration/trello/migrate
|
# This is usually the frontend url where the frontend then makes a request to /migration/trello/migrate
|
||||||
# with the code obtained from the trello api.
|
# with the code obtained from the trello api.
|
||||||
# Note that the vikunja frontend expects this to be /migrate/trello
|
# Note that the vikunja frontend expects this to end on /migrate/trello.
|
||||||
redirecturl:
|
redirecturl: <frontend url>/migrate/trello
|
||||||
|
|
||||||
avatar:
|
avatar:
|
||||||
# When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires
|
# When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -21,6 +21,7 @@ require (
|
||||||
code.vikunja.io/web v0.0.0-20200809154828-8767618f181f
|
code.vikunja.io/web v0.0.0-20200809154828-8767618f181f
|
||||||
dmitri.shuralyov.com/go/generated v0.0.0-20170818220700-b1254a446363 // indirect
|
dmitri.shuralyov.com/go/generated v0.0.0-20170818220700-b1254a446363 // indirect
|
||||||
gitea.com/xorm/xorm-redis-cache v0.2.0
|
gitea.com/xorm/xorm-redis-cache v0.2.0
|
||||||
|
github.com/adlio/trello v1.8.0
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
||||||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
|
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
|
||||||
github.com/beevik/etree v1.1.0 // indirect
|
github.com/beevik/etree v1.1.0 // indirect
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -74,6 +74,8 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR
|
||||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||||
|
github.com/adlio/trello v1.8.0 h1:VU/1zwzuRzATsFC8WiK4f8R0HHQPWpf2H658KEchsmA=
|
||||||
|
github.com/adlio/trello v1.8.0/go.mod h1:l2068AhUuUuQ9Vsb95ECMueHThYyAj4e85lWPmr2/LE=
|
||||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||||
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
|
|
@ -119,8 +119,7 @@ const (
|
||||||
MigrationTodoistClientSecret Key = `migration.todoist.clientsecret`
|
MigrationTodoistClientSecret Key = `migration.todoist.clientsecret`
|
||||||
MigrationTodoistRedirectURL Key = `migration.todoist.redirecturl`
|
MigrationTodoistRedirectURL Key = `migration.todoist.redirecturl`
|
||||||
MigrationTrelloEnable Key = `migration.trello.enable`
|
MigrationTrelloEnable Key = `migration.trello.enable`
|
||||||
MigrationTrelloClientID Key = `migration.trello.clientid`
|
MigrationTrelloKey Key = `migration.trello.key`
|
||||||
MigrationTrelloClientSecret Key = `migration.trello.clientsecret`
|
|
||||||
MigrationTrelloRedirectURL Key = `migration.trello.redirecturl`
|
MigrationTrelloRedirectURL Key = `migration.trello.redirecturl`
|
||||||
|
|
||||||
CorsEnable Key = `cors.enable`
|
CorsEnable Key = `cors.enable`
|
||||||
|
@ -346,6 +345,10 @@ func InitConfig() {
|
||||||
AuthOpenIDRedirectURL.Set(ServiceFrontendurl.GetString() + "auth/openid/")
|
AuthOpenIDRedirectURL.Set(ServiceFrontendurl.GetString() + "auth/openid/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if MigrationTrelloRedirectURL.GetString() == "" {
|
||||||
|
MigrationTrelloRedirectURL.Set(ServiceFrontendurl.GetString() + "migrate/trello")
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("Using config file: %s", viper.ConfigFileUsed())
|
log.Printf("Using config file: %s", viper.ConfigFileUsed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,36 @@
|
||||||
|
|
||||||
package trello
|
package trello
|
||||||
|
|
||||||
import "code.vikunja.io/api/pkg/user"
|
import (
|
||||||
|
"code.vikunja.io/api/pkg/config"
|
||||||
|
"code.vikunja.io/api/pkg/log"
|
||||||
|
"code.vikunja.io/api/pkg/models"
|
||||||
|
"code.vikunja.io/api/pkg/modules/migration"
|
||||||
|
"code.vikunja.io/api/pkg/user"
|
||||||
|
"github.com/adlio/trello"
|
||||||
|
)
|
||||||
|
|
||||||
type Migration struct {
|
type Migration struct {
|
||||||
|
Token string `json:"token"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var trelloColorMap map[string]string
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
trelloColorMap = make(map[string]string, 10)
|
||||||
|
trelloColorMap = map[string]string{
|
||||||
|
"green": "61bd4f",
|
||||||
|
"yellow": "f2d600",
|
||||||
|
"orange": "ff9f1a",
|
||||||
|
"red": "eb5a46",
|
||||||
|
"sky": "00c2e0",
|
||||||
|
"lime": "51e898",
|
||||||
|
"purple": "c377e0",
|
||||||
|
"blue": "0079bf",
|
||||||
|
"pink": "ff78cb",
|
||||||
|
"black": "344563",
|
||||||
|
"transparent": "", // Empty
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name is used to get the name of the trello migration - we're using the docs here to annotate the status route.
|
// Name is used to get the name of the trello migration - we're using the docs here to annotate the status route.
|
||||||
|
@ -44,7 +71,68 @@ func (m *Migration) Name() string {
|
||||||
// @Failure 500 {object} models.Message "Internal server error"
|
// @Failure 500 {object} models.Message "Internal server error"
|
||||||
// @Router /migration/trello/auth [get]
|
// @Router /migration/trello/auth [get]
|
||||||
func (m *Migration) AuthURL() string {
|
func (m *Migration) AuthURL() string {
|
||||||
panic("implement me")
|
return "https://trello.com/1/authorize" +
|
||||||
|
"?expiration=1hour" +
|
||||||
|
"&scope=read" +
|
||||||
|
"&callback_method=fragment" +
|
||||||
|
"&response_type=token" +
|
||||||
|
"&name=Vikunja%20Migration" +
|
||||||
|
"&key=" + config.MigrationTrelloKey.GetString() +
|
||||||
|
"&return_url=" + config.MigrationTrelloRedirectURL.GetString()
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTrelloData(token string) (trelloData []*trello.Board, err error) {
|
||||||
|
client := trello.NewClient(config.MigrationTrelloKey.GetString(), token)
|
||||||
|
client.Logger = log.GetLogger()
|
||||||
|
|
||||||
|
trelloData, err = client.GetMyBoards(trello.Defaults())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, board := range trelloData {
|
||||||
|
board.Lists, err = board.GetLists(trello.Defaults())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
listMap := make(map[string]*trello.List, len(board.Lists))
|
||||||
|
for _, list := range board.Lists {
|
||||||
|
listMap[list.ID] = list
|
||||||
|
}
|
||||||
|
|
||||||
|
cards, err := board.GetCards(trello.Defaults())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, card := range cards {
|
||||||
|
list, exists := listMap[card.IDList]
|
||||||
|
if !exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Cards = append(list.Cards, card)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts all previously obtained data from trello into the vikunja format.
|
||||||
|
// `trelloData` should contain all boards with their lists and cards respectively.
|
||||||
|
func convertTrelloDataToVikunja(trelloData []*trello.Board) (fullVikunjaHierachie []*models.NamespaceWithLists, err error) {
|
||||||
|
|
||||||
|
// Archived Board (closed)
|
||||||
|
// Backgrounds
|
||||||
|
|
||||||
|
// Labels
|
||||||
|
// Checklists (as markdown in description)
|
||||||
|
// Due Date
|
||||||
|
// Reminders for due dates
|
||||||
|
// Attachments
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate gets all tasks from trello for a user and puts them into vikunja
|
// Migrate gets all tasks from trello for a user and puts them into vikunja
|
||||||
|
@ -54,10 +142,37 @@ func (m *Migration) AuthURL() string {
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Security JWTKeyAuth
|
// @Security JWTKeyAuth
|
||||||
// @Param migrationCode body trello.Migration true "The auth code previously obtained from the auth url. See the docs for /migration/trello/auth."
|
// @Param migrationCode body trello.Migration true "The auth token previously obtained from the auth url. See the docs for /migration/trello/auth."
|
||||||
// @Success 200 {object} models.Message "A message telling you everything was migrated successfully."
|
// @Success 200 {object} models.Message "A message telling you everything was migrated successfully."
|
||||||
// @Failure 500 {object} models.Message "Internal server error"
|
// @Failure 500 {object} models.Message "Internal server error"
|
||||||
// @Router /migration/trello/migrate [post]
|
// @Router /migration/trello/migrate [post]
|
||||||
func (m *Migration) Migrate(user *user.User) error {
|
func (m *Migration) Migrate(u *user.User) (err error) {
|
||||||
panic("implement me")
|
log.Debugf("[Trello Migration] Starting migration for user %d", u.ID)
|
||||||
|
log.Debugf("[Trello Migration] Getting all trello data for user %d", u.ID)
|
||||||
|
|
||||||
|
trelloData, err := getTrelloData(m.Token)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("[Trello Migration] Got all trello data for user %d", u.ID)
|
||||||
|
log.Debugf("[Trello Migration] Start converting trello data for user %d", u.ID)
|
||||||
|
|
||||||
|
fullVikunjaHierachie, err := convertTrelloDataToVikunja(trelloData)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("[Trello Migration] Done migrating trello data for user %d", u.ID)
|
||||||
|
log.Debugf("[Trello Migration] Start inserting trello data for user %d", u.ID)
|
||||||
|
|
||||||
|
err = migration.InsertFromStructure(fullVikunjaHierachie, u)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("[Trello Migration] Done inserting trello data for user %d", u.ID)
|
||||||
|
log.Debugf("[Trello Migration] Migration done for user %d", u.ID)
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue