This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 6da478b54 fix(server,asana): surface real /proceed-db-migration error 
instead of bare 500 (#9068)
6da478b54 is described below

commit 6da478b5491e0308a39539e08949313396776507
Author: bujjibabukatta <[email protected]>
AuthorDate: Mon Aug 24 13:08:46 2026 -0400

    fix(server,asana): surface real /proceed-db-migration error instead of bare 
500 (#9068)
---
 .../20260509000001_encrypt_connection_token.go     | 25 ++++++++++++++++++++--
 backend/server/api/api.go                          |  8 ++++---
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git 
a/backend/plugins/asana/models/migrationscripts/20260509000001_encrypt_connection_token.go
 
b/backend/plugins/asana/models/migrationscripts/20260509000001_encrypt_connection_token.go
index 6a67eacee..fee89ca11 100644
--- 
a/backend/plugins/asana/models/migrationscripts/20260509000001_encrypt_connection_token.go
+++ 
b/backend/plugins/asana/models/migrationscripts/20260509000001_encrypt_connection_token.go
@@ -18,6 +18,8 @@ limitations under the License.
 package migrationscripts
 
 import (
+       "fmt"
+
        "github.com/apache/incubator-devlake/core/context"
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
@@ -39,7 +41,13 @@ func (*encryptConnectionToken) Up(basicRes context.BasicRes) 
errors.Error {
        db := basicRes.GetDal()
        encKey := basicRes.GetConfig(plugin.EncodeKeyEnvStr)
        if encKey == "" {
-               return errors.BadInput.New("asana invalid encKey")
+               return errors.BadInput.New(
+                       "ENCRYPTION_SECRET is not set — this is required to 
encrypt existing Asana connection " +
+                               "tokens as part of this migration. Please set 
the ENCRYPTION_SECRET environment " +
+                               "variable to the value of ENCODE_KEY from your 
previous deployment's .env file, " +
+                               "then retry the migration. See 
https://devlake.apache.org/docs/GettingStarted/Upgrade/ " +
+                               "for details.",
+               )
        }
 
        cursor, err := db.Cursor(dal.From(&asanaConnectionTokenPlain{}))
@@ -56,9 +64,22 @@ func (*encryptConnectionToken) Up(basicRes context.BasicRes) 
errors.Error {
                if row.Token == "" {
                        continue
                }
+
+               // Skip tokens already encrypted, so retries don't 
double-encrypt them.
+               if _, decryptErr := plugin.Decrypt(encKey, row.Token); 
decryptErr == nil {
+                       continue
+               }
+
                encryptedToken, err := plugin.Encrypt(encKey, row.Token)
                if err != nil {
-                       return err
+                       return errors.Default.Wrap(err,
+                               fmt.Sprintf(
+                                       "failed to encrypt token for asana 
connection id=%d — this usually means "+
+                                               "ENCRYPTION_SECRET does not 
match the ENCODE_KEY used to originally store "+
+                                               "this connection's token",
+                                       row.ID,
+                               ),
+                       )
                }
                err = db.UpdateColumns(
                        row.TableName(),
diff --git a/backend/server/api/api.go b/backend/server/api/api.go
index b0dfd74dd..4c880ec9c 100644
--- a/backend/server/api/api.go
+++ b/backend/server/api/api.go
@@ -130,9 +130,11 @@ func SetupApiServer(router *gin.Engine) {
        // Endpoint to proceed database migration — listed in auth.publicPaths 
because
        // auth tables may not exist yet when migration is pending.
        router.GET("/proceed-db-migration", func(ctx *gin.Context) {
-               // Execute database migration
-               errors.Must(services.ExecuteMigration())
-               // Return success response
+               // Surface the real migration error to the client instead of a 
bare 500.
+               if err := services.ExecuteMigration(); err != nil {
+                       shared.ApiOutputError(ctx, err)
+                       return
+               }
                shared.ApiOutputSuccess(ctx, nil, http.StatusOK)
        })
 

Reply via email to