diff --git a/models/agency.go b/models/agency.go index 3c115d8..e4266b4 100644 --- a/models/agency.go +++ b/models/agency.go @@ -1,16 +1,19 @@ package models +import "google.golang.org/protobuf/types/known/timestamppb" + // Agency A Struct containing the main descriptions of each Agency. type Agency struct { - ID string `json:"aid,omitempty"` // 'trt13' - Name string `json:"name,omitempty"` // 'Tribunal Regional do Trabalho 13° Região' - Type string `json:"type,omitempty"` // "R" for Regional, "M" for Municipal, "F" for Federal, "E" for State. - Entity string `json:"entity,omitempty"` // "J" For Judiciário, "M" for Ministério Público, "P" for Procuradorias and "D" for Defensorias. - UF string `json:"uf,omitempty"` // Short code for federative unity. - URL string `json:"url,omitempty"` // Link for state url - Collecting []Collecting `json:"collecting,omitempty"` - TwitterHandle string `json:"twitter_handle,omitempty"` // Agency's twitter handle - OmbudsmanURL string `json:"ombudsman_url,omitempty"` //Agencys's ombudsman url + ID string `json:"aid,omitempty"` // 'trt13' + Name string `json:"name,omitempty"` // 'Tribunal Regional do Trabalho 13° Região' + Type string `json:"type,omitempty"` // "R" for Regional, "M" for Municipal, "F" for Federal, "E" for State. + Entity string `json:"entity,omitempty"` // "J" For Judiciário, "M" for Ministério Público, "P" for Procuradorias and "D" for Defensorias. + UF string `json:"uf,omitempty"` // Short code for federative unity. + URL string `json:"url,omitempty"` // Link for state url + Collecting []Collecting `json:"collecting,omitempty"` + TwitterHandle string `json:"twitter_handle,omitempty"` // Agency's twitter handle + OmbudsmanURL string `json:"ombudsman_url,omitempty"` //Agencys's ombudsman url + LastCollection *timestamppb.Timestamp `json:"last_collection,omitempty"` } // Collecting A Struct containing the day we checked the status of the data and the reasons why we didn't collected it. diff --git a/repo/database/dto/agencyDTO.go b/repo/database/dto/agencyDTO.go index 61d8a99..34820c1 100644 --- a/repo/database/dto/agencyDTO.go +++ b/repo/database/dto/agencyDTO.go @@ -3,21 +3,24 @@ package dto import ( "encoding/json" "fmt" + "time" "github.com/dadosjusbr/storage/models" + "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/datatypes" ) // Agency A Struct containing the main descriptions of each Agency. type AgencyDTO struct { - ID string `gorm:"column:id"` - Name string `gorm:"column:nome"` - Type string `gorm:"column:jurisdicao"` - Entity string `gorm:"column:entidade"` - UF string `gorm:"column:uf"` - Collecting datatypes.JSON `gorm:"column:coletando"` - TwitterHandle string `gorm:"column:twitter_handle"` - OmbudsmanURL string `gorm:"column:ouvidoria"` + ID string `gorm:"column:id"` + Name string `gorm:"column:nome"` + Type string `gorm:"column:jurisdicao"` + Entity string `gorm:"column:entidade"` + UF string `gorm:"column:uf"` + Collecting datatypes.JSON `gorm:"column:coletando"` + TwitterHandle string `gorm:"column:twitter_handle"` + OmbudsmanURL string `gorm:"column:ouvidoria"` + LastCollection time.Time `gorm:"column:ultima_coleta"` } func (AgencyDTO) TableName() string { @@ -35,14 +38,15 @@ func (a AgencyDTO) ConvertToModel() (*models.Agency, error) { return nil, fmt.Errorf("error while unmarshaling collecting: %q", err) } return &models.Agency{ - ID: a.ID, - Name: a.Name, - Type: a.Type, - Entity: a.Entity, - UF: a.UF, - Collecting: collecting, - TwitterHandle: a.TwitterHandle, - OmbudsmanURL: a.OmbudsmanURL, + ID: a.ID, + Name: a.Name, + Type: a.Type, + Entity: a.Entity, + UF: a.UF, + Collecting: collecting, + TwitterHandle: a.TwitterHandle, + OmbudsmanURL: a.OmbudsmanURL, + LastCollection: timestamppb.New(a.LastCollection), }, nil } @@ -51,14 +55,21 @@ func NewAgencyDTO(agency models.Agency) (*AgencyDTO, error) { if err != nil { return nil, fmt.Errorf("error while marshaling collecting: %q", err) } + var lastCollection time.Time + if agency.LastCollection != nil { + lastCollection = time.Unix(agency.LastCollection.Seconds, int64(agency.LastCollection.Nanos)) + } else { + lastCollection = time.Now() + } return &AgencyDTO{ - ID: agency.ID, - Name: agency.Name, - Type: agency.Type, - Entity: agency.Entity, - UF: agency.UF, - Collecting: collecting, - TwitterHandle: agency.TwitterHandle, - OmbudsmanURL: agency.OmbudsmanURL, + ID: agency.ID, + Name: agency.Name, + Type: agency.Type, + Entity: agency.Entity, + UF: agency.UF, + Collecting: collecting, + TwitterHandle: agency.TwitterHandle, + OmbudsmanURL: agency.OmbudsmanURL, + LastCollection: lastCollection, }, nil } diff --git a/repo/database/postgres.go b/repo/database/postgres.go index c5abfdb..6974c0c 100644 --- a/repo/database/postgres.go +++ b/repo/database/postgres.go @@ -222,7 +222,9 @@ func (p *PostgresDB) GetAgenciesByUF(uf string) ([]models.Agency, error) { func (p *PostgresDB) GetAgency(aid string) (*models.Agency, error) { var dtoOrgao dto.AgencyDTO aid = strings.ToLower(aid) - if err := p.db.Model(&dto.AgencyDTO{}).Where("id = ?", aid).First(&dtoOrgao).Error; err != nil { + m := p.db.Model(&dto.AgencyDTO{}).Select("orgaos.*, max(coletas.timestamp) as ultima_coleta") + m = m.Joins("INNER JOIN coletas ON atual = true AND coletas.id_orgao = orgaos.id AND orgaos.id = ?", aid) + if err := m.Group("orgaos.id").First(&dtoOrgao).Error; err != nil { return nil, fmt.Errorf("error getting agency '%s': %q", aid, err) } orgao, err := dtoOrgao.ConvertToModel()