Merge pull request #11 from rede5/back-task-4
feat(cadastro-fot): implementa crud completo de FOT com joins e campo booleano - Cria tabela 'cadastro_fot' com integracao (FKs) para Empresas, Cursos e Formaturas - Implementa endpoints (GET/POST/PUT/DELETE) em '/api/cadastro-fot' - Otimiza rota GET utilizando JOINs para retornar nomes das entidades estrangeiras - Define campo 'pre_venda' como BOOLEAN e 'fot' como identificador unico (int) - Adiciona tratativa robusta para tipos numericos no Postgres
This commit is contained in:
commit
63197b3a84
10 changed files with 1381 additions and 0 deletions
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"photum-backend/docs"
|
"photum-backend/docs"
|
||||||
"photum-backend/internal/anos_formaturas"
|
"photum-backend/internal/anos_formaturas"
|
||||||
"photum-backend/internal/auth"
|
"photum-backend/internal/auth"
|
||||||
|
"photum-backend/internal/cadastro_fot"
|
||||||
"photum-backend/internal/config"
|
"photum-backend/internal/config"
|
||||||
"photum-backend/internal/cursos"
|
"photum-backend/internal/cursos"
|
||||||
"photum-backend/internal/db"
|
"photum-backend/internal/db"
|
||||||
|
|
@ -62,6 +63,7 @@ func main() {
|
||||||
anosFormaturasService := anos_formaturas.NewService(queries)
|
anosFormaturasService := anos_formaturas.NewService(queries)
|
||||||
tiposServicosService := tipos_servicos.NewService(queries)
|
tiposServicosService := tipos_servicos.NewService(queries)
|
||||||
tiposEventosService := tipos_eventos.NewService(queries)
|
tiposEventosService := tipos_eventos.NewService(queries)
|
||||||
|
cadastroFotService := cadastro_fot.NewService(queries)
|
||||||
|
|
||||||
// Initialize handlers
|
// Initialize handlers
|
||||||
authHandler := auth.NewHandler(authService)
|
authHandler := auth.NewHandler(authService)
|
||||||
|
|
@ -72,6 +74,7 @@ func main() {
|
||||||
anosFormaturasHandler := anos_formaturas.NewHandler(anosFormaturasService)
|
anosFormaturasHandler := anos_formaturas.NewHandler(anosFormaturasService)
|
||||||
tiposServicosHandler := tipos_servicos.NewHandler(tiposServicosService)
|
tiposServicosHandler := tipos_servicos.NewHandler(tiposServicosService)
|
||||||
tiposEventosHandler := tipos_eventos.NewHandler(tiposEventosService)
|
tiposEventosHandler := tipos_eventos.NewHandler(tiposEventosService)
|
||||||
|
cadastroFotHandler := cadastro_fot.NewHandler(cadastroFotService)
|
||||||
|
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
|
||||||
|
|
@ -166,6 +169,12 @@ func main() {
|
||||||
api.PUT("/tipos-eventos/:id", tiposEventosHandler.Update)
|
api.PUT("/tipos-eventos/:id", tiposEventosHandler.Update)
|
||||||
api.DELETE("/tipos-eventos/:id", tiposEventosHandler.Delete)
|
api.DELETE("/tipos-eventos/:id", tiposEventosHandler.Delete)
|
||||||
api.POST("/tipos-eventos/precos", tiposEventosHandler.SetPrice)
|
api.POST("/tipos-eventos/precos", tiposEventosHandler.SetPrice)
|
||||||
|
|
||||||
|
api.GET("/cadastro-fot", cadastroFotHandler.List)
|
||||||
|
api.POST("/cadastro-fot", cadastroFotHandler.Create)
|
||||||
|
api.GET("/cadastro-fot/:id", cadastroFotHandler.Get)
|
||||||
|
api.PUT("/cadastro-fot/:id", cadastroFotHandler.Update)
|
||||||
|
api.DELETE("/cadastro-fot/:id", cadastroFotHandler.Delete)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Swagger Host Configured: %s", cfg.SwaggerHost)
|
log.Printf("Swagger Host Configured: %s", cfg.SwaggerHost)
|
||||||
|
|
|
||||||
|
|
@ -184,6 +184,182 @@ const docTemplate = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/cadastro-fot": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "List all FOT records",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Create a new FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "FOT Data",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CreateInput"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"201": {
|
||||||
|
"description": "Created",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/cadastro-fot/{id}": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Get FOT record by ID",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"put": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Update FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Data",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CreateInput"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Delete FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"204": {
|
||||||
|
"description": "No Content"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/cursos": {
|
"/api/cursos": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [
|
"security": [
|
||||||
|
|
@ -1647,6 +1823,88 @@ const docTemplate = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cadastro_fot.CadastroFotResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ano_formatura_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ano_formatura_label": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"cidade": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_nome": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_nome": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"estado": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"fot": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"gastos_captacao": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"instituicao": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"observacoes": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pre_venda": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cadastro_fot.CreateInput": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ano_formatura_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"cidade": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"estado": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"fot": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"gastos_captacao": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"instituicao": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"observacoes": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pre_venda": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"cursos.CreateCursoRequest": {
|
"cursos.CreateCursoRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,182 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/cadastro-fot": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "List all FOT records",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Create a new FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "FOT Data",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CreateInput"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"201": {
|
||||||
|
"description": "Created",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/cadastro-fot/{id}": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Get FOT record by ID",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"put": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Update FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Data",
|
||||||
|
"name": "request",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CreateInput"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/cadastro_fot.CadastroFotResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"cadastro_fot"
|
||||||
|
],
|
||||||
|
"summary": "Delete FOT record",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"204": {
|
||||||
|
"description": "No Content"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/cursos": {
|
"/api/cursos": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [
|
"security": [
|
||||||
|
|
@ -1641,6 +1817,88 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cadastro_fot.CadastroFotResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ano_formatura_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"ano_formatura_label": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"cidade": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_nome": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_nome": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"estado": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"fot": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"gastos_captacao": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"instituicao": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"observacoes": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pre_venda": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cadastro_fot.CreateInput": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ano_formatura_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"cidade": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"curso_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"empresa_id": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"estado": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"fot": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"gastos_captacao": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"instituicao": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"observacoes": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pre_venda": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"cursos.CreateCursoRequest": {
|
"cursos.CreateCursoRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,60 @@ definitions:
|
||||||
role:
|
role:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
cadastro_fot.CadastroFotResponse:
|
||||||
|
properties:
|
||||||
|
ano_formatura_id:
|
||||||
|
type: string
|
||||||
|
ano_formatura_label:
|
||||||
|
type: string
|
||||||
|
cidade:
|
||||||
|
type: string
|
||||||
|
curso_id:
|
||||||
|
type: string
|
||||||
|
curso_nome:
|
||||||
|
type: string
|
||||||
|
empresa_id:
|
||||||
|
type: string
|
||||||
|
empresa_nome:
|
||||||
|
type: string
|
||||||
|
estado:
|
||||||
|
type: string
|
||||||
|
fot:
|
||||||
|
type: integer
|
||||||
|
gastos_captacao:
|
||||||
|
type: number
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
instituicao:
|
||||||
|
type: string
|
||||||
|
observacoes:
|
||||||
|
type: string
|
||||||
|
pre_venda:
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
cadastro_fot.CreateInput:
|
||||||
|
properties:
|
||||||
|
ano_formatura_id:
|
||||||
|
type: string
|
||||||
|
cidade:
|
||||||
|
type: string
|
||||||
|
curso_id:
|
||||||
|
type: string
|
||||||
|
empresa_id:
|
||||||
|
type: string
|
||||||
|
estado:
|
||||||
|
type: string
|
||||||
|
fot:
|
||||||
|
type: integer
|
||||||
|
gastos_captacao:
|
||||||
|
type: number
|
||||||
|
instituicao:
|
||||||
|
type: string
|
||||||
|
observacoes:
|
||||||
|
type: string
|
||||||
|
pre_venda:
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
cursos.CreateCursoRequest:
|
cursos.CreateCursoRequest:
|
||||||
properties:
|
properties:
|
||||||
nome:
|
nome:
|
||||||
|
|
@ -408,6 +462,114 @@ paths:
|
||||||
summary: Update a graduation year
|
summary: Update a graduation year
|
||||||
tags:
|
tags:
|
||||||
- anos_formaturas
|
- anos_formaturas
|
||||||
|
/api/cadastro-fot:
|
||||||
|
get:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CadastroFotResponse'
|
||||||
|
type: array
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: List all FOT records
|
||||||
|
tags:
|
||||||
|
- cadastro_fot
|
||||||
|
post:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: FOT Data
|
||||||
|
in: body
|
||||||
|
name: request
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CreateInput'
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"201":
|
||||||
|
description: Created
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CadastroFotResponse'
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: Create a new FOT record
|
||||||
|
tags:
|
||||||
|
- cadastro_fot
|
||||||
|
/api/cadastro-fot/{id}:
|
||||||
|
delete:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: ID
|
||||||
|
in: path
|
||||||
|
name: id
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: No Content
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: Delete FOT record
|
||||||
|
tags:
|
||||||
|
- cadastro_fot
|
||||||
|
get:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: ID
|
||||||
|
in: path
|
||||||
|
name: id
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CadastroFotResponse'
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: Get FOT record by ID
|
||||||
|
tags:
|
||||||
|
- cadastro_fot
|
||||||
|
put:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: ID
|
||||||
|
in: path
|
||||||
|
name: id
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
- description: Data
|
||||||
|
in: body
|
||||||
|
name: request
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CreateInput'
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/cadastro_fot.CadastroFotResponse'
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: Update FOT record
|
||||||
|
tags:
|
||||||
|
- cadastro_fot
|
||||||
/api/cursos:
|
/api/cursos:
|
||||||
get:
|
get:
|
||||||
consumes:
|
consumes:
|
||||||
|
|
|
||||||
209
backend/internal/cadastro_fot/handler.go
Normal file
209
backend/internal/cadastro_fot/handler.go
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
package cadastro_fot
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"photum-backend/internal/db/generated"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Handler struct {
|
||||||
|
service *Service
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHandler(service *Service) *Handler {
|
||||||
|
return &Handler{service: service}
|
||||||
|
}
|
||||||
|
|
||||||
|
type CadastroFotResponse struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID string `json:"empresa_id"`
|
||||||
|
EmpresaNome string `json:"empresa_nome,omitempty"`
|
||||||
|
CursoID string `json:"curso_id"`
|
||||||
|
CursoNome string `json:"curso_nome,omitempty"`
|
||||||
|
AnoFormaturaID string `json:"ano_formatura_id"`
|
||||||
|
AnoFormaturaLabel string `json:"ano_formatura_label,omitempty"`
|
||||||
|
Instituicao string `json:"instituicao"`
|
||||||
|
Cidade string `json:"cidade"`
|
||||||
|
Estado string `json:"estado"`
|
||||||
|
Observacoes string `json:"observacoes"`
|
||||||
|
GastosCaptacao float64 `json:"gastos_captacao"`
|
||||||
|
PreVenda bool `json:"pre_venda"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func fromPgNumeric(n pgtype.Numeric) float64 {
|
||||||
|
f, _ := n.Float64Value()
|
||||||
|
return f.Float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map Create result (no joins)
|
||||||
|
func toResponse(c generated.CadastroFot) CadastroFotResponse {
|
||||||
|
return CadastroFotResponse{
|
||||||
|
ID: uuid.UUID(c.ID.Bytes).String(),
|
||||||
|
Fot: c.Fot,
|
||||||
|
EmpresaID: uuid.UUID(c.EmpresaID.Bytes).String(),
|
||||||
|
CursoID: uuid.UUID(c.CursoID.Bytes).String(),
|
||||||
|
AnoFormaturaID: uuid.UUID(c.AnoFormaturaID.Bytes).String(),
|
||||||
|
Instituicao: c.Instituicao.String,
|
||||||
|
Cidade: c.Cidade.String,
|
||||||
|
Estado: c.Estado.String,
|
||||||
|
Observacoes: c.Observacoes.String,
|
||||||
|
GastosCaptacao: fromPgNumeric(c.GastosCaptacao),
|
||||||
|
PreVenda: c.PreVenda.Bool,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map List result (with joins)
|
||||||
|
func toListResponse(r generated.ListCadastroFotRow) CadastroFotResponse {
|
||||||
|
return CadastroFotResponse{
|
||||||
|
ID: uuid.UUID(r.ID.Bytes).String(),
|
||||||
|
Fot: r.Fot,
|
||||||
|
EmpresaID: uuid.UUID(r.EmpresaID.Bytes).String(),
|
||||||
|
EmpresaNome: r.EmpresaNome,
|
||||||
|
CursoID: uuid.UUID(r.CursoID.Bytes).String(),
|
||||||
|
CursoNome: r.CursoNome,
|
||||||
|
AnoFormaturaID: uuid.UUID(r.AnoFormaturaID.Bytes).String(),
|
||||||
|
AnoFormaturaLabel: r.AnoFormaturaLabel,
|
||||||
|
Instituicao: r.Instituicao.String,
|
||||||
|
Cidade: r.Cidade.String,
|
||||||
|
Estado: r.Estado.String,
|
||||||
|
Observacoes: r.Observacoes.String,
|
||||||
|
GastosCaptacao: fromPgNumeric(r.GastosCaptacao),
|
||||||
|
PreVenda: r.PreVenda.Bool,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map GetByID result
|
||||||
|
func toGetResponse(r generated.GetCadastroFotByIDRow) CadastroFotResponse {
|
||||||
|
return CadastroFotResponse{
|
||||||
|
ID: uuid.UUID(r.ID.Bytes).String(),
|
||||||
|
Fot: r.Fot,
|
||||||
|
EmpresaID: uuid.UUID(r.EmpresaID.Bytes).String(),
|
||||||
|
EmpresaNome: r.EmpresaNome,
|
||||||
|
CursoID: uuid.UUID(r.CursoID.Bytes).String(),
|
||||||
|
CursoNome: r.CursoNome,
|
||||||
|
AnoFormaturaID: uuid.UUID(r.AnoFormaturaID.Bytes).String(),
|
||||||
|
AnoFormaturaLabel: r.AnoFormaturaLabel,
|
||||||
|
Instituicao: r.Instituicao.String,
|
||||||
|
Cidade: r.Cidade.String,
|
||||||
|
Estado: r.Estado.String,
|
||||||
|
Observacoes: r.Observacoes.String,
|
||||||
|
GastosCaptacao: fromPgNumeric(r.GastosCaptacao),
|
||||||
|
PreVenda: r.PreVenda.Bool,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create godoc
|
||||||
|
// @Summary Create a new FOT record
|
||||||
|
// @Tags cadastro_fot
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Param request body CreateInput true "FOT Data"
|
||||||
|
// @Success 201 {object} CadastroFotResponse
|
||||||
|
// @Router /api/cadastro-fot [post]
|
||||||
|
func (h *Handler) Create(c *gin.Context) {
|
||||||
|
var req CreateInput
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := h.service.Create(c.Request.Context(), req)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusCreated, toResponse(*res))
|
||||||
|
}
|
||||||
|
|
||||||
|
// List godoc
|
||||||
|
// @Summary List all FOT records
|
||||||
|
// @Tags cadastro_fot
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Success 200 {array} CadastroFotResponse
|
||||||
|
// @Router /api/cadastro-fot [get]
|
||||||
|
func (h *Handler) List(c *gin.Context) {
|
||||||
|
rows, err := h.service.List(c.Request.Context())
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response := []CadastroFotResponse{}
|
||||||
|
for _, r := range rows {
|
||||||
|
response = append(response, toListResponse(r))
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, response)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get godoc
|
||||||
|
// @Summary Get FOT record by ID
|
||||||
|
// @Tags cadastro_fot
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Param id path string true "ID"
|
||||||
|
// @Success 200 {object} CadastroFotResponse
|
||||||
|
// @Router /api/cadastro-fot/{id} [get]
|
||||||
|
func (h *Handler) Get(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
res, err := h.service.GetByID(c.Request.Context(), id)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusNotFound, gin.H{"error": "Record not found"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, toGetResponse(*res))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update godoc
|
||||||
|
// @Summary Update FOT record
|
||||||
|
// @Tags cadastro_fot
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Param id path string true "ID"
|
||||||
|
// @Param request body CreateInput true "Data"
|
||||||
|
// @Success 200 {object} CadastroFotResponse
|
||||||
|
// @Router /api/cadastro-fot/{id} [put]
|
||||||
|
func (h *Handler) Update(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
var req CreateInput
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := h.service.Update(c.Request.Context(), id, req)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, toResponse(*res))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete godoc
|
||||||
|
// @Summary Delete FOT record
|
||||||
|
// @Tags cadastro_fot
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Param id path string true "ID"
|
||||||
|
// @Success 204
|
||||||
|
// @Router /api/cadastro-fot/{id} [delete]
|
||||||
|
func (h *Handler) Delete(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
err := h.service.Delete(c.Request.Context(), id)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusNoContent, nil)
|
||||||
|
}
|
||||||
112
backend/internal/cadastro_fot/service.go
Normal file
112
backend/internal/cadastro_fot/service.go
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
package cadastro_fot
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"photum-backend/internal/db/generated"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
queries *generated.Queries
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService(queries *generated.Queries) *Service {
|
||||||
|
return &Service{queries: queries}
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateInput struct {
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID string `json:"empresa_id"`
|
||||||
|
CursoID string `json:"curso_id"`
|
||||||
|
AnoFormaturaID string `json:"ano_formatura_id"`
|
||||||
|
Instituicao string `json:"instituicao"`
|
||||||
|
Cidade string `json:"cidade"`
|
||||||
|
Estado string `json:"estado"`
|
||||||
|
Observacoes string `json:"observacoes"`
|
||||||
|
GastosCaptacao float64 `json:"gastos_captacao"`
|
||||||
|
PreVenda bool `json:"pre_venda"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Create(ctx context.Context, input CreateInput) (*generated.CadastroFot, error) {
|
||||||
|
empresaUUID, _ := uuid.Parse(input.EmpresaID)
|
||||||
|
cursoUUID, _ := uuid.Parse(input.CursoID)
|
||||||
|
anoUUID, _ := uuid.Parse(input.AnoFormaturaID)
|
||||||
|
|
||||||
|
res, err := s.queries.CreateCadastroFot(ctx, generated.CreateCadastroFotParams{
|
||||||
|
Fot: input.Fot,
|
||||||
|
EmpresaID: pgtype.UUID{Bytes: empresaUUID, Valid: true},
|
||||||
|
CursoID: pgtype.UUID{Bytes: cursoUUID, Valid: true},
|
||||||
|
AnoFormaturaID: pgtype.UUID{Bytes: anoUUID, Valid: true},
|
||||||
|
Instituicao: pgtype.Text{String: input.Instituicao, Valid: true},
|
||||||
|
Cidade: pgtype.Text{String: input.Cidade, Valid: true},
|
||||||
|
Estado: pgtype.Text{String: input.Estado, Valid: true},
|
||||||
|
Observacoes: pgtype.Text{String: input.Observacoes, Valid: true},
|
||||||
|
GastosCaptacao: toPgNumeric(input.GastosCaptacao),
|
||||||
|
PreVenda: pgtype.Bool{Bool: input.PreVenda, Valid: true},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) List(ctx context.Context) ([]generated.ListCadastroFotRow, error) {
|
||||||
|
return s.queries.ListCadastroFot(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) GetByID(ctx context.Context, id string) (*generated.GetCadastroFotByIDRow, error) {
|
||||||
|
uuidVal, err := uuid.Parse(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("invalid id")
|
||||||
|
}
|
||||||
|
item, err := s.queries.GetCadastroFotByID(ctx, pgtype.UUID{Bytes: uuidVal, Valid: true})
|
||||||
|
return &item, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Update(ctx context.Context, id string, input CreateInput) (*generated.CadastroFot, error) {
|
||||||
|
uuidVal, err := uuid.Parse(id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("invalid id")
|
||||||
|
}
|
||||||
|
empresaUUID, _ := uuid.Parse(input.EmpresaID)
|
||||||
|
cursoUUID, _ := uuid.Parse(input.CursoID)
|
||||||
|
anoUUID, _ := uuid.Parse(input.AnoFormaturaID)
|
||||||
|
|
||||||
|
item, err := s.queries.UpdateCadastroFot(ctx, generated.UpdateCadastroFotParams{
|
||||||
|
ID: pgtype.UUID{Bytes: uuidVal, Valid: true},
|
||||||
|
Fot: input.Fot,
|
||||||
|
EmpresaID: pgtype.UUID{Bytes: empresaUUID, Valid: true},
|
||||||
|
CursoID: pgtype.UUID{Bytes: cursoUUID, Valid: true},
|
||||||
|
AnoFormaturaID: pgtype.UUID{Bytes: anoUUID, Valid: true},
|
||||||
|
Instituicao: pgtype.Text{String: input.Instituicao, Valid: true},
|
||||||
|
Cidade: pgtype.Text{String: input.Cidade, Valid: true},
|
||||||
|
Estado: pgtype.Text{String: input.Estado, Valid: true},
|
||||||
|
Observacoes: pgtype.Text{String: input.Observacoes, Valid: true},
|
||||||
|
GastosCaptacao: toPgNumeric(input.GastosCaptacao),
|
||||||
|
PreVenda: pgtype.Bool{Bool: input.PreVenda, Valid: true},
|
||||||
|
})
|
||||||
|
return &item, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Delete(ctx context.Context, id string) error {
|
||||||
|
uuidVal, err := uuid.Parse(id)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("invalid id")
|
||||||
|
}
|
||||||
|
return s.queries.DeleteCadastroFot(ctx, pgtype.UUID{Bytes: uuidVal, Valid: true})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper to convert float to numeric robustly
|
||||||
|
func toPgNumeric(f float64) pgtype.Numeric {
|
||||||
|
var n pgtype.Numeric
|
||||||
|
s := strconv.FormatFloat(f, 'f', -1, 64)
|
||||||
|
if err := n.Scan(s); err != nil {
|
||||||
|
return pgtype.Numeric{Valid: false}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
288
backend/internal/db/generated/cadastro_fot.sql.go
Normal file
288
backend/internal/db/generated/cadastro_fot.sql.go
Normal file
|
|
@ -0,0 +1,288 @@
|
||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.30.0
|
||||||
|
// source: cadastro_fot.sql
|
||||||
|
|
||||||
|
package generated
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
)
|
||||||
|
|
||||||
|
const createCadastroFot = `-- name: CreateCadastroFot :one
|
||||||
|
INSERT INTO cadastro_fot (
|
||||||
|
fot, empresa_id, curso_id, ano_formatura_id, instituicao, cidade, estado, observacoes, gastos_captacao, pre_venda
|
||||||
|
) VALUES (
|
||||||
|
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10
|
||||||
|
) RETURNING id, fot, empresa_id, curso_id, ano_formatura_id, instituicao, cidade, estado, observacoes, gastos_captacao, pre_venda, created_at, updated_at
|
||||||
|
`
|
||||||
|
|
||||||
|
type CreateCadastroFotParams struct {
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID pgtype.UUID `json:"empresa_id"`
|
||||||
|
CursoID pgtype.UUID `json:"curso_id"`
|
||||||
|
AnoFormaturaID pgtype.UUID `json:"ano_formatura_id"`
|
||||||
|
Instituicao pgtype.Text `json:"instituicao"`
|
||||||
|
Cidade pgtype.Text `json:"cidade"`
|
||||||
|
Estado pgtype.Text `json:"estado"`
|
||||||
|
Observacoes pgtype.Text `json:"observacoes"`
|
||||||
|
GastosCaptacao pgtype.Numeric `json:"gastos_captacao"`
|
||||||
|
PreVenda pgtype.Bool `json:"pre_venda"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) CreateCadastroFot(ctx context.Context, arg CreateCadastroFotParams) (CadastroFot, error) {
|
||||||
|
row := q.db.QueryRow(ctx, createCadastroFot,
|
||||||
|
arg.Fot,
|
||||||
|
arg.EmpresaID,
|
||||||
|
arg.CursoID,
|
||||||
|
arg.AnoFormaturaID,
|
||||||
|
arg.Instituicao,
|
||||||
|
arg.Cidade,
|
||||||
|
arg.Estado,
|
||||||
|
arg.Observacoes,
|
||||||
|
arg.GastosCaptacao,
|
||||||
|
arg.PreVenda,
|
||||||
|
)
|
||||||
|
var i CadastroFot
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Fot,
|
||||||
|
&i.EmpresaID,
|
||||||
|
&i.CursoID,
|
||||||
|
&i.AnoFormaturaID,
|
||||||
|
&i.Instituicao,
|
||||||
|
&i.Cidade,
|
||||||
|
&i.Estado,
|
||||||
|
&i.Observacoes,
|
||||||
|
&i.GastosCaptacao,
|
||||||
|
&i.PreVenda,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteCadastroFot = `-- name: DeleteCadastroFot :exec
|
||||||
|
DELETE FROM cadastro_fot WHERE id = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) DeleteCadastroFot(ctx context.Context, id pgtype.UUID) error {
|
||||||
|
_, err := q.db.Exec(ctx, deleteCadastroFot, id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCadastroFotByFOT = `-- name: GetCadastroFotByFOT :one
|
||||||
|
SELECT id, fot, empresa_id, curso_id, ano_formatura_id, instituicao, cidade, estado, observacoes, gastos_captacao, pre_venda, created_at, updated_at FROM cadastro_fot WHERE fot = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) GetCadastroFotByFOT(ctx context.Context, fot int32) (CadastroFot, error) {
|
||||||
|
row := q.db.QueryRow(ctx, getCadastroFotByFOT, fot)
|
||||||
|
var i CadastroFot
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Fot,
|
||||||
|
&i.EmpresaID,
|
||||||
|
&i.CursoID,
|
||||||
|
&i.AnoFormaturaID,
|
||||||
|
&i.Instituicao,
|
||||||
|
&i.Cidade,
|
||||||
|
&i.Estado,
|
||||||
|
&i.Observacoes,
|
||||||
|
&i.GastosCaptacao,
|
||||||
|
&i.PreVenda,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCadastroFotByID = `-- name: GetCadastroFotByID :one
|
||||||
|
SELECT
|
||||||
|
c.id, c.fot, c.empresa_id, c.curso_id, c.ano_formatura_id, c.instituicao, c.cidade, c.estado, c.observacoes, c.gastos_captacao, c.pre_venda, c.created_at, c.updated_at,
|
||||||
|
e.nome as empresa_nome,
|
||||||
|
cur.nome as curso_nome,
|
||||||
|
a.ano_semestre as ano_formatura_label
|
||||||
|
FROM cadastro_fot c
|
||||||
|
JOIN empresas e ON c.empresa_id = e.id
|
||||||
|
JOIN cursos cur ON c.curso_id = cur.id
|
||||||
|
JOIN anos_formaturas a ON c.ano_formatura_id = a.id
|
||||||
|
WHERE c.id = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
type GetCadastroFotByIDRow struct {
|
||||||
|
ID pgtype.UUID `json:"id"`
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID pgtype.UUID `json:"empresa_id"`
|
||||||
|
CursoID pgtype.UUID `json:"curso_id"`
|
||||||
|
AnoFormaturaID pgtype.UUID `json:"ano_formatura_id"`
|
||||||
|
Instituicao pgtype.Text `json:"instituicao"`
|
||||||
|
Cidade pgtype.Text `json:"cidade"`
|
||||||
|
Estado pgtype.Text `json:"estado"`
|
||||||
|
Observacoes pgtype.Text `json:"observacoes"`
|
||||||
|
GastosCaptacao pgtype.Numeric `json:"gastos_captacao"`
|
||||||
|
PreVenda pgtype.Bool `json:"pre_venda"`
|
||||||
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||||
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
||||||
|
EmpresaNome string `json:"empresa_nome"`
|
||||||
|
CursoNome string `json:"curso_nome"`
|
||||||
|
AnoFormaturaLabel string `json:"ano_formatura_label"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) GetCadastroFotByID(ctx context.Context, id pgtype.UUID) (GetCadastroFotByIDRow, error) {
|
||||||
|
row := q.db.QueryRow(ctx, getCadastroFotByID, id)
|
||||||
|
var i GetCadastroFotByIDRow
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Fot,
|
||||||
|
&i.EmpresaID,
|
||||||
|
&i.CursoID,
|
||||||
|
&i.AnoFormaturaID,
|
||||||
|
&i.Instituicao,
|
||||||
|
&i.Cidade,
|
||||||
|
&i.Estado,
|
||||||
|
&i.Observacoes,
|
||||||
|
&i.GastosCaptacao,
|
||||||
|
&i.PreVenda,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
&i.EmpresaNome,
|
||||||
|
&i.CursoNome,
|
||||||
|
&i.AnoFormaturaLabel,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const listCadastroFot = `-- name: ListCadastroFot :many
|
||||||
|
SELECT
|
||||||
|
c.id, c.fot, c.empresa_id, c.curso_id, c.ano_formatura_id, c.instituicao, c.cidade, c.estado, c.observacoes, c.gastos_captacao, c.pre_venda, c.created_at, c.updated_at,
|
||||||
|
e.nome as empresa_nome,
|
||||||
|
cur.nome as curso_nome,
|
||||||
|
a.ano_semestre as ano_formatura_label
|
||||||
|
FROM cadastro_fot c
|
||||||
|
JOIN empresas e ON c.empresa_id = e.id
|
||||||
|
JOIN cursos cur ON c.curso_id = cur.id
|
||||||
|
JOIN anos_formaturas a ON c.ano_formatura_id = a.id
|
||||||
|
ORDER BY c.fot DESC
|
||||||
|
`
|
||||||
|
|
||||||
|
type ListCadastroFotRow struct {
|
||||||
|
ID pgtype.UUID `json:"id"`
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID pgtype.UUID `json:"empresa_id"`
|
||||||
|
CursoID pgtype.UUID `json:"curso_id"`
|
||||||
|
AnoFormaturaID pgtype.UUID `json:"ano_formatura_id"`
|
||||||
|
Instituicao pgtype.Text `json:"instituicao"`
|
||||||
|
Cidade pgtype.Text `json:"cidade"`
|
||||||
|
Estado pgtype.Text `json:"estado"`
|
||||||
|
Observacoes pgtype.Text `json:"observacoes"`
|
||||||
|
GastosCaptacao pgtype.Numeric `json:"gastos_captacao"`
|
||||||
|
PreVenda pgtype.Bool `json:"pre_venda"`
|
||||||
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||||
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
||||||
|
EmpresaNome string `json:"empresa_nome"`
|
||||||
|
CursoNome string `json:"curso_nome"`
|
||||||
|
AnoFormaturaLabel string `json:"ano_formatura_label"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) ListCadastroFot(ctx context.Context) ([]ListCadastroFotRow, error) {
|
||||||
|
rows, err := q.db.Query(ctx, listCadastroFot)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var items []ListCadastroFotRow
|
||||||
|
for rows.Next() {
|
||||||
|
var i ListCadastroFotRow
|
||||||
|
if err := rows.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Fot,
|
||||||
|
&i.EmpresaID,
|
||||||
|
&i.CursoID,
|
||||||
|
&i.AnoFormaturaID,
|
||||||
|
&i.Instituicao,
|
||||||
|
&i.Cidade,
|
||||||
|
&i.Estado,
|
||||||
|
&i.Observacoes,
|
||||||
|
&i.GastosCaptacao,
|
||||||
|
&i.PreVenda,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
&i.EmpresaNome,
|
||||||
|
&i.CursoNome,
|
||||||
|
&i.AnoFormaturaLabel,
|
||||||
|
); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateCadastroFot = `-- name: UpdateCadastroFot :one
|
||||||
|
UPDATE cadastro_fot SET
|
||||||
|
fot = $2,
|
||||||
|
empresa_id = $3,
|
||||||
|
curso_id = $4,
|
||||||
|
ano_formatura_id = $5,
|
||||||
|
instituicao = $6,
|
||||||
|
cidade = $7,
|
||||||
|
estado = $8,
|
||||||
|
observacoes = $9,
|
||||||
|
gastos_captacao = $10,
|
||||||
|
pre_venda = $11,
|
||||||
|
updated_at = CURRENT_TIMESTAMP
|
||||||
|
WHERE id = $1
|
||||||
|
RETURNING id, fot, empresa_id, curso_id, ano_formatura_id, instituicao, cidade, estado, observacoes, gastos_captacao, pre_venda, created_at, updated_at
|
||||||
|
`
|
||||||
|
|
||||||
|
type UpdateCadastroFotParams struct {
|
||||||
|
ID pgtype.UUID `json:"id"`
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID pgtype.UUID `json:"empresa_id"`
|
||||||
|
CursoID pgtype.UUID `json:"curso_id"`
|
||||||
|
AnoFormaturaID pgtype.UUID `json:"ano_formatura_id"`
|
||||||
|
Instituicao pgtype.Text `json:"instituicao"`
|
||||||
|
Cidade pgtype.Text `json:"cidade"`
|
||||||
|
Estado pgtype.Text `json:"estado"`
|
||||||
|
Observacoes pgtype.Text `json:"observacoes"`
|
||||||
|
GastosCaptacao pgtype.Numeric `json:"gastos_captacao"`
|
||||||
|
PreVenda pgtype.Bool `json:"pre_venda"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) UpdateCadastroFot(ctx context.Context, arg UpdateCadastroFotParams) (CadastroFot, error) {
|
||||||
|
row := q.db.QueryRow(ctx, updateCadastroFot,
|
||||||
|
arg.ID,
|
||||||
|
arg.Fot,
|
||||||
|
arg.EmpresaID,
|
||||||
|
arg.CursoID,
|
||||||
|
arg.AnoFormaturaID,
|
||||||
|
arg.Instituicao,
|
||||||
|
arg.Cidade,
|
||||||
|
arg.Estado,
|
||||||
|
arg.Observacoes,
|
||||||
|
arg.GastosCaptacao,
|
||||||
|
arg.PreVenda,
|
||||||
|
)
|
||||||
|
var i CadastroFot
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Fot,
|
||||||
|
&i.EmpresaID,
|
||||||
|
&i.CursoID,
|
||||||
|
&i.AnoFormaturaID,
|
||||||
|
&i.Instituicao,
|
||||||
|
&i.Cidade,
|
||||||
|
&i.Estado,
|
||||||
|
&i.Observacoes,
|
||||||
|
&i.GastosCaptacao,
|
||||||
|
&i.PreVenda,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,22 @@ type AnosFormatura struct {
|
||||||
CriadoEm pgtype.Timestamptz `json:"criado_em"`
|
CriadoEm pgtype.Timestamptz `json:"criado_em"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CadastroFot struct {
|
||||||
|
ID pgtype.UUID `json:"id"`
|
||||||
|
Fot int32 `json:"fot"`
|
||||||
|
EmpresaID pgtype.UUID `json:"empresa_id"`
|
||||||
|
CursoID pgtype.UUID `json:"curso_id"`
|
||||||
|
AnoFormaturaID pgtype.UUID `json:"ano_formatura_id"`
|
||||||
|
Instituicao pgtype.Text `json:"instituicao"`
|
||||||
|
Cidade pgtype.Text `json:"cidade"`
|
||||||
|
Estado pgtype.Text `json:"estado"`
|
||||||
|
Observacoes pgtype.Text `json:"observacoes"`
|
||||||
|
GastosCaptacao pgtype.Numeric `json:"gastos_captacao"`
|
||||||
|
PreVenda pgtype.Bool `json:"pre_venda"`
|
||||||
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||||
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
||||||
type CadastroProfissionai struct {
|
type CadastroProfissionai struct {
|
||||||
ID pgtype.UUID `json:"id"`
|
ID pgtype.UUID `json:"id"`
|
||||||
UsuarioID pgtype.UUID `json:"usuario_id"`
|
UsuarioID pgtype.UUID `json:"usuario_id"`
|
||||||
|
|
|
||||||
52
backend/internal/db/queries/cadastro_fot.sql
Normal file
52
backend/internal/db/queries/cadastro_fot.sql
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
-- name: CreateCadastroFot :one
|
||||||
|
INSERT INTO cadastro_fot (
|
||||||
|
fot, empresa_id, curso_id, ano_formatura_id, instituicao, cidade, estado, observacoes, gastos_captacao, pre_venda
|
||||||
|
) VALUES (
|
||||||
|
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10
|
||||||
|
) RETURNING *;
|
||||||
|
|
||||||
|
-- name: ListCadastroFot :many
|
||||||
|
SELECT
|
||||||
|
c.*,
|
||||||
|
e.nome as empresa_nome,
|
||||||
|
cur.nome as curso_nome,
|
||||||
|
a.ano_semestre as ano_formatura_label
|
||||||
|
FROM cadastro_fot c
|
||||||
|
JOIN empresas e ON c.empresa_id = e.id
|
||||||
|
JOIN cursos cur ON c.curso_id = cur.id
|
||||||
|
JOIN anos_formaturas a ON c.ano_formatura_id = a.id
|
||||||
|
ORDER BY c.fot DESC;
|
||||||
|
|
||||||
|
-- name: GetCadastroFotByID :one
|
||||||
|
SELECT
|
||||||
|
c.*,
|
||||||
|
e.nome as empresa_nome,
|
||||||
|
cur.nome as curso_nome,
|
||||||
|
a.ano_semestre as ano_formatura_label
|
||||||
|
FROM cadastro_fot c
|
||||||
|
JOIN empresas e ON c.empresa_id = e.id
|
||||||
|
JOIN cursos cur ON c.curso_id = cur.id
|
||||||
|
JOIN anos_formaturas a ON c.ano_formatura_id = a.id
|
||||||
|
WHERE c.id = $1;
|
||||||
|
|
||||||
|
-- name: GetCadastroFotByFOT :one
|
||||||
|
SELECT * FROM cadastro_fot WHERE fot = $1;
|
||||||
|
|
||||||
|
-- name: UpdateCadastroFot :one
|
||||||
|
UPDATE cadastro_fot SET
|
||||||
|
fot = $2,
|
||||||
|
empresa_id = $3,
|
||||||
|
curso_id = $4,
|
||||||
|
ano_formatura_id = $5,
|
||||||
|
instituicao = $6,
|
||||||
|
cidade = $7,
|
||||||
|
estado = $8,
|
||||||
|
observacoes = $9,
|
||||||
|
gastos_captacao = $10,
|
||||||
|
pre_venda = $11,
|
||||||
|
updated_at = CURRENT_TIMESTAMP
|
||||||
|
WHERE id = $1
|
||||||
|
RETURNING *;
|
||||||
|
|
||||||
|
-- name: DeleteCadastroFot :exec
|
||||||
|
DELETE FROM cadastro_fot WHERE id = $1;
|
||||||
|
|
@ -145,6 +145,23 @@ CREATE TABLE IF NOT EXISTS precos_tipos_eventos (
|
||||||
UNIQUE(tipo_evento_id, funcao_profissional_id)
|
UNIQUE(tipo_evento_id, funcao_profissional_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- Cadastro FOT
|
||||||
|
CREATE TABLE IF NOT EXISTS cadastro_fot (
|
||||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
fot INTEGER NOT NULL UNIQUE,
|
||||||
|
empresa_id UUID NOT NULL REFERENCES empresas(id),
|
||||||
|
curso_id UUID NOT NULL REFERENCES cursos(id),
|
||||||
|
ano_formatura_id UUID NOT NULL REFERENCES anos_formaturas(id),
|
||||||
|
instituicao VARCHAR(255),
|
||||||
|
cidade VARCHAR(255),
|
||||||
|
estado VARCHAR(2),
|
||||||
|
observacoes TEXT,
|
||||||
|
gastos_captacao NUMERIC(10, 2),
|
||||||
|
pre_venda BOOLEAN,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
-- Seed Pricing Data
|
-- Seed Pricing Data
|
||||||
DO $$
|
DO $$
|
||||||
DECLARE
|
DECLARE
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue