diff --git a/runner/component/imagebuilder.go b/runner/component/imagebuilder.go index 73ea1beea..ea6e76fe9 100644 --- a/runner/component/imagebuilder.go +++ b/runner/component/imagebuilder.go @@ -84,6 +84,7 @@ func (ibc *imagebuilderComponentImpl) Build(ctx context.Context, req ctypes.Imag imagePath := path.Join(ibc.config.Space.DockerRegBase, imageName) cluster, err := ibc.GetCluster(ctx, req.ClusterID) if err != nil { + slog.ErrorContext(ctx, "failed to get cluster by id", slog.String("cluster id", req.ClusterID), slog.Any("error", err)) return fmt.Errorf("failed to get cluster by id: %w", err) } @@ -134,7 +135,7 @@ func (ibc *imagebuilderComponentImpl) Build(ctx context.Context, req ctypes.Imag func (ibc *imagebuilderComponentImpl) checkAndRemoveExistingWorkflow(ctx context.Context, cluster *cluster.Cluster, namespace, createWorkflowName string) error { checkWft, err := cluster.ArgoClient.ArgoprojV1alpha1().Workflows(namespace).Get(ctx, createWorkflowName, metav1.GetOptions{}) - slog.Debug("get workflow for space image build", slog.Any("checkWft", checkWft), slog.Any("error", err)) + slog.DebugContext(ctx, "get workflow for space image build", slog.Any("checkWft", checkWft), slog.Any("error", err)) if err != nil { if statusErr, ok := err.(*k8serrors.StatusError); ok { //{Status: "Failure", Message: "workflows.argoproj.io \"xxxx\" not found", Reason: "NotFound", Code: 404}} @@ -477,13 +478,13 @@ func createOrUpdateConfigMap(ctx context.Context, client kubernetes.Interface, c func (ibc *imagebuilderComponentImpl) newPersistentVolumeClaim(ctx context.Context, cluster *cluster.Cluster, pvcName string) error { // Check if it already exists - slog.Info("check pvc for imagebuilder", slog.String("pvc", pvcName), slog.String("storageClass", cluster.StorageClass), slog.Any("storage len", len(cluster.StorageClass))) + slog.InfoContext(ctx, "check pvc for imagebuilder", slog.String("pvc", pvcName), slog.String("storageClass", cluster.StorageClass), slog.Any("storage len", len(cluster.StorageClass))) _, err := cluster.Client.CoreV1().PersistentVolumeClaims(ibc.config.Cluster.SpaceNamespace).Get(ctx, pvcName, metav1.GetOptions{}) if err == nil { return nil } - slog.Info("create pvc for imagebuilder", slog.String("pvc", pvcName), slog.String("storageClass", cluster.StorageClass), slog.Any("storage len", len(cluster.StorageClass))) + slog.InfoContext(ctx, "create pvc for imagebuilder", slog.String("pvc", pvcName), slog.String("storageClass", cluster.StorageClass), slog.Any("storage len", len(cluster.StorageClass))) storage, err := resource.ParseQuantity("50Gi") if err != nil { return err diff --git a/runner/component/workflow.go b/runner/component/workflow.go index e5f8f4bbc..f04f060d6 100644 --- a/runner/component/workflow.go +++ b/runner/component/workflow.go @@ -104,7 +104,7 @@ func (wc *workFlowComponentImpl) CreateWorkflow(ctx context.Context, req types.A // create workflow in argo awf := generateWorkflow(req, wc.config) wc.setLabels(argowf, awf) - slog.Info("create workflow in runner", slog.Any("namespace", namespace), slog.Any("awf.name", awf.Name), + slog.InfoContext(ctx, "create workflow in runner", slog.Any("namespace", namespace), slog.Any("awf.name", awf.Name), slog.Any("result-url", argowf.ResultURL), slog.Any("task-type", argowf.TaskType)) _, err = cluster.ArgoClient.ArgoprojV1alpha1().Workflows(namespace).Create(ctx, awf, v1.CreateOptions{}) if err != nil { @@ -115,7 +115,7 @@ func (wc *workFlowComponentImpl) CreateWorkflow(ctx context.Context, req types.A wf, err = wc.wf.CreateWorkFlow(ctx, *argowf) if err != nil { - slog.Error("failed to create workflow in db and verify if workflow exist later", slog.Any("task-id", argowf.TaskId), slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to create workflow in db and verify if workflow exist later", slog.Any("task-id", argowf.TaskId), slog.Any("error", err)) wfObj, findErr := wc.wf.FindByTaskID(ctx, argowf.TaskId) if findErr != nil { return nil, fmt.Errorf("failed to check workflow %s in db for create action, error: %w", argowf.TaskId, findErr) @@ -145,7 +145,7 @@ func (wc *workFlowComponentImpl) DeleteWorkflow(ctx context.Context, req *types. } err = cluster.ArgoClient.ArgoprojV1alpha1().Workflows(req.Namespace).Delete(ctx, req.TaskID, v1.DeleteOptions{}) if err != nil { - slog.Warn("Error deleting argo workflow", slog.Any("error", err)) + slog.WarnContext(ctx, "Error deleting argo workflow", slog.Any("error", err)) } return nil } @@ -164,12 +164,12 @@ func (wc *workFlowComponentImpl) GetWorkflow(ctx context.Context, id int64, user // Update workflow func (wc *workFlowComponentImpl) UpdateWorkflow(ctx context.Context, update *v1alpha1.Workflow, cluster *cluster.Cluster) (*database.ArgoWorkflow, error) { oldwf, err := wc.wf.FindByTaskID(ctx, update.Name) - slog.Info("get-UpdateWorkflow-from-db", slog.Any("oldwf.TaskId", oldwf.TaskId), slog.Any("result-url", oldwf.ResultURL)) + slog.InfoContext(ctx, "get-UpdateWorkflow-from-db", slog.Any("oldwf.TaskId", oldwf.TaskId), slog.Any("result-url", oldwf.ResultURL)) if errors.Is(err, sql.ErrNoRows) { oldwf = *wc.getWorkflowFromLabels(ctx, update) wf, err := wc.wf.CreateWorkFlow(ctx, oldwf) if err != nil { - slog.Error("failed to create workflow in db", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to create workflow in db", slog.Any("error", err)) return nil, fmt.Errorf("failed to create workflow in db: %v", err) } oldwf = *wf @@ -203,7 +203,7 @@ func (wc *workFlowComponentImpl) UpdateWorkflow(ctx context.Context, update *v1a //podName := fmt.Sprintf("%s-%s", oldwf.TaskId, oldwf.ClusterID) logs, err := common.GetPodLog(ctx, cluster.Client, update.Name, update.Namespace, "main") if err != nil { - slog.Error("failed to get pod log", slog.Any("error", err), slog.Any("pod name", update.Name)) + slog.ErrorContext(ctx, "failed to get pod log", slog.Any("error", err), slog.Any("pod name", update.Name)) } else { if len(logs) > 0 { oldwf.Reason = string(logs) @@ -213,7 +213,7 @@ func (wc *workFlowComponentImpl) UpdateWorkflow(ctx context.Context, update *v1a } } - slog.Info("UpdateWorkflow-report", slog.Any("name", oldwf.TaskId), slog.Any("result-url", oldwf.ResultURL)) + slog.InfoContext(ctx, "UpdateWorkflow-report", slog.Any("name", oldwf.TaskId), slog.Any("result-url", oldwf.ResultURL)) wc.addKServiceWithEvent(ctx, types.RunnerWorkflowChange, &oldwf) if lastStatus != oldwf.Status { wc.reportWorFlowLog(types.WorkflowUpdated.String(), &oldwf) @@ -233,7 +233,7 @@ func (wc *workFlowComponentImpl) DeleteWorkflowInargo(ctx context.Context, delet if wf.Status == v1alpha1.WorkflowPending || wf.Status == v1alpha1.WorkflowRunning { wf.Status = v1alpha1.WorkflowFailed wf.Reason = "deleted by admin" - slog.Info("DeleteWorkflowInargo-report", slog.Any("name", wf.TaskId), slog.Any("result-url", wf.ResultURL)) + slog.InfoContext(ctx, "DeleteWorkflowInargo-report", slog.Any("name", wf.TaskId), slog.Any("result-url", wf.ResultURL)) _, err = wc.wf.UpdateWorkFlow(ctx, wf) if err != nil { return err diff --git a/runner/handler/cluster.go b/runner/handler/cluster.go index 25d643e70..9e689b436 100644 --- a/runner/handler/cluster.go +++ b/runner/handler/cluster.go @@ -1,9 +1,10 @@ package handler import ( - "github.com/gin-gonic/gin" "log/slog" "net/http" + + "github.com/gin-gonic/gin" "opencsg.com/csghub-server/builder/deploy/cluster" "opencsg.com/csghub-server/common/config" "opencsg.com/csghub-server/common/types" @@ -36,7 +37,7 @@ func (s *ClusterHandler) GetClusterInfoByID(c *gin.Context) { clusterInfo.StorageClass = cInfo.StorageClass availabilityStatus, resourceAvaliable, err := s.clusterComponent.GetResourceByID(c.Request.Context(), clusterId) if err != nil { - slog.Error("fail to get cluster", slog.Any("error", err)) + slog.ErrorContext(c.Request.Context(), "fail to get cluster", slog.Any("error", err)) c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } diff --git a/runner/handler/imagebuilder.go b/runner/handler/imagebuilder.go index bff359b5c..7faf7c210 100644 --- a/runner/handler/imagebuilder.go +++ b/runner/handler/imagebuilder.go @@ -26,10 +26,12 @@ func NewImagebuilderHandler( clusterPool *cluster.ClusterPool, logReporter reporter.LogCollector) (*ImagebuilderHandler, error) { if clusterPool == nil || len(clusterPool.Clusters) == 0 { + slog.ErrorContext(ctx, "cluster pool is nil") return nil, errors.New("cluster pool is nil") } ibc, err := component.NewImagebuilderComponent(ctx, config, clusterPool, logReporter) if err != nil { + slog.ErrorContext(ctx, "fail to create imagebuilder component", slog.Any("error", err)) return nil, err } return &ImagebuilderHandler{ @@ -51,13 +53,13 @@ func NewImagebuilderHandler( func (ibh *ImagebuilderHandler) Build(ctx *gin.Context) { var req ctypes.ImageBuilderRequest if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("bad params imagebuilder request format", "error", err) + slog.ErrorContext(ctx, "bad params imagebuilder request format", slog.Any("error", err)) ctx.JSON(http.StatusBadRequest, gin.H{"error": "bad params imagebuilder request format:" + err.Error()}) return } err := ibh.ibc.Build(ctx.Request.Context(), req) if err != nil { - slog.Error("fail to image builder", slog.Any("error", err), slog.Any("req", req)) + slog.ErrorContext(ctx, "fail to image builder", slog.Any("error", err), slog.Any("req", req)) ctx.JSON(http.StatusInternalServerError, gin.H{"error": "fail to imagebuilder build:" + err.Error()}) return } @@ -68,16 +70,18 @@ func (ibh *ImagebuilderHandler) Build(ctx *gin.Context) { func (ibh *ImagebuilderHandler) Stop(ctx *gin.Context) { var req ctypes.ImageBuildStopReq if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("bad params imagebuilder request format", "error", err) + slog.ErrorContext(ctx, "bad params imagebuilder request format", slog.Any("error", err)) ctx.JSON(http.StatusBadRequest, gin.H{"error": "bad params imagebuilder request format:" + err.Error()}) return } + slog.InfoContext(ctx, "stop image builder", slog.Any("req", req)) err := ibh.ibc.Stop(ctx.Request.Context(), req) if err != nil { - slog.Error("fail to stop image builder", slog.Any("error", err), slog.Any("deploy_id", req.DeployId)) + slog.ErrorContext(ctx, "fail to stop image builder", slog.Any("error", err), slog.Any("deploy_id", req.DeployId)) ctx.JSON(http.StatusInternalServerError, err.Error()) return } + slog.InfoContext(ctx, "stop image builder success", slog.Any("req", req)) httpbase.OK(ctx, nil) } diff --git a/runner/handler/workflow.go b/runner/handler/workflow.go index f85e31e9f..80116a936 100644 --- a/runner/handler/workflow.go +++ b/runner/handler/workflow.go @@ -42,13 +42,13 @@ func (a *ArgoHandler) CreateWorkflow(ctx *gin.Context) { var req types.ArgoWorkFlowReq err := ctx.ShouldBindJSON(&req) if err != nil { - slog.Error("bad order request format", "error", err) + slog.ErrorContext(ctx, "bad order request format", "error", err) ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } wf, err := a.wfc.CreateWorkflow(ctx, req) if err != nil { - slog.Error("fail to create workflow", slog.Any("error", err), slog.Any("req", req)) + slog.ErrorContext(ctx, "fail to create workflow", slog.Any("error", err), slog.Any("req", req)) ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } @@ -73,7 +73,7 @@ func (a *ArgoHandler) ListWorkflows(ctx *gin.Context) { username := ctx.Query("username") per, page, err := common.GetPerAndPageFromContext(ctx) if err != nil { - slog.Error("Bad request format of page and per", slog.Any("error", err)) + slog.ErrorContext(ctx, "Bad request format of page and per", slog.Any("error", err)) httpbase.BadRequest(ctx, err.Error()) return } @@ -83,7 +83,7 @@ func (a *ArgoHandler) ListWorkflows(ctx *gin.Context) { } wfs, total, err := a.wfc.FindWorkFlows(ctx, username, types.TaskType(taskType), per, page) if err != nil { - slog.Error("fail to list workflows", slog.Any("error", err)) + slog.ErrorContext(ctx, "fail to list workflows", slog.Any("error", err)) ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } @@ -98,17 +98,17 @@ func (a *ArgoHandler) DeleteWorkflow(ctx *gin.Context) { var req = &types.ArgoWorkFlowDeleteReq{} err := ctx.BindJSON(req) if err != nil { - slog.Error("bad request format", "error", err) + slog.ErrorContext(ctx, "bad request format", "error", err) ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = a.wfc.DeleteWorkflow(ctx, req) if err != nil { - slog.Error("failed to delete workflow", slog.Any("error", err), slog.Any("req", req)) + slog.ErrorContext(ctx, "failed to delete workflow", slog.Any("error", err), slog.Any("req", req)) ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - slog.Info("Deleted argo workflow successfully", slog.String("id", id), slog.Any("taskid", req.TaskID)) + slog.InfoContext(ctx, "Deleted argo workflow successfully", slog.String("id", id), slog.Any("taskid", req.TaskID)) httpbase.OK(ctx, nil) } @@ -117,19 +117,19 @@ func (a *ArgoHandler) GetWorkflow(ctx *gin.Context) { var req = &types.ArgoWorkFlowGetReq{} err := ctx.BindJSON(req) if err != nil { - slog.Error("bad request format", "error", err) + slog.ErrorContext(ctx, "bad request format", "error", err) ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } idInt64, err := strconv.ParseInt(id, 10, 64) if err != nil { - slog.Error("fail to convert id to int64", slog.Any("error", err), slog.Any("id", id)) + slog.ErrorContext(ctx, "fail to convert id to int64", slog.Any("error", err), slog.Any("id", id)) ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } wf, err := a.wfc.GetWorkflow(ctx, idInt64, req.Username) if err != nil { - slog.Error("fail to get workflow", slog.Any("error", err)) + slog.ErrorContext(ctx, "fail to get workflow", slog.Any("error", err)) ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } diff --git a/user/component/access_token.go b/user/component/access_token.go index cf3c5f862..91c5b8f9b 100644 --- a/user/component/access_token.go +++ b/user/component/access_token.go @@ -43,7 +43,7 @@ func NewAccessTokenComponent(config *config.Config) (AccessTokenComponent, error c.config = config if err != nil { newError := fmt.Errorf("fail to create git server,error:%w", err) - slog.Error(newError.Error()) + slog.ErrorContext(context.Background(), newError.Error()) return nil, newError } return c, nil @@ -285,7 +285,7 @@ func (c *accessTokenComponentImpl) createUserToken(ctx context.Context, newToken // charge 100 credit for create starship token by call accounting service err = c.presentForNewAccessToken(user) if err != nil { - slog.Error("fail to charge for new starship user with retry 3 times", slog.Any("user.uuid", user.UUID), slog.Any("err", err)) + slog.ErrorContext(ctx, "fail to charge for new starship user with retry 3 times", slog.Any("user.uuid", user.UUID), slog.Any("err", err)) } } diff --git a/user/component/member.go b/user/component/member.go index 3c1882234..2a3bcd42d 100644 --- a/user/component/member.go +++ b/user/component/member.go @@ -75,7 +75,7 @@ func (c *memberComponentImpl) OrgMembers(ctx context.Context, orgName, currentUs if err == nil && user.ID > 0 { m, err := c.memberStore.Find(ctx, org.ID, user.ID) if err != nil && !errors.Is(err, sql.ErrNoRows) { - slog.Error("failed to find member", "error", err) + slog.ErrorContext(ctx, "failed to find member", "error", err) } //if current user belongs to org, show more detail member info if m != nil { @@ -90,7 +90,7 @@ func (c *memberComponentImpl) OrgMembers(ctx context.Context, orgName, currentUs var members []types.Member for _, dbmember := range dbmembers { if dbmember.User == nil { - slog.Warn("member user is nil, skip", "member", dbmember) + slog.WarnContext(ctx, "member user is nil, skip", "member", dbmember) continue } m := types.Member{ @@ -197,7 +197,7 @@ func (c *memberComponentImpl) ChangeMemberRole(ctx context.Context, orgName, use NewRole: newRole, }) if err != nil { - slog.Error("failed to send organization permission change.", slog.String("orgName", orgName), slog.Any("err", err)) + slog.ErrorContext(notificationCtx, "failed to send organization permission change.", slog.String("orgName", orgName), slog.Any("err", err)) } }() @@ -286,7 +286,7 @@ func (c *memberComponentImpl) AddMembers(ctx context.Context, orgName string, us UserName: userName, }) if err != nil { - slog.Error("failed to send organization member join message", slog.String("orgName", orgName), slog.Any("err", err)) + slog.ErrorContext(notificationCtx, "failed to send organization member join message", slog.String("orgName", orgName), slog.Any("err", err)) } }(orgName, userName, role, userUUIDs) } @@ -386,7 +386,7 @@ func (c *memberComponentImpl) Delete(ctx context.Context, orgName, userName, ope UserName: userName, }) if err != nil { - slog.Error("failed to send organization member leave message", slog.String("orgName", orgName), slog.String("userName", userName), slog.Any("err", err)) + slog.ErrorContext(notificationCtx, "failed to send organization member leave message", slog.String("orgName", orgName), slog.String("userName", userName), slog.Any("err", err)) } }() } diff --git a/user/component/organization.go b/user/component/organization.go index b1fed10e4..20b2f2051 100644 --- a/user/component/organization.go +++ b/user/component/organization.go @@ -63,12 +63,12 @@ func (c *organizationComponentImpl) FixOrgData(ctx context.Context, org *databas req.Description = org.Description err := c.gs.FixOrganization(req, *user) if err != nil { - slog.Error("fix git org data has error", slog.Any("error", err)) + slog.ErrorContext(ctx, "fix git org data has error", slog.Any("error", err)) } // need to create roles for a new org before adding members err = c.msc.InitRoles(ctx, org) if err != nil { - slog.Error("fix organization role has error", slog.String("error", err.Error())) + slog.ErrorContext(ctx, "fix organization role has error", slog.String("error", err.Error())) } // org creator defaults to be admin role err = c.msc.SetAdmin(ctx, org, user) @@ -184,7 +184,7 @@ func (c *organizationComponentImpl) Get(ctx context.Context, orgName string) (*t func (c *organizationComponentImpl) Delete(ctx context.Context, req *types.DeleteOrgReq) error { r, err := c.msc.GetMemberRole(ctx, req.Name, req.CurrentUser) if err != nil { - slog.Error("faild to get member role", + slog.ErrorContext(ctx, "faild to get member role", slog.String("org", req.Name), slog.String("user", req.CurrentUser), slog.String("error", err.Error())) } @@ -205,7 +205,7 @@ func (c *organizationComponentImpl) Delete(ctx context.Context, req *types.Delet func (c *organizationComponentImpl) Update(ctx context.Context, req *types.EditOrgReq) (*database.Organization, error) { r, err := c.msc.GetMemberRole(ctx, req.Name, req.CurrentUser) if err != nil { - slog.Error("faild to get member role", + slog.ErrorContext(ctx, "faild to get member role", slog.String("org", req.Name), slog.String("user", req.CurrentUser), slog.String("error", err.Error())) } diff --git a/user/component/organization_verify.go b/user/component/organization_verify.go index e553f7186..e57dcf826 100644 --- a/user/component/organization_verify.go +++ b/user/component/organization_verify.go @@ -79,7 +79,7 @@ func (o *OrganizationVerifyComponentImpl) Update(ctx context.Context, id int64, defer cancel() err = o.sendNotification(notificationCtx, status, orgVerify.UserUUID) if err != nil { - slog.Error("failed to send organization verify notification", slog.Any("error", err)) + slog.ErrorContext(ctx, "failed to send organization verify notification", slog.Any("error", err)) } }() @@ -126,7 +126,7 @@ func (o *OrganizationVerifyComponentImpl) sendNotification(ctx context.Context, break } if i < retryCount-1 { - slog.Warn("failed to send notification, retrying", "notification_msg", notificationMsg, "attempt", i+1, "error", sendErr.Error()) + slog.WarnContext(ctx, "failed to send notification, retrying", "notification_msg", notificationMsg, "attempt", i+1, "error", sendErr.Error()) } } diff --git a/user/component/user.go b/user/component/user.go index 549c542bb..c5c6e3dec 100644 --- a/user/component/user.go +++ b/user/component/user.go @@ -27,6 +27,11 @@ import ( const GitalyRepoNotFoundErr = "rpc error: code = NotFound desc = repository does not exist" +const ( + SMSCodeCachePrefix = "sms:code" + SMSCodeCacheTTL = 1 * time.Minute +) + type userComponentImpl struct { userStore database.UserStore orgStore database.OrgStore @@ -42,8 +47,8 @@ type userComponentImpl struct { gs gitserver.GitServer jwtc JwtComponent tokenc AccessTokenComponent - invitationc InvitationComponent userPhonec UserPhoneComponent + invitationc InvitationComponent // casc *casdoorsdk.Client // casConfig *casdoorsdk.AuthConfig diff --git a/user/component/user_verify.go b/user/component/user_verify.go index 1cf7f96fd..15dba6159 100644 --- a/user/component/user_verify.go +++ b/user/component/user_verify.go @@ -73,7 +73,7 @@ func (uv *UserVerifyComponentImpl) Update(ctx context.Context, id int64, status defer cancel() err = uv.sendNotification(notificationCtx, status, userVerify.UUID) if err != nil { - slog.Error("failed to send user verify notification", slog.Any("error", err)) + slog.ErrorContext(notificationCtx, "failed to send user verify notification", slog.Any("error", err)) } }() return userVerify, nil @@ -121,7 +121,7 @@ func (uv *UserVerifyComponentImpl) sendNotification(ctx context.Context, status break } if i < retryCount-1 { - slog.Warn("failed to send notification, retrying", "notification_msg", notificationMsg, "attempt", i+1, "error", sendErr.Error()) + slog.WarnContext(ctx, "failed to send notification, retrying", "notification_msg", notificationMsg, "attempt", i+1, "error", sendErr.Error()) } } diff --git a/user/handler/access_token.go b/user/handler/access_token.go index 05e8e97e1..3335b629d 100644 --- a/user/handler/access_token.go +++ b/user/handler/access_token.go @@ -4,9 +4,10 @@ import ( "errors" "fmt" "log/slog" - "opencsg.com/csghub-server/common/errorx" "time" + "opencsg.com/csghub-server/common/errorx" + "github.com/gin-gonic/gin" "opencsg.com/csghub-server/api/httpbase" "opencsg.com/csghub-server/common/config" @@ -57,14 +58,14 @@ func (h *AccessTokenHandler) Create(ctx *gin.Context) { } var req types.CreateUserTokenRequest if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } var err error _, err = h.sc.CheckRequestV2(ctx, &req) if err != nil { - slog.Error("failed to check sensitive request", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "failed to check sensitive request", slog.Any("error", err)) httpbase.ServerError(ctx, fmt.Errorf("sensitive check failed: %w", err)) return } @@ -74,13 +75,13 @@ func (h *AccessTokenHandler) Create(ctx *gin.Context) { req.Username = ctx.Param("username") if currentUser != req.Username { - slog.Error("user can only create its own access token", slog.String("current_user", currentUser), slog.String("username", req.Username)) + slog.ErrorContext(ctx.Request.Context(), "user can only create its own access token", slog.String("current_user", currentUser), slog.String("username", req.Username)) httpbase.UnauthorizedError(ctx, errors.New("user can only create its own access token")) return } token, err := h.c.Create(ctx, &req) if err != nil { - slog.Error("Failed to create user access token", slog.String("user_name", req.Username), slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to create user access token", slog.String("user_name", req.Username), slog.Any("error", err)) httpbase.ServerError(ctx, err) return } @@ -110,14 +111,14 @@ func (h *AccessTokenHandler) CreateAppToken(ctx *gin.Context) { } var req types.CreateUserTokenRequest if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } var err error _, err = h.sc.CheckRequestV2(ctx, &req) if err != nil { - slog.Error("failed to check sensitive request", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "failed to check sensitive request", slog.Any("error", err)) httpbase.ServerError(ctx, fmt.Errorf("sensitive check failed: %w", err)) return } @@ -127,7 +128,7 @@ func (h *AccessTokenHandler) CreateAppToken(ctx *gin.Context) { req.TokenName = ctx.Param("token_name") token, err := h.c.Create(ctx, &req) if err != nil { - slog.Error("Failed to create user access token", slog.String("user_name", req.Username), slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to create user access token", slog.String("user_name", req.Username), slog.Any("error", err)) httpbase.ServerError(ctx, err) return } @@ -159,19 +160,19 @@ func (h *AccessTokenHandler) Delete(ctx *gin.Context) { var req types.DeleteUserTokenRequest req.Username = ctx.Param("username") if currentUser != req.Username { - slog.Error("user can only delete its own access token", slog.String("current_user", currentUser), slog.String("username", req.Username)) + slog.ErrorContext(ctx.Request.Context(), "user can only delete its own access token", slog.String("current_user", currentUser), slog.String("username", req.Username)) httpbase.UnauthorizedError(ctx, errors.New("user can only delete its own access token")) return } req.TokenName = ctx.Param("token_name") err := h.c.Delete(ctx, &req) if err != nil { - slog.Error("Failed to delete user access token", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to delete user access token", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Delete user access token succeed") + slog.InfoContext(ctx.Request.Context(), "Delete user access token succeed") httpbase.OK(ctx, nil) } @@ -203,12 +204,12 @@ func (h *AccessTokenHandler) DeleteAppToken(ctx *gin.Context) { } err := h.c.Delete(ctx, &req) if err != nil { - slog.Error("Failed to delete user access token", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to delete user access token", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Delete user access token succeed") + slog.InfoContext(ctx.Request.Context(), "Delete user access token succeed") httpbase.OK(ctx, nil) } @@ -240,19 +241,19 @@ func (h *AccessTokenHandler) Refresh(ctx *gin.Context) { if len(paramExpiredAt) > 0 { expiredAt, err = time.Parse(time.RFC3339, paramExpiredAt) if err != nil { - slog.Error("Failed to parse expired_at", slog.String("expired_at", paramExpiredAt), slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to parse expired_at", slog.String("expired_at", paramExpiredAt), slog.Any("error", err)) httpbase.BadRequestWithExt(ctx, errorx.ReqParamInvalid(errors.New("cannot parse expired_at, please use format RFC3339, like 2006-01-02T15:04:05Z07:00"), nil)) return } } resp, err := h.c.RefreshToken(ctx, currentUser, tokenName, app, expiredAt) if err != nil { - slog.Error("Failed to refresh user access token", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to refresh user access token", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("refresh user access token succeed", slog.String("current_user", currentUser), + slog.InfoContext(ctx.Request.Context(), "refresh user access token succeed", slog.String("current_user", currentUser), slog.String("app", app), slog.String("token_name", tokenName)) httpbase.OK(ctx, resp) } @@ -283,7 +284,7 @@ func (h *AccessTokenHandler) Get(ctx *gin.Context) { req.Application = ctx.Query("app") resp, err := h.c.Check(ctx, &req) if err != nil { - slog.Error("Failed to check user access token", slog.Any("error", err), slog.Any("req", req)) + slog.ErrorContext(ctx.Request.Context(), "Failed to check user access token", slog.Any("error", err), slog.Any("req", req)) httpbase.ServerError(ctx, err) return } @@ -313,7 +314,7 @@ func (h *AccessTokenHandler) GetUserTokens(ctx *gin.Context) { app := ctx.Query("app") resp, err := h.c.GetTokens(ctx, currentUser, app) if err != nil { - slog.Error("Failed to get user access tokens", slog.Any("error", err), slog.Any("application", app), slog.String("current_user", currentUser)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get user access tokens", slog.Any("error", err), slog.Any("application", app), slog.String("current_user", currentUser)) httpbase.ServerError(ctx, err) return } @@ -349,7 +350,7 @@ func (h *AccessTokenHandler) GetOrCreateFirstAvaiTokens(ctx *gin.Context) { } resp, err := h.c.GetOrCreateFirstAvaiToken(ctx, currentUser, app, tokenName) if err != nil { - slog.Error("Failed to get user access tokens", slog.Any("error", err), slog.Any("application", app), slog.String("current_user", currentUser)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get user access tokens", slog.Any("error", err), slog.Any("application", app), slog.String("current_user", currentUser)) httpbase.ServerError(ctx, err) return } diff --git a/user/handler/jwt.go b/user/handler/jwt.go index 074c58095..d2f801891 100644 --- a/user/handler/jwt.go +++ b/user/handler/jwt.go @@ -35,15 +35,15 @@ type JWTHandler struct { func (h *JWTHandler) Create(ctx *gin.Context) { var req types.CreateJWTReq if err := ctx.ShouldBind(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } - slog.Info("Create JWT token", "req", req) + slog.InfoContext(ctx.Request.Context(), "Create JWT token", "req", req) claims, signed, err := h.c.GenerateToken(ctx.Request.Context(), req) if err != nil { - slog.Error("failed to generate JWT token", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "failed to generate JWT token", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } @@ -72,7 +72,7 @@ func (h *JWTHandler) Verify(ctx *gin.Context) { token := ctx.Param("token") user, err := h.c.ParseToken(ctx.Request.Context(), token) if err != nil { - slog.Error("failed to verify JWT token", slog.Any("error", err), slog.String("token", token)) + slog.ErrorContext(ctx.Request.Context(), "failed to verify JWT token", slog.Any("error", err), slog.String("token", token)) httpbase.ServerError(ctx, fmt.Errorf("failed to verify JWT token '%s': %w", token, err)) return } diff --git a/user/handler/member.go b/user/handler/member.go index a2920f2e0..fa43a5550 100644 --- a/user/handler/member.go +++ b/user/handler/member.go @@ -52,7 +52,7 @@ func (h *MemberHandler) OrgMembers(ctx *gin.Context) { } pageSize, page, err := common.GetPerAndPageFromContext(ctx) if err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } @@ -227,7 +227,7 @@ func (h *MemberHandler) GetMemberRole(ctx *gin.Context) { // Assuming GetMemberRole returns a role (or similar) and an error role, err := h.c.GetMemberRole(ctx.Request.Context(), org, userName) if err != nil { - slog.Error("fail to get org member", slog.Any("org", org), slog.Any("member", userName), slog.Any("err", err)) + slog.ErrorContext(ctx.Request.Context(), "fail to get org member", slog.Any("org", org), slog.Any("member", userName), slog.Any("err", err)) if errors.Is(err, errorx.ErrDatabaseNoRows) { httpbase.NotFoundError(ctx, err) } else { diff --git a/user/handler/organization.go b/user/handler/organization.go index 77b4d2375..88fbea2fc 100644 --- a/user/handler/organization.go +++ b/user/handler/organization.go @@ -59,14 +59,14 @@ func (h *OrganizationHandler) Create(ctx *gin.Context) { currentUser := httpbase.GetCurrentUser(ctx) var req types.CreateOrgReq if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } var err error _, err = h.sc.CheckRequestV2(ctx, &req) if err != nil { - slog.Error("failed to check sensitive request", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "failed to check sensitive request", slog.Any("error", err)) httpbase.ServerError(ctx, fmt.Errorf("sensitive check failed: %w", err)) return } @@ -74,12 +74,12 @@ func (h *OrganizationHandler) Create(ctx *gin.Context) { req.Username = currentUser org, err := h.c.Create(ctx, &req) if err != nil { - slog.Error("Failed to create organization", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to create organization", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Create organization succeed", slog.String("org_path", org.Name)) + slog.InfoContext(ctx.Request.Context(), "Create organization succeed", slog.String("org_path", org.Name)) httpbase.OK(ctx, org) } @@ -103,7 +103,7 @@ func (h *OrganizationHandler) Get(ctx *gin.Context) { } org, err := h.c.Get(ctx, orgName) if err != nil { - slog.Error("Failed to get organization", slog.Any("error", err), slog.String("org_path", orgName)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get organization", slog.Any("error", err), slog.String("org_path", orgName)) if errors.Is(err, errorx.ErrDatabaseNoRows) { httpbase.NotFoundError(ctx, err) } else { @@ -112,7 +112,7 @@ func (h *OrganizationHandler) Get(ctx *gin.Context) { return } - slog.Info("Get organization succeed", slog.String("org_path", org.Name)) + slog.InfoContext(ctx.Request.Context(), "Get organization succeed", slog.String("org_path", org.Name)) httpbase.OK(ctx, org) } @@ -133,13 +133,13 @@ func (h *OrganizationHandler) Index(ctx *gin.Context) { verifyStatus := ctx.Query("verify_status") per, page, err := common.GetPerAndPageFromContext(ctx) if err != nil { - slog.Error("Failed to get per and page", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get per and page", slog.Any("error", err)) httpbase.BadRequestWithExt(ctx, err) return } orgs, total, err := h.c.Index(ctx, username, search, per, page, orgType, verifyStatus) if err != nil { - slog.Error("Failed to get organizations", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get organizations", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } @@ -149,7 +149,7 @@ func (h *OrganizationHandler) Index(ctx *gin.Context) { "total": total, } - slog.Info("Get organizations succeed", slog.String("username", username), slog.String("search", search), slog.Int("per", per), slog.Int("page", page)) + slog.InfoContext(ctx.Request.Context(), "Get organizations succeed", slog.String("username", username), slog.String("search", search), slog.Int("per", per), slog.Int("page", page)) httpbase.OK(ctx, respData) } @@ -177,12 +177,12 @@ func (h *OrganizationHandler) Delete(ctx *gin.Context) { req.Name = ctx.Param("namespace") err := h.c.Delete(ctx, &req) if err != nil { - slog.Error("Failed to delete organizations", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to delete organizations", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Delete organizations succeed", slog.String("org_name", req.Name)) + slog.InfoContext(ctx.Request.Context(), "Delete organizations succeed", slog.String("org_name", req.Name)) httpbase.OK(ctx, nil) } @@ -209,14 +209,14 @@ func (h *OrganizationHandler) Update(ctx *gin.Context) { var req types.EditOrgReq if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } var err error _, err = h.sc.CheckRequestV2(ctx, &req) if err != nil { - slog.Error("failed to check sensitive request", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "failed to check sensitive request", slog.Any("error", err)) httpbase.ServerError(ctx, fmt.Errorf("sensitive check failed: %w", err)) return } @@ -228,12 +228,12 @@ func (h *OrganizationHandler) Update(ctx *gin.Context) { httpbase.ForbiddenError(ctx, err) return } - slog.Error("Failed to update organizations", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to update organizations", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Update organizations succeed", slog.String("org_name", org.Nickname)) + slog.InfoContext(ctx.Request.Context(), "Update organizations succeed", slog.String("org_name", org.Nickname)) httpbase.OK(ctx, org) } @@ -254,7 +254,7 @@ func (h *OrganizationHandler) CreateVerify(ctx *gin.Context) { currentUser := httpbase.GetCurrentUser(ctx) var req types.OrgVerifyReq if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } @@ -262,12 +262,12 @@ func (h *OrganizationHandler) CreateVerify(ctx *gin.Context) { req.UserUUID = currentUserUUID orgVerify, err := h.ov.Create(ctx, &req) if err != nil { - slog.Error("Failed to create organization Verify", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to create organization Verify", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("Create organization Verify succeed", slog.String("company_name", orgVerify.CompanyName)) + slog.InfoContext(ctx.Request.Context(), "Create organization Verify succeed", slog.String("company_name", orgVerify.CompanyName)) httpbase.OK(ctx, orgVerify) } @@ -287,34 +287,34 @@ func (h *OrganizationHandler) CreateVerify(ctx *gin.Context) { func (h *OrganizationHandler) UpdateVerify(ctx *gin.Context) { vID, err := strconv.ParseInt(ctx.Param("id"), 10, 64) if err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } var req types.OrgVerifyStatusReq if err := ctx.ShouldBindJSON(&req); err != nil { - slog.Error("Bad request format", "error", err) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err) httpbase.BadRequestWithExt(ctx, err) return } if req.Status != types.VerifyStatusRejected && req.Status != types.VerifyStatusApproved { - slog.Error("Bad request format", slog.String("err", "Not allowed status")) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", slog.String("err", "Not allowed status")) httpbase.BadRequestWithExt(ctx, errorx.ReqParamInvalid(errors.New("not allowed status"), nil)) } if req.Status == types.VerifyStatusRejected && req.Reason == "" { - slog.Error("Bad request format", slog.String("err", "rejected need reason")) + slog.ErrorContext(ctx.Request.Context(), "Bad request format", slog.String("err", "rejected need reason")) httpbase.BadRequestWithExt(ctx, errorx.ReqParamInvalid(errors.New("rejected need reason"), nil)) } orgVerify, err := h.ov.Update(ctx, vID, req.Status, req.Reason) if err != nil { - slog.Error("Failed to update organization Verify", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to update organization Verify", slog.Any("error", err)) httpbase.ServerError(ctx, err) return } - slog.Info("update organization Verify succeed", slog.String("company_name", orgVerify.CompanyName)) + slog.ErrorContext(ctx.Request.Context(), "update organization Verify succeed", slog.String("company_name", orgVerify.CompanyName)) httpbase.OK(ctx, orgVerify) } @@ -334,7 +334,7 @@ func (h *OrganizationHandler) GetVerify(ctx *gin.Context) { path := ctx.Param("namespace") orgVerify, err := h.ov.Get(ctx, path) if err != nil { - slog.Error("Failed to get organization Verify", slog.Any("error", err)) + slog.ErrorContext(ctx.Request.Context(), "Failed to get organization Verify", slog.Any("error", err)) httpbase.ServerError(ctx, err) return }