Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Commit

Permalink
Merge pull request #55 from Coderockr/feature/38
Browse files Browse the repository at this point in the history
Issue #38 - Get Organization Endpoint
  • Loading branch information
lucassabreu committed Aug 31, 2017
2 parents 5451f8f + c2616a4 commit a54d79f
Show file tree
Hide file tree
Showing 20 changed files with 449 additions and 40 deletions.
Binary file removed .DS_Store
Binary file not shown.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@ bin/*

# ignored until version 1.0
vendor
vendor.orig

coverage.txt
server-cmd
.data/
31 changes: 22 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,36 @@ all: build

# set default as dev if not set
export VITRINESOCIAL_ENV ?= dev
export DATABASE_HOST ?= 127.0.0.1
export DATABASE_HOST ?= 0.0.0.0
export m ?= default

.PHONY: build

install-db:
docker-compose up -d postgres
docker-compose exec postgres psql -h $$DATABASE_HOST -U postgres -c "create database vitrine"
docker-compose exec postgres psql -h $$DATABASE_HOST -U postgres vitrine -f /vitrine/devops/database.sql

install:
install: ## install project dependences
go get github.com/rubenv/sql-migrate/...
go get -u github.com/golang/dep/cmd/dep
cd server; dep ensure

migrations:
new-migration: ## create a new migration, use make new-migration m=message to set the message
sql-migrate new -config=./devops/dbconfig.yml -env=production "$(m)"

migrations: ## run pending migrations
docker-compose up -d
go get github.com/rubenv/sql-migrate/...
sql-migrate up -config=devops/dbconfig.yml -env=production

serve:
serve: ## start server
docker-compose up -d
cd server && go run main.go

serve-watch: ## start server with hot reload
docker-compose up -d
go get github.com/codegangsta/gin
gin --port 8081 --appPort 8000 --path ${PWD}/server --bin server-cmd run server/main.go

postgres-cmd: ## open the postgresql command line
docker-compose exec postgres psql -h $$DATABASE_HOST -U postgres vitrine

# Absolutely awesome: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
help: ## show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@

-- +migrate Up
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE,
Expand Down Expand Up @@ -42,3 +44,4 @@ CREATE TABLE needs_images (
name VARCHAR(255) NOT NULL,
url VARCHAR(255) NOT NULL
);
-- +migrate Down
4 changes: 4 additions & 0 deletions devops/migrations/20170829204833-fix-field-name.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- +migrate Up
ALTER TABLE needs RENAME categoty_id TO category_id;
-- +migrate Down
ALTER TABLE needs RENAME category_id TO categoty_id;
6 changes: 6 additions & 0 deletions devops/migrations/20170829213041-fixture-images.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
-- +migrate Up
insert into needs_images (need_id, name, url) values(1, 'campanha alimentos', 'http://pibjc.org/novosite/wp-content/uploads/2016/11/campanha-alimentos.jpg');
insert into needs_images (need_id, name, url) values(1, 'outra campanha alimentos', 'http://pibjc.org/novosite/wp-content/uploads/2016/11/campanha-alimentos.jpg');
insert into organizations_images (organization_id, name, url) values(1, 'banner', 'http://info.geekie.com.br/wp-content/uploads/2015/04/Unesco.jpg');
insert into organizations_images (organization_id, name, url) values(1, 'SDG', 'http://en.unesco.org/sites/default/files/sdgs_poster_new1.png');
-- +migrate Down
6 changes: 6 additions & 0 deletions devops/migrations/20170830192848-fix-sequences.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

-- +migrate Up
select setval('organizations_id_seq', 2);
select setval('needs_id_seq', 3);
select setval('categories_id_seq', 9);
-- +migrate Down
5 changes: 5 additions & 0 deletions devops/migrations/20170830194507-fixture-other-category.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

-- +migrate Up
insert into needs (category_id, organization_id, title, description, required_qtd, reached_qtd, due_date, status, unity)
values (5, 1, 'Voluntário', 'Ajudar a levar comida as áreas de risco', 100, 0, '2018-01-01', 'ACTIVE', 'semanas');
-- +migrate Down
3 changes: 3 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,8 @@ services:
network_mode: "bridge"
volumes:
- ./:/vitrine
- ./.data/postgres:/var/lib/postgresql
ports:
- "5432:5432"
environment:
- POSTGRES_DB=vitrine
14 changes: 7 additions & 7 deletions server/Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions server/Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@
[[constraint]]
branch = "master"
name = "github.com/lib/pq"

[[constraint]]
branch = "master"
name = "github.com/golang/sync"
8 changes: 0 additions & 8 deletions server/auth/store.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
package auth

import "errors"

var (
ErrEmailDuplication = errors.New("The email is already in the store")
ErrUserNotFound = errors.New("User not found")
ErrWrongPassword = errors.New("email or password is incorrent")
)

type UserRepository interface {
Login(email, pass string) (int64, error)
}
2 changes: 1 addition & 1 deletion server/config/dev.env
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ DATABASE_HOST=127.0.0.1
DATABASE_PORT=5432
STORAGE=local
STORAGE_PATH=/tmp
API_PORT=8080
API_PORT=8000
38 changes: 38 additions & 0 deletions server/db/repo/category.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package repo

import (
"github.com/golang/sync/syncmap"

"github.com/Coderockr/vitrine-social/server/model"
"github.com/jmoiron/sqlx"
)

// CategoryRepository to access database
type CategoryRepository struct {
db *sqlx.DB
}

var categoryCache = syncmap.Map{}

// NewCategoryRepository create a new repository
func NewCategoryRepository(db *sqlx.DB) *CategoryRepository {
return &CategoryRepository{
db: db,
}
}

// Get a category from database using its id
func (r *CategoryRepository) Get(id int64) (model.Category, error) {
if c, ok := categoryCache.Load(id); ok {
return c.(model.Category), nil
}

c := model.Category{}
err := r.db.Get(&c, "SELECT * FROM categories WHERE id = $1", id)
if err != nil {
return model.Category{}, err
}

categoryCache.Store(id, c)
return c, nil
}
43 changes: 43 additions & 0 deletions server/db/repo/need.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package repo

import (
"github.com/Coderockr/vitrine-social/server/model"
"github.com/jmoiron/sqlx"
)

// NeedRepository is a implementation for Postgres
type NeedRepository struct {
db *sqlx.DB
catRepo *CategoryRepository
}

// NewNeedRepository creates a new repository
func NewNeedRepository(db *sqlx.DB) *NeedRepository {
return &NeedRepository{
db: db,
catRepo: NewCategoryRepository(db),
}
}

// Get one Need from database
func (r *NeedRepository) Get(id int64) (*model.Need, error) {
var n *model.Need
err := r.db.Get(n, "SELECT * FROM needs WHERE id = $1", id)
if err != nil {
return nil, err
}

n.Category, err = r.catRepo.Get(n.CategoryID)
return n, nil
}

// GetNeedImages without the need data
func (r *NeedRepository) getNeedImages(n *model.Need) ([]model.NeedImage, error) {
images := []model.NeedImage{}
err := r.db.Select(&images, "SELECT * FROM needs_images WHERE need_id = $1", n.ID)
if err != nil {
return nil, err
}

return images, nil
}
58 changes: 58 additions & 0 deletions server/db/repo/organization.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package repo

import (
"fmt"

"github.com/Coderockr/vitrine-social/server/model"
"github.com/jmoiron/sqlx"
)

// OrganizationRepository is a implementation for Postgres
type OrganizationRepository struct {
db *sqlx.DB
catRepo *CategoryRepository
needRepo *NeedRepository
}

// NewOrganizationRepository creates a new repository
func NewOrganizationRepository(db *sqlx.DB) *OrganizationRepository {
return &OrganizationRepository{
db: db,
catRepo: NewCategoryRepository(db),
needRepo: NewNeedRepository(db),
}
}

// Get one Organization from database
func (r *OrganizationRepository) Get(id int64) (*model.Organization, error) {
o := &model.Organization{}
err := r.db.Get(o, "SELECT * FROM organizations WHERE id = $1", id)
if err != nil {
return nil, err
}

err = r.db.Select(&o.Images, "SELECT * FROM organizations_images WHERE organization_id = $1", id)
if err != nil {
return nil, err
}

err = r.db.Select(&o.Needs, "SELECT * FROM needs WHERE organization_id = $1", id)
if err != nil {
return nil, err
}

for i := range o.Needs {
o.Needs[i].Category, err = r.catRepo.Get(o.Needs[i].CategoryID)
if err != nil {
fmt.Println("test?")
return nil, err
}

o.Needs[i].Images, err = r.needRepo.getNeedImages(&o.Needs[i])
if err != nil {
return nil, err
}
}

return o, nil
}
21 changes: 21 additions & 0 deletions server/handlers/error.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package handlers

import (
"encoding/json"
"net/http"
)

// ErrorMessage is a JSON formatter
type ErrorMessage struct {
Code int `json:"code"`
Message string `json:"message"`
}

// HandleHttpError formats and returns errors
func HandleHttpError(w http.ResponseWriter, errno int, err error) {
w.WriteHeader(errno)
json.NewEncoder(w).Encode(&ErrorMessage{
Code: errno,
Message: err.Error(),
})
}
Loading

0 comments on commit a54d79f

Please sign in to comment.