Skip to content

Commit

Permalink
add activity api endpoint (#1607)
Browse files Browse the repository at this point in the history
* add activity api endpoint
  • Loading branch information
motatoes committed Jul 5, 2024
1 parent 541bdc3 commit 346153d
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 35 deletions.
4 changes: 4 additions & 0 deletions backend/bootstrap/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ func Bootstrap(templates embed.FS, diggerController controllers.DiggerController
projectsApiGroup.GET("/:project_id", controllers.ProjectDetails)
projectsApiGroup.GET("/:project_id/runs", controllers.RunsForProject)

activityApiGroup := r.Group("/api/activity")
activityApiGroup.Use(middleware.GetApiMiddleware())
activityApiGroup.GET("/", controllers.GetActivity)

runsApiGroup := r.Group("/api/runs")
runsApiGroup.Use(middleware.CORSMiddleware(), middleware.GetApiMiddleware())
runsApiGroup.GET("/:run_id", controllers.RunDetails)
Expand Down
54 changes: 54 additions & 0 deletions backend/controllers/activity.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package controllers

import (
"errors"
"fmt"
"github.com/diggerhq/digger/backend/middleware"
"github.com/diggerhq/digger/backend/models"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"net/http"
)

func GetActivity(c *gin.Context) {
loggedInOrganisation, exists := c.Get(middleware.ORGANISATION_ID_KEY)

if !exists {
c.String(http.StatusForbidden, "Not allowed to access this resource")
return
}

var org models.Organisation
err := models.DB.GormDB.Where("id = ?", loggedInOrganisation).First(&org).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
c.String(http.StatusNotFound, fmt.Sprintf("Could not find organisation: %v", loggedInOrganisation))
} else {
c.String(http.StatusInternalServerError, "Unknown error occurred while fetching database")
}
return
}

runs, err := models.DB.GetProjectRunsForOrg(int(loggedInOrganisation.(uint)))
if err != nil {
c.String(http.StatusInternalServerError, "Unknown error occurred while fetching activity from database")
return
}

marshalledRuns := make([]interface{}, 0)

for _, run := range runs {
marshalled := run.MapToJsonStruct()
marshalledRuns = append(marshalledRuns, marshalled)
}

response := make(map[string]interface{})
response["runs"] = marshalledRuns

if err != nil {
c.String(http.StatusInternalServerError, "Unknown error occurred while marshalling response")
return
}

c.JSON(http.StatusOK, response)
}
2 changes: 2 additions & 0 deletions backend/migrations/20240705144450.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- Modify "project_runs" table
ALTER TABLE "public"."project_runs" ADD COLUMN "actor_username" text NULL;
3 changes: 2 additions & 1 deletion backend/migrations/atlas.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
h1:XB0lCGtjU7TKsT8oJJKh88LHVp7DOaKimqswI3vWsdQ=
h1:xMLzCvQmWuGSqeU5RYXSk+GnWXkpS6GjR2zeUdwrsyk=
20231227132525.sql h1:43xn7XC0GoJsCnXIMczGXWis9d504FAWi4F1gViTIcw=
20240115170600.sql h1:IW8fF/8vc40+eWqP/xDK+R4K9jHJ9QBSGO6rN9LtfSA=
20240116123649.sql h1:R1JlUIgxxF6Cyob9HdtMqiKmx/BfnsctTl5rvOqssQw=
Expand All @@ -25,3 +25,4 @@ h1:XB0lCGtjU7TKsT8oJJKh88LHVp7DOaKimqswI3vWsdQ=
20240530074832.sql h1:uyXvPgFxTfO2QAW2bhXSxJJQLbpr2zCfrlg1ycD8BSU=
20240703121051.sql h1:ntF++QXJ3LYQP3ZFvumMvg28FFr8vAnDReFgvgzhOcg=
20240704192835.sql h1:F84HKuE3qX8hYqDCU2K9NDG4WQaSfmnk2P4OCje54qg=
20240705144450.sql h1:AAB4GbML2Jea1MSv/+E0DLMMCI9GLqwptpvBScvU19s=
53 changes: 30 additions & 23 deletions backend/models/orgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,34 +26,41 @@ type Repo struct {

type ProjectRun struct {
gorm.Model
ProjectID uint
Project *Project
StartedAt int64
EndedAt int64
Status string
Command string
Output string
ProjectID uint
Project *Project
StartedAt int64
EndedAt int64
Status string
Command string
Output string
ActorUsername string
}

func (p *ProjectRun) MapToJsonStruct() interface{} {
return struct {
Id uint
ProjectID uint
ProjectName string
StartedAt time.Time
EndedAt time.Time
Status string
Command string
Output string
Id uint `json:"id"`
ProjectID uint `json:"project_id"`
ProjectName string `json:"project_name"`
RepoFullName string `json:"repo_full_name"`
RepoUrl string `json:"repo_url"`
ActorUsername string `json:"actor_username"`
StartedAt time.Time `json:"started_at"`
EndedAt time.Time `json:"ended_at"`
Status string `json:"status"`
Command string `json:"command"`
Output string `json:"output"`
}{
Id: p.ID,
ProjectID: p.ProjectID,
ProjectName: p.Project.Name,
StartedAt: time.UnixMilli(p.StartedAt),
EndedAt: time.UnixMilli(p.EndedAt),
Status: p.Status,
Command: p.Command,
Output: p.Output,
Id: p.ID,
ProjectID: p.ProjectID,
ProjectName: p.Project.Name,
RepoUrl: p.Project.Repo.RepoUrl,
RepoFullName: p.Project.Repo.RepoFullName,
StartedAt: time.UnixMilli(p.StartedAt),
EndedAt: time.UnixMilli(p.EndedAt),
Status: p.Status,
Command: p.Command,
Output: p.Output,
ActorUsername: p.ActorUsername,
}
}

Expand Down
31 changes: 20 additions & 11 deletions backend/models/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,24 @@ func (db *Database) GetPoliciesFromContext(c *gin.Context, orgIdKey string) ([]P
return policies, true
}

func (db *Database) GetProjectRunsForOrg(orgId int) ([]ProjectRun, error) {
var runs []ProjectRun

err := db.GormDB.Preload("Project").Preload("Project.Organisation").Preload("Project.Repo").
Joins("INNER JOIN projects ON projects.id = project_runs.project_id").
Joins("INNER JOIN repos ON projects.repo_id = repos.id").
Joins("INNER JOIN organisations ON projects.organisation_id = organisations.id").
Where("projects.organisation_id = ?", orgId).Order("created_at desc").Limit(100).Find(&runs).Error

if err != nil {
log.Printf("Unknown error occurred while fetching database, %v\n", err)
return nil, fmt.Errorf("unknown error occurred while fetching database, %v\n", err)
}

log.Printf("getProjectRunsFromContext, number of runs:%d\n", len(runs))
return runs, nil
}

func (db *Database) GetProjectRunsFromContext(c *gin.Context, orgIdKey string) ([]ProjectRun, bool) {
loggedInOrganisationId, exists := c.Get(orgIdKey)

Expand All @@ -103,21 +121,12 @@ func (db *Database) GetProjectRunsFromContext(c *gin.Context, orgIdKey string) (
return nil, false
}

var runs []ProjectRun

err := db.GormDB.Preload("Project").Preload("Project.Organisation").Preload("Project.Repo").
Joins("INNER JOIN projects ON projects.id = project_runs.project_id").
Joins("INNER JOIN repos ON projects.repo_id = repos.id").
Joins("INNER JOIN organisations ON projects.organisation_id = organisations.id").
Where("projects.organisation_id = ?", loggedInOrganisationId).Order("created_at desc").Find(&runs).Error

runs, err := db.GetProjectRunsForOrg(loggedInOrganisationId.(int))
if err != nil {
log.Printf("Unknown error occurred while fetching database, %v\n", err)
return nil, false
}

log.Printf("getProjectRunsFromContext, number of runs:%d\n", len(runs))
return runs, true

}

func (db *Database) GetProjectByRunId(c *gin.Context, runId uint, orgIdKey string) (*ProjectRun, bool) {
Expand Down

0 comments on commit 346153d

Please sign in to comment.