Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
f59627d
implement fetch all contributed repositories of user (my contribution…
VishakhaSainani Jun 18, 2025
8e88ba1
Merge branch 'feat/contribution-service' into feat/repository-service
VishakhaSainani Jun 18, 2025
82afbdd
send all details for the repository
VishakhaSainani Jun 18, 2025
c8da5f1
fetch particular repository details
VishakhaSainani Jun 18, 2025
121d59c
implement fetch particular repo contributors
VishakhaSainani Jun 18, 2025
465fcd4
implement fetch contributions of user in a particular repository
VishakhaSainani Jun 18, 2025
f85a010
fetch particular repository language percentage
VishakhaSainani Jun 19, 2025
89961fd
Merge branch 'feat/contribution-service' into feat/repository-service
VishakhaSainani Jun 20, 2025
966d2a2
Fix: Restore correct merge changes for internal/app/repository/domain.go
VishakhaSainani Jun 20, 2025
671c8ac
add contributors url when fetching users contributes repositories
VishakhaSainani Jun 20, 2025
67ab318
seperate logic for fetching repo by github id and repository table id
VishakhaSainani Jun 20, 2025
778c359
use repo id for fetching contributions of a particular repo of a user
VishakhaSainani Jun 23, 2025
cbafcc0
use sqlx methods in user.go
VishakhaSainani Jun 23, 2025
f36069f
use sqlx methods in repository.go
VishakhaSainani Jun 23, 2025
050487e
use sqlx methods in contribution.go
VishakhaSainani Jun 23, 2025
f5af0ac
log error in slog
VishakhaSainani Jun 23, 2025
0bf8a8a
Merge branch 'feat/repository-service' into improvement/use-sqlx-methods
VishakhaSainani Jun 24, 2025
5293cb6
make contribution fetch process from gh-archive dataset on bigquery, …
VishakhaSainani Jun 27, 2025
adb7845
remove fetch users latest contribution handler, made for testing proc…
VishakhaSainani Jun 27, 2025
4a736ce
pass contribution service in dependencies for cron job and remove unn…
VishakhaSainani Jun 27, 2025
3ac004e
define contribution fetching query from bigquery as a constant
VishakhaSainani Jul 1, 2025
a306776
rename function FetchUsersAllContributions to FetchUserContributions,…
VishakhaSainani Jul 1, 2025
187dc89
handle no row error in GetContributionScoreDetails function
VishakhaSainani Jul 1, 2025
a73d295
refactor Execute function
VishakhaSainani Jul 1, 2025
85b4680
Merge branch 'feat/repository-service' into feat/github-service
VishakhaSainani Jul 1, 2025
490cc4e
Merge branch 'feat/contribution-cronjob' into feat/github-service
VishakhaSainani Jul 1, 2025
19e50b3
Merge branch 'improvement/use-sqlx-methods' into feat/github-service
VishakhaSainani Jul 1, 2025
1784817
Merge branch 'db/migration/add-contributors-url' into feat/github-ser…
VishakhaSainani Jul 1, 2025
37c4454
Merge branch 'db/migration/add-gh-event-id' into feat/github-service
VishakhaSainani Jul 1, 2025
5397c3e
fix - use actionkey for action string
VishakhaSainani Jul 1, 2025
6cb482d
save github event id for each contribution in db
VishakhaSainani Jul 1, 2025
521be1a
use user github id to fetch contributions from bigquery and refactor …
VishakhaSainani Jul 2, 2025
031ba38
make separate github service for github api calls
VishakhaSainani Jul 2, 2025
1e3e4a4
reduce cognitive complexity of ProcessFetchedContributions Function b…
VishakhaSainani Jul 2, 2025
76df1d2
log error in GetContributionByGithubEventId
VishakhaSainani Jul 3, 2025
f3c25f3
make utility function for GET requests to github API's
VishakhaSainani Jul 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"time"

"github.com/joshsoftware/code-curiosity-2025/internal/app"
"github.com/joshsoftware/code-curiosity-2025/internal/app/cronJob"
"github.com/joshsoftware/code-curiosity-2025/internal/config"
)

Expand Down Expand Up @@ -43,6 +44,9 @@ func main() {

router := app.NewRouter(dependencies)

newCronSchedular := cronJob.NewCronSchedular()
newCronSchedular.InitCronJobs(dependencies.ContributionService)

server := http.Server{
Addr: fmt.Sprintf(":%s", cfg.HTTPServer.Port),
Handler: router,
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (
github.com/ilyakaznacheev/cleanenv v1.5.0
github.com/jmoiron/sqlx v1.4.0
github.com/lib/pq v1.10.9
github.com/robfig/cron/v3 v3.0.1
golang.org/x/oauth2 v0.29.0
google.golang.org/api v0.231.0
)
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgm
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
Expand Down
29 changes: 29 additions & 0 deletions internal/app/bigquery/domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,35 @@ package bigquery

import "time"

const DailyQuery = `SELECT
id,
type,
public,
actor.id AS actor_id,
actor.login AS actor_login,
actor.gravatar_id AS actor_gravatar_id,
actor.url AS actor_url,
actor.avatar_url AS actor_avatar_url,
repo.id AS repo_id,
repo.name AS repo_name,
repo.url AS repo_url,
payload,
created_at,
other
FROM
githubarchive.day.%s
WHERE
type IN (
'IssuesEvent',
'PullRequestEvent',
'PullRequestReviewEvent',
'IssueCommentEvent',
'PullRequestReviewCommentEvent'
)
AND (
actor.id IN (%s)
)`

type ContributionResponse struct {
ID string `bigquery:"id"`
Type string `bigquery:"type"`
Expand Down
46 changes: 6 additions & 40 deletions internal/app/bigquery/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import (
"context"
"fmt"
"log/slog"
"strings"
"time"

bq "cloud.google.com/go/bigquery"
"github.com/joshsoftware/code-curiosity-2025/internal/config"
"github.com/joshsoftware/code-curiosity-2025/internal/pkg/apperrors"
"github.com/joshsoftware/code-curiosity-2025/internal/pkg/utils"
"github.com/joshsoftware/code-curiosity-2025/internal/repository"
)

Expand All @@ -30,51 +30,17 @@ func NewService(bigqueryInstance config.Bigquery, userRepository repository.User
}

func (s *service) FetchDailyContributions(ctx context.Context) (*bq.RowIterator, error) {
YesterdayDate := time.Now().AddDate(0, 0, -1)
YesterdayYearMonthDay := YesterdayDate.Format("20060102")

usersNamesList, err := s.userRepository.GetAllUsersGithubUsernames(ctx, nil)
usersGithubId, err := s.userRepository.GetAllUsersGithubId(ctx, nil)
if err != nil {
slog.Error("error fetching users github usernames")
return nil, apperrors.ErrInternalServer
}

var quotedUsernamesList []string
for _, username := range usersNamesList {
quotedUsernamesList = append(quotedUsernamesList, fmt.Sprintf("'%s'", username))
}
formattedGithubIds := utils.FormatIntSliceForQuery(usersGithubId)

githubUsernames := strings.Join(quotedUsernamesList, ",")
fetchDailyContributionsQuery := fmt.Sprintf(`
SELECT
id,
type,
public,
actor.id AS actor_id,
actor.login AS actor_login,
actor.gravatar_id AS actor_gravatar_id,
actor.url AS actor_url,
actor.avatar_url AS actor_avatar_url,
repo.id AS repo_id,
repo.name AS repo_name,
repo.url AS repo_url,
payload,
created_at,
other
FROM
githubarchive.day.%s
WHERE
type IN (
'IssuesEvent',
'PullRequestEvent',
'PullRequestReviewEvent',
'IssueCommentEvent',
'PullRequestReviewCommentEvent'
)
AND (
actor.login IN (%s)
)
`, YesterdayYearMonthDay, githubUsernames)
YesterdayDate := time.Now().AddDate(0, 0, -1)
YesterdayYearMonthDay := YesterdayDate.Format("20060102")
fetchDailyContributionsQuery := fmt.Sprintf(DailyQuery, YesterdayYearMonthDay, formattedGithubIds)

bigqueryQuery := s.bigqueryInstance.Client.Query(fetchDailyContributionsQuery)
contributionRows, err := bigqueryQuery.Read(ctx)
Expand Down
1 change: 1 addition & 0 deletions internal/app/contribution/domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ type Contribution struct {
ContributionType string
BalanceChange int
ContributedAt time.Time
GithubEventId string
CreatedAt time.Time
UpdatedAt time.Time
}
Expand Down
25 changes: 5 additions & 20 deletions internal/app/contribution/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ type handler struct {
}

type Handler interface {
FetchUserLatestContributions(w http.ResponseWriter, r *http.Request)
FetchUsersAllContributions(w http.ResponseWriter, r *http.Request)
FetchUserContributions(w http.ResponseWriter, r *http.Request)
}

func NewHandler(contributionService Service) Handler {
Expand All @@ -23,30 +22,16 @@ func NewHandler(contributionService Service) Handler {
}
}

func (h *handler) FetchUserLatestContributions(w http.ResponseWriter, r *http.Request) {
func (h *handler) FetchUserContributions(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

err := h.contributionService.ProcessFetchedContributions(ctx)
userContributions, err := h.contributionService.FetchUserContributions(ctx)
if err != nil {
slog.Error("error fetching latest contributions")
slog.Error("error fetching user contributions")
status, errorMessage := apperrors.MapError(err)
response.WriteJson(w, status, errorMessage, nil)
return
}

response.WriteJson(w, http.StatusOK, "contribution fetched successfully", nil)
}

func (h *handler) FetchUsersAllContributions(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

usersAllContributions, err := h.contributionService.FetchUsersAllContributions(ctx)
if err != nil {
slog.Error("error fetching all contributions for user")
status, errorMessage := apperrors.MapError(err)
response.WriteJson(w, status, errorMessage, nil)
return
}

response.WriteJson(w, http.StatusOK, "all contributions for user fetched successfully", usersAllContributions)
response.WriteJson(w, http.StatusOK, "user contributions fetched successfully", userContributions)
}
Loading