Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

局divisionAPIの作成 #909

Merged
merged 14 commits into from
Jan 18, 2025
Merged
81 changes: 81 additions & 0 deletions api/externals/controller/division_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package controller

import (
"net/http"

"github.com/NUTFes/FinanSu/api/generated"
"github.com/NUTFes/FinanSu/api/internals/usecase"
"github.com/labstack/echo/v4"
)

type divisionController struct {
u usecase.DivisionUseCase
}

type DivisionController interface {
IndexDivisions(echo.Context) error
CreateDivision(echo.Context) error
UpdateDivision(echo.Context) error
DestroyDivision(echo.Context) error
}

func NewDivisionController(u usecase.DivisionUseCase) DivisionController {
return &divisionController{u}
}

func (d *divisionController) IndexDivisions(c echo.Context) error {
ctx := c.Request().Context()
year := c.QueryParam("year")
financialRecordId := c.QueryParam("financial_record_id")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[must]これopenapiとクエリパラメータとどっちか揃えてください!


divisionDetails, err := d.u.GetDivisions(ctx, year, financialRecordId)
if err != nil {
return err
}
return c.JSON(http.StatusOK, divisionDetails)
}

func (d *divisionController) CreateDivision(c echo.Context) error {
ctx := c.Request().Context()
division := new(Division)

if err := c.Bind(division); err != nil {
return c.String(http.StatusBadRequest, "Bad Request")
}
latestDivision, err := d.u.CreateDivision(ctx, *division)
if err != nil {
return err
}
return c.JSON(http.StatusOK, latestDivision)
}

func (d *divisionController) UpdateDivision(c echo.Context) error {
ctx := c.Request().Context()
id := c.Param("id")
division := new(Division)

if err := c.Bind(division); err != nil {
return c.String(http.StatusBadRequest, "Bad Request")
}
updatedDivision, err := d.u.UpdateDivision(ctx, id, *division)
if err != nil {
return err
}
return c.JSON(http.StatusOK, updatedDivision)
}

func (d *divisionController) DestroyDivision(c echo.Context) error {
ctx := c.Request().Context()
id := c.Param("id")

err := d.u.DestroyDivision(ctx, id)
if err != nil {
return err
}
return c.String(http.StatusOK, "Destroy Division")
}

type (
Division = generated.Division
DivisionDetails = generated.DivisionDetails
)
140 changes: 140 additions & 0 deletions api/externals/repository/division_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package repository

import (
"context"
"database/sql"

"github.com/NUTFes/FinanSu/api/drivers/db"
"github.com/NUTFes/FinanSu/api/externals/repository/abstract"
"github.com/NUTFes/FinanSu/api/generated"
goqu "github.com/doug-martin/goqu/v9"
)

type divisionRepository struct {
client db.Client
crud abstract.Crud
}

type DivisionRepository interface {
AllByPeriodAndFinancialRecord(context.Context, string, string) (*sql.Rows, error)
GetById(context.Context, string) (*sql.Row, error)
Create(context.Context, Division) error
Update(context.Context, string, Division) error
Delete(context.Context, string) error
FindLatestRecord(context.Context) (*sql.Row, error)
}

func NewDivisionRepository(c db.Client, ac abstract.Crud) DivisionRepository {
return &divisionRepository{c, ac}
}

// 年度別と財務記録で取得
func (dr *divisionRepository) AllByPeriodAndFinancialRecord(
c context.Context,
year string,
financialRecordId string,
) (*sql.Rows, error) {

ds := selectDivisionQuery

if year != "" {
ds = ds.Where(goqu.Ex{"years.year": year})
}
if financialRecordId != "" {
ds = ds.Where(goqu.Ex{"financial_records.id": financialRecordId})
}

// クエリを構築し、SQLを生成
query, _, err := ds.ToSQL()
if err != nil {
return nil, err
}
return dr.crud.Read(c, query)
}

// IDで取得
func (dr *divisionRepository) GetById(
c context.Context,
id string,
) (*sql.Row, error) {
ds, _, err := selectDivisionQuery.
Where(goqu.Ex{"divisions.id": id}).
ToSQL()
if err != nil {
return nil, err
}
return dr.crud.ReadByID(c, ds)
}

// 部門作成
func (dr *divisionRepository) Create(
c context.Context,
division Division,
) error {
ds := dialect.Insert("divisions").
Rows(goqu.Record{"name": division.Name, "financial_record_id": division.FinancialRecordID})
query, _, err := ds.ToSQL()
if err != nil {
return err
}
return dr.crud.UpdateDB(c, query)
}

// 部門更新
func (dr *divisionRepository) Update(
c context.Context,
id string,
division Division,
) error {
ds := dialect.Update("divisions").
Set(goqu.Record{"name": division.Name, "financial_record_id": division.FinancialRecordID}).
Where(goqu.Ex{"id": id})
query, _, err := ds.ToSQL()
if err != nil {
return err
}
return dr.crud.UpdateDB(c, query)
}

// 部門削除
func (dr *divisionRepository) Delete(
c context.Context,
id string,
) error {
ds := dialect.Delete("divisions").Where(goqu.Ex{"id": id})
query, _, err := ds.ToSQL()
if err != nil {
return err
}
return dr.crud.UpdateDB(c, query)
}

// 最新の部門を取得する
func (dr *divisionRepository) FindLatestRecord(c context.Context) (*sql.Row, error) {
ds := selectDivisionQuery
query, _, err := ds.Limit(1).ToSQL()

if err != nil {
return nil, err
}
return dr.crud.ReadByID(c, query)
}

type Division = generated.Division

// NOTE: getの共通部分抜き出し
var selectDivisionQuery = dialect.From("divisions").
Select(
"divisions.id",
"divisions.name",
"financial_records.name",
goqu.COALESCE(goqu.SUM("item_budgets.amount"), 0).As("budget"),
goqu.COALESCE(goqu.SUM("buy_reports.amount"), 0).As("expense"),
goqu.L("COALESCE(SUM(item_budgets.amount), 0) - COALESCE(SUM(buy_reports.amount), 0)").As("balance")).
InnerJoin(goqu.I("financial_records"), goqu.On(goqu.I("financial_records.id").Eq(goqu.I("divisions.financial_record_id")))).
InnerJoin(goqu.I("years"), goqu.On(goqu.I("financial_records.year_id").Eq(goqu.I("years.id")))).
LeftJoin(goqu.I("festival_items"), goqu.On(goqu.I("divisions.id").Eq(goqu.I("festival_items.division_id")))).
LeftJoin(goqu.I("item_budgets"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("item_budgets.festival_item_id")))).
LeftJoin(goqu.I("buy_reports"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("buy_reports.festival_item_id")))).
GroupBy(goqu.I("divisions.id")).
Order(goqu.I("divisions.id").Desc())
29 changes: 27 additions & 2 deletions api/generated/openapi_gen.go

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

2 changes: 1 addition & 1 deletion api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/NUTFes/FinanSu/api
go 1.16

require (
github.com/doug-martin/goqu/v9 v9.19.0 // indirect
github.com/doug-martin/goqu/v9 v9.19.0
github.com/go-sql-driver/mysql v1.6.0
github.com/go-test/deep v1.0.8 // indirect
github.com/google/go-cmp v0.6.0 // indirect
Expand Down
3 changes: 3 additions & 0 deletions api/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM=
Expand Down Expand Up @@ -161,6 +162,7 @@ github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRy
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo=
github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
Expand Down Expand Up @@ -269,6 +271,7 @@ github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKk
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
Expand Down
4 changes: 4 additions & 0 deletions api/internals/di/di.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func InitializeServer() db.Client {
budgetRepository := repository.NewBudgetRepository(client, crud)
bureauRepository := repository.NewBureauRepository(client, crud)
departmentRepository := repository.NewDepartmentRepository(client, crud)
divisionRepository := repository.NewDivisionRepository(client, crud)
expenseRepository := repository.NewExpenseRepository(client, crud)
financialRecordRepository := repository.NewFinancialRecordRepository(client, crud)
fundInformationRepository := repository.NewFundInformationRepository(client, crud)
Expand Down Expand Up @@ -57,6 +58,7 @@ func InitializeServer() db.Client {
budgetUseCase := usecase.NewBudgetUseCase(budgetRepository)
bureauUseCase := usecase.NewBureauUseCase(bureauRepository)
departmentUseCase := usecase.NewDepartmentUseCase(departmentRepository)
divisionUseCase := usecase.NewDivisionUseCase(divisionRepository)
expenseUseCase := usecase.NewExpenseUseCase(expenseRepository)
financialRecordUseCase := usecase.NewFinancialRecordUseCase(financialRecordRepository)
fundInformationUseCase := usecase.NewFundInformationUseCase(fundInformationRepository)
Expand Down Expand Up @@ -91,6 +93,7 @@ func InitializeServer() db.Client {
budgetController := controller.NewBudgetController(budgetUseCase)
bureauController := controller.NewBureauController(bureauUseCase)
departmentController := controller.NewDepartmentController(departmentUseCase)
divisionController := controller.NewDivisionController(divisionUseCase)
expenseController := controller.NewExpenseController(expenseUseCase)
financialRecordController := controller.NewFinancialRecordController(financialRecordUseCase)
fundInformationController := controller.NewFundInformationController(fundInformationUseCase)
Expand Down Expand Up @@ -119,6 +122,7 @@ func InitializeServer() db.Client {
budgetController,
bureauController,
departmentController,
divisionController,
expenseController,
financialRecordController,
fundInformationController,
Expand Down
Loading
Loading