diff --git a/.gitignore b/.gitignore index e781d80..936f0ad 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ cypress/screenshots testtmp* # .env -.env.* \ No newline at end of file +.env.* +data diff --git a/src/server/dekart/query.go b/src/server/dekart/query.go index 635f0bb..43c4d15 100644 --- a/src/server/dekart/query.go +++ b/src/server/dekart/query.go @@ -234,7 +234,8 @@ func (s Server) RunQuery(ctx context.Context, req *proto.RunQueryRequest) (*prot `select reports.id, queries.query_source_id, - datasets.connection_id + datasets.connection_id, + queries.query_text from queries left join datasets on queries.id = datasets.query_id left join reports on (datasets.report_id = reports.id or queries.report_id = reports.id) @@ -250,8 +251,9 @@ func (s Server) RunQuery(ctx context.Context, req *proto.RunQueryRequest) (*prot var reportID string var prevQuerySourceId string var connectionID sql.NullString + var queryText string for queriesRows.Next() { - err := queriesRows.Scan(&reportID, &prevQuerySourceId, &connectionID) + err := queriesRows.Scan(&reportID, &prevQuerySourceId, &connectionID, &queryText) if err != nil { log.Err(err).Send() return nil, status.Error(codes.Internal, err.Error()) @@ -277,7 +279,7 @@ func (s Server) RunQuery(ctx context.Context, req *proto.RunQueryRequest) (*prot return nil, status.Error(codes.NotFound, err.Error()) } - if !report.CanWrite { + if !(report.CanWrite || report.Discoverable) { err := fmt.Errorf("permission denied") log.Warn().Err(err).Send() return nil, status.Error(codes.PermissionDenied, err.Error()) @@ -290,23 +292,27 @@ func (s Server) RunQuery(ctx context.Context, req *proto.RunQueryRequest) (*prot return nil, status.Error(codes.Internal, err.Error()) } - err = s.storeQuerySync(ctx, req.QueryId, req.QueryText, prevQuerySourceId) - - if err != nil { - code := codes.Internal - if _, ok := err.(*queryWasNotUpdated); ok { - code = codes.Canceled - log.Warn().Err(err).Send() - } else { - log.Error().Err(err).Send() + if report.CanWrite { + // update query text if it was changed by user if user has write permission + // otherwise use query text from db + queryText = req.QueryText + err = s.storeQuerySync(ctx, req.QueryId, req.QueryText, prevQuerySourceId) + if err != nil { + code := codes.Internal + if _, ok := err.(*queryWasNotUpdated); ok { + code = codes.Canceled + log.Warn().Err(err).Send() + } else { + log.Error().Err(err).Send() + } + return nil, status.Error(code, err.Error()) } - return nil, status.Error(code, err.Error()) } err = s.runQuery(ctx, runQueryOptions{ reportID: reportID, queryID: req.QueryId, - queryText: req.QueryText, + queryText: queryText, connection: connection, userBucketName: s.getBucketNameFromConnection(connection), }) diff --git a/src/server/dekart/querysource.go b/src/server/dekart/querysource.go index a47e2e7..31984db 100644 --- a/src/server/dekart/querysource.go +++ b/src/server/dekart/querysource.go @@ -87,6 +87,7 @@ func (s Server) storeQuerySync(ctx context.Context, queryID string, queryText st } affectedRows, _ := result.RowsAffected() if affectedRows == 0 { + log.Warn().Str("prevQuerySourceId", prevQuerySourceId).Str("newQuerySourceId", newQuerySourceId).Msg("Query text not updated") return &queryWasNotUpdated{} } return nil diff --git a/src/server/dekart/stream.go b/src/server/dekart/stream.go index 0f37e49..ac1a13e 100644 --- a/src/server/dekart/stream.go +++ b/src/server/dekart/stream.go @@ -237,7 +237,7 @@ func (s Server) GetUserStream(req *proto.GetUserStreamRequest, srv proto.Dekart_ for { select { case sequence := <-ping: - return s.sendUserStreamResponse(ctx, srv, sequence) + return s.sendUserStreamResponse(srv.Context(), srv, sequence) case <-ctx.Done(): return nil } @@ -270,7 +270,7 @@ func (s Server) GetReportListStream(req *proto.ReportListRequest, srv proto.Deka for { select { case sequence := <-ping: - return s.sendReportList(ctx, srv, sequence) + return s.sendReportList(srv.Context(), srv, sequence) case <-ctx.Done(): return nil }