Skip to content

Commit

Permalink
Merge pull request #6 from zachmarshall/master
Browse files Browse the repository at this point in the history
Add handlers for email, transfer, visitation, and reminders.
  • Loading branch information
Raajheer1 authored Apr 30, 2024
2 parents 488d72c + 989c997 commit ce6a04d
Show file tree
Hide file tree
Showing 29 changed files with 564 additions and 108 deletions.
13 changes: 5 additions & 8 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,17 @@
{
"name": "Go",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/go:1-1.21-bullseye"

"image": "mcr.microsoft.com/devcontainers/go:1-1.21-bullseye",
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},

"features": {
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}
}
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],

// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "go version",

// Configure tool-specific properties.
// "customizations": {},

// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
}
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.env
.idea
.idea
TaskRunner
7 changes: 4 additions & 3 deletions cmd/taskrunner/main.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package main

import (
"JobScheduler/internal/logger"
"JobScheduler/pkg/config"
"JobScheduler/pkg/scheduler"
"fmt"

"github.com/vatusa/taskrunner/internal/logger"
"github.com/vatusa/taskrunner/pkg/config"
"github.com/vatusa/taskrunner/pkg/scheduler"
)

func main() {
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module JobScheduler
module github.com/vatusa/taskrunner

go 1.21

Expand Down
8 changes: 8 additions & 0 deletions pkg/email/email.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package email

type Payload struct {
DestinationAddress string `json:"destinationAddress"` // Receiver's email address
CCAddresses []string `json:"ccAddresses"` // CC email addresses
Subject string `json:"subject"` // Email subject
Body string `json:"body"` // Email body
}
6 changes: 4 additions & 2 deletions pkg/jobs/email/sender.go → pkg/email/handler/sender.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package email
package handler

import (
"fmt"
"os"

"github.com/vatusa/taskrunner/pkg/email"

"github.com/sendgrid/sendgrid-go"
"github.com/sendgrid/sendgrid-go/helpers/mail"
)

func SendEmail(payload Payload) error {
func SendEmail(payload email.Payload) error {
from := mail.NewEmail("VATUSA Mailman", "[email protected]")
subject := payload.Subject
to := mail.NewEmail("", payload.DestinationAddress)
Expand Down
105 changes: 105 additions & 0 deletions pkg/jobs/dispatcher/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package dispatcher

import (
"fmt"

"github.com/vatusa/taskrunner/internal/logger"
"github.com/vatusa/taskrunner/pkg/email"
emailHandler "github.com/vatusa/taskrunner/pkg/email/handler"
"github.com/vatusa/taskrunner/pkg/jobs"
"github.com/vatusa/taskrunner/pkg/reminders"
remindersHandler "github.com/vatusa/taskrunner/pkg/reminders/handler"
"github.com/vatusa/taskrunner/pkg/transfer"
transferHandler "github.com/vatusa/taskrunner/pkg/transfer/handler"
"github.com/vatusa/taskrunner/pkg/visit"
visitHandler "github.com/vatusa/taskrunner/pkg/visit/handler"
)

// JobDispatcher dispatches jobs to the appropriate handlers
type JobDispatcher struct {
// Add fields if needed, like logger, config, etc.
}

func NewJobDispatcher() *JobDispatcher {
return &JobDispatcher{}
}

func (d *JobDispatcher) Dispatch(j jobs.Job) (jobs.Job, error) {
logger.Info("dispatching job: ", j.ID)

switch j.Type {
case jobs.EmailJob:
return d.handleEmailJob(j)
case jobs.TransferStartedJob:
return d.handleTransferStartedJob(j)
case jobs.TransferStateChangeJob:
return d.handleTransferStateChangeJob(j)
case jobs.VisitStartedJob:
return d.handleVisitStartedJob(j)
case jobs.VisitStateChangeJob:
return d.handleVisitStateChangeJob(j)
case jobs.ReminderJob:
return d.handleReminderJob(j)

// Add cases for other job types

default:
errMsg := fmt.Errorf("unsupported job type: %s", j.Type)
logger.Error(errMsg)
return jobs.Job{}, errMsg
}
}

func (d *JobDispatcher) handleEmailJob(j jobs.Job) (jobs.Job, error) {
emailJobPayload, ok := j.Payload.(email.Payload)
if !ok {
return jobs.Job{}, fmt.Errorf("invalid payload for email job")
}

return jobs.Job{}, emailHandler.SendEmail(emailJobPayload)
}

func (d *JobDispatcher) handleTransferStartedJob(j jobs.Job) (jobs.Job, error) {
transferPayload, ok := j.Payload.(transfer.Transfer)
if !ok {
return jobs.Job{}, fmt.Errorf("invalid payload for transfer job")
}

return transferHandler.HandleTransferStarted(transferPayload)
}

func (d *JobDispatcher) handleTransferStateChangeJob(j jobs.Job) (jobs.Job, error) {
transferPayload, ok := j.Payload.(transfer.TransferStateChange)
if !ok {
return j, fmt.Errorf("invalid payload for transfer job")
}

return transferHandler.HandleTransferStateChange(transferPayload)
}

func (d *JobDispatcher) handleVisitStartedJob(j jobs.Job) (jobs.Job, error) {
visitPayload, ok := j.Payload.(visit.Visit)
if !ok {
return j, fmt.Errorf("invalid payload for visit job")
}

return visitHandler.HandleVisitStarted(visitPayload)
}

func (d *JobDispatcher) handleVisitStateChangeJob(j jobs.Job) (jobs.Job, error) {
visitPayload, ok := j.Payload.(visit.VisitStateChange)
if !ok {
return j, fmt.Errorf("invalid payload for visit state change job")
}

return visitHandler.HandleVisitStateChange(visitPayload)
}

func (d *JobDispatcher) handleReminderJob(j jobs.Job) (jobs.Job, error) {
reminderPayload, ok := j.Payload.(reminders.Reminder)
if !ok {
return j, fmt.Errorf("invalid payload for reminder job")
}

return remindersHandler.HandleReminder(reminderPayload)
}
14 changes: 8 additions & 6 deletions pkg/jobs/handler_test.go → pkg/jobs/dispatcher/handler_test.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package jobs
package dispatcher

import (
"JobScheduler/pkg/jobs/email"
"testing"
"time"

"github.com/vatusa/taskrunner/pkg/email"
"github.com/vatusa/taskrunner/pkg/jobs"
)

// Send bad email job, returns true if passed, false if failed
func TestSendBadEmail(t *testing.T) {
d := NewJobDispatcher()
// Create job payload
job := Job{
job := jobs.Job{
ID: "1",
Type: "email", // Should be capitalized
Payload: email.Payload{
Expand All @@ -25,15 +27,15 @@ func TestSendBadEmail(t *testing.T) {
}

// Send job
err := d.Dispatch(job)
_, err := d.Dispatch(job)
if err == nil {
t.Fatal("Expected to encounter an error when sending a bad email payload type ('email')")
}
}

func TestSendGoodEmail(t *testing.T) {
d := NewJobDispatcher()
job := Job{
j := jobs.Job{
ID: "2",
Type: "Email", // Should be capitalized
Payload: nil,
Expand All @@ -43,7 +45,7 @@ func TestSendGoodEmail(t *testing.T) {
}

// Send job
err := d.Dispatch(job)
_, err := d.Dispatch(j)
if err == nil {
t.Fatalf("Expected to encounter an error when sending a missing email payload")
}
Expand Down
8 changes: 0 additions & 8 deletions pkg/jobs/email/email.go

This file was deleted.

41 changes: 0 additions & 41 deletions pkg/jobs/handler.go

This file was deleted.

13 changes: 9 additions & 4 deletions pkg/jobs/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,21 @@ import (
type JobType string

const (
EmailJob JobType = "Email"
EmailJob JobType = "Email"
TransferStartedJob JobType = "TransferStarted"
TransferStateChangeJob JobType = "TransferStateChange"
VisitStartedJob JobType = "VisitStarted"
VisitStateChangeJob JobType = "VisitStateChange"
ReminderJob JobType = "Reminder"
)

type Job struct {
ID string `json:"id"`
Type JobType `json:"type"`
Payload interface{} `json:"payload"`
ScheduleAt *time.Time `json:"schedule_at"`
RequestedBy string `json:"requested_by"`
CreatedAt time.Time `json:"created_at"`
ScheduleAt *time.Time `json:"scheduleAt"`
RequestedBy string `json:"requestedBy"`
CreatedAt time.Time `json:"createdAt"`
}

type JobHandler interface {
Expand Down
5 changes: 3 additions & 2 deletions pkg/queue/connection.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package queue

import (
"JobScheduler/internal/logger"
amqp "github.com/rabbitmq/amqp091-go"
"log"
"time"

amqp "github.com/rabbitmq/amqp091-go"
"github.com/vatusa/taskrunner/internal/logger"
)

var conn *amqp.Connection
Expand Down
Loading

0 comments on commit ce6a04d

Please sign in to comment.