Compare commits

..

No commits in common. "0379ea4ae4e9b22ec86ae034e9c15b6fb5836e3f" and "c3162756ad9b0cea1253bd1864d84d2163abae7e" have entirely different histories.

14 changed files with 396 additions and 713 deletions

View File

@ -1,6 +1,6 @@
# Time Tracker Backend Makefile # Time Tracker Backend Makefile
.PHONY: db-start db-stop db-test model-test run build clean migrate seed swagger help .PHONY: db-start db-stop db-test model-test run build clean migrate seed help
# Default target # Default target
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
@ -25,9 +25,7 @@ help:
@echo " make seed - Seed the database with initial data" @echo " make seed - Seed the database with initial data"
@echo " make db-drop-users - Drop the users table" @echo " make db-drop-users - Drop the users table"
@echo " make db-reinit - Re-initialize the database" @echo " make db-reinit - Re-initialize the database"
@echo " make swagger - Generate swagger documentation"
@echo " make help - Show this help message" @echo " make help - Show this help message"
@echo "" make generate-ts - Generate TypeScript types
# Start the database # Start the database
db-start: db-start:
@ -90,15 +88,21 @@ db-drop-users:
db-reinit: db-reinit:
@echo "Re-initializing the database..." @echo "Re-initializing the database..."
@PG_HOST=$(DB_HOST) PG_PORT=$(DB_PORT) PG_USER=$(DB_USER) PG_PASSWORD=$(DB_PASSWORD) PG_DBNAME=$(DB_NAME) go run cmd/migrate/main.go -create_db -drop_db @PG_HOST=$(DB_HOST) PG_PORT=$(DB_PORT) PG_USER=$(DB_USER) PG_PASSWORD=$(DB_PASSWORD) PG_DBNAME=$(DB_NAME) go run cmd/migrate/main.go -create_db -drop_db
# Generate swagger documentation @echo "Database re-initialized"
swagger:
@echo "Generating swagger documentation..."
@swag init -g cmd/api/main.go
@echo "Swagger documentation generated"
# Generate TypeScript types
generate-ts:
@echo "Generating TypeScript types..."
@tygo generate
@echo "TypeScript types generated"
help:
@echo "Time Tracker Backend Makefile"
@echo ""
@echo "Usage:"
@echo " make db-start - Start the PostgreSQL database container"
@echo " make db-stop - Stop the PostgreSQL database container"
@echo " make db-test - Test the database connection"
@echo " make model-test - Test the database models"
@echo " make run - Run the application"
@echo " make build - Build the application"
@echo " make clean - Remove build artifacts"
@echo " make migrate - Run database migrations"
@echo " make seed - Seed the database with initial data"
@echo " make db-drop-users - Drop the users table"
@echo " make db-reinit - Re-initialize the database"
@echo " make help - Show this help message"

View File

@ -4112,12 +4112,10 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
} }
} }
}, },
@ -4125,28 +4123,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "a1b2c3d4e5f6"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "u1v2w3x4y5z6"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4154,28 +4146,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "a1b2c3d4e5f6"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "u1v2w3x4y5z6"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4183,8 +4169,7 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
} }
} }
}, },
@ -4192,24 +4177,19 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4217,24 +4197,19 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4242,12 +4217,10 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
} }
} }
}, },
@ -4255,28 +4228,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4284,28 +4251,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4313,12 +4274,10 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"email": { "email": {
"type": "string", "type": "string"
"example": "admin@example.com"
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "Admin@123456"
} }
} }
}, },
@ -4326,12 +4285,10 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
} }
} }
}, },
@ -4339,28 +4296,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4368,28 +4319,22 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4397,33 +4342,26 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4431,49 +4369,38 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4481,49 +4408,38 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4531,8 +4447,7 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"token": { "token": {
"type": "string", "type": "string"
"example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}, },
"user": { "user": {
"$ref": "#/definitions/dto.UserDto" "$ref": "#/definitions/dto.UserDto"
@ -4543,24 +4458,19 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "password123"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
} }
} }
}, },
@ -4568,36 +4478,28 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4605,40 +4507,31 @@ const docTemplate = `{
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "password123"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },

View File

@ -4106,12 +4106,10 @@
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
} }
} }
}, },
@ -4119,28 +4117,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "a1b2c3d4e5f6"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "u1v2w3x4y5z6"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4148,28 +4140,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"billingRate": { "billingRate": {
"type": "number", "type": "number"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "a1b2c3d4e5f6"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "u1v2w3x4y5z6"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Development"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4177,8 +4163,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
} }
} }
}, },
@ -4186,24 +4171,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4211,24 +4191,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Acme Corp"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4236,12 +4211,10 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
} }
} }
}, },
@ -4249,28 +4222,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4278,28 +4245,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "John Doe"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4307,12 +4268,10 @@
"type": "object", "type": "object",
"properties": { "properties": {
"email": { "email": {
"type": "string", "type": "string"
"example": "admin@example.com"
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "Admin@123456"
} }
} }
}, },
@ -4320,12 +4279,10 @@
"type": "object", "type": "object",
"properties": { "properties": {
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
} }
} }
}, },
@ -4333,28 +4290,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4362,28 +4313,22 @@
"type": "object", "type": "object",
"properties": { "properties": {
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"customerId": { "customerId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"name": { "name": {
"type": "string", "type": "string"
"example": "Time Tracking App"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4391,33 +4336,26 @@
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4425,49 +4363,38 @@
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4475,49 +4402,38 @@
"type": "object", "type": "object",
"properties": { "properties": {
"activityId": { "activityId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"billable": { "billable": {
"description": "Percentage (0-100)", "description": "Percentage (0-100)",
"type": "integer", "type": "integer"
"example": 100
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"description": { "description": {
"type": "string", "type": "string"
"example": "Working on the Time Tracking App"
}, },
"end": { "end": {
"type": "string", "type": "string"
"example": "2024-01-01T17:00:00Z"
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"projectId": { "projectId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"start": { "start": {
"type": "string", "type": "string"
"example": "2024-01-01T08:00:00Z"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"userId": { "userId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
} }
} }
}, },
@ -4525,8 +4441,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"token": { "token": {
"type": "string", "type": "string"
"example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}, },
"user": { "user": {
"$ref": "#/definitions/dto.UserDto" "$ref": "#/definitions/dto.UserDto"
@ -4537,24 +4452,19 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "password123"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
} }
} }
}, },
@ -4562,36 +4472,28 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },
@ -4599,40 +4501,31 @@
"type": "object", "type": "object",
"properties": { "properties": {
"companyId": { "companyId": {
"type": "string", "type": "integer"
"example": "01HGW2BBG0000000000000000"
}, },
"createdAt": { "createdAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
}, },
"email": { "email": {
"type": "string", "type": "string"
"example": "test@example.com"
}, },
"hourlyRate": { "hourlyRate": {
"type": "number", "type": "number"
"example": 50
}, },
"id": { "id": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"lastEditorID": { "lastEditorID": {
"type": "string", "type": "string"
"example": "01HGW2BBG0000000000000000"
}, },
"password": { "password": {
"type": "string", "type": "string"
"example": "password123"
}, },
"role": { "role": {
"type": "string", "type": "string"
"example": "admin"
}, },
"updatedAt": { "updatedAt": {
"type": "string", "type": "string"
"example": "2024-01-01T00:00:00Z"
} }
} }
}, },

View File

@ -3,310 +3,225 @@ definitions:
dto.ActivityCreateDto: dto.ActivityCreateDto:
properties: properties:
billingRate: billingRate:
example: 100
type: number type: number
name: name:
example: Development
type: string type: string
type: object type: object
dto.ActivityDto: dto.ActivityDto:
properties: properties:
billingRate: billingRate:
example: 100
type: number type: number
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: a1b2c3d4e5f6
type: string type: string
lastEditorID: lastEditorID:
example: u1v2w3x4y5z6
type: string type: string
name: name:
example: Development
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.ActivityUpdateDto: dto.ActivityUpdateDto:
properties: properties:
billingRate: billingRate:
example: 100
type: number type: number
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: a1b2c3d4e5f6
type: string type: string
lastEditorID: lastEditorID:
example: u1v2w3x4y5z6
type: string type: string
name: name:
example: Development
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.CompanyCreateDto: dto.CompanyCreateDto:
properties: properties:
name: name:
example: Acme Corp
type: string type: string
type: object type: object
dto.CompanyDto: dto.CompanyDto:
properties: properties:
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: Acme Corp
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.CompanyUpdateDto: dto.CompanyUpdateDto:
properties: properties:
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: Acme Corp
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.CustomerCreateDto: dto.CustomerCreateDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
name: name:
example: John Doe
type: string type: string
type: object type: object
dto.CustomerDto: dto.CustomerDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: John Doe
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.CustomerUpdateDto: dto.CustomerUpdateDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: John Doe
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.LoginDto: dto.LoginDto:
properties: properties:
email: email:
example: admin@example.com
type: string type: string
password: password:
example: Admin@123456
type: string type: string
type: object type: object
dto.ProjectCreateDto: dto.ProjectCreateDto:
properties: properties:
customerId: customerId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
name: name:
example: Time Tracking App
type: string type: string
type: object type: object
dto.ProjectDto: dto.ProjectDto:
properties: properties:
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
customerId: customerId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: Time Tracking App
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.ProjectUpdateDto: dto.ProjectUpdateDto:
properties: properties:
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
customerId: customerId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
name: name:
example: Time Tracking App
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.TimeEntryCreateDto: dto.TimeEntryCreateDto:
properties: properties:
activityId: activityId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
billable: billable:
description: Percentage (0-100) description: Percentage (0-100)
example: 100
type: integer type: integer
description: description:
example: Working on the Time Tracking App
type: string type: string
end: end:
example: "2024-01-01T17:00:00Z"
type: string type: string
projectId: projectId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
start: start:
example: "2024-01-01T08:00:00Z"
type: string type: string
userId: userId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
type: object type: object
dto.TimeEntryDto: dto.TimeEntryDto:
properties: properties:
activityId: activityId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
billable: billable:
description: Percentage (0-100) description: Percentage (0-100)
example: 100
type: integer type: integer
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
description: description:
example: Working on the Time Tracking App
type: string type: string
end: end:
example: "2024-01-01T17:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
projectId: projectId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
start: start:
example: "2024-01-01T08:00:00Z"
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
userId: userId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
type: object type: object
dto.TimeEntryUpdateDto: dto.TimeEntryUpdateDto:
properties: properties:
activityId: activityId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
billable: billable:
description: Percentage (0-100) description: Percentage (0-100)
example: 100
type: integer type: integer
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
description: description:
example: Working on the Time Tracking App
type: string type: string
end: end:
example: "2024-01-01T17:00:00Z"
type: string type: string
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
projectId: projectId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
start: start:
example: "2024-01-01T08:00:00Z"
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
userId: userId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
type: object type: object
dto.TokenDto: dto.TokenDto:
properties: properties:
token: token:
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
type: string type: string
user: user:
$ref: '#/definitions/dto.UserDto' $ref: '#/definitions/dto.UserDto'
@ -314,76 +229,54 @@ definitions:
dto.UserCreateDto: dto.UserCreateDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
email: email:
example: test@example.com
type: string type: string
hourlyRate: hourlyRate:
example: 50
type: number type: number
password: password:
example: password123
type: string type: string
role: role:
example: admin
type: string type: string
type: object type: object
dto.UserDto: dto.UserDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
email: email:
example: test@example.com
type: string type: string
hourlyRate: hourlyRate:
example: 50
type: number type: number
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
role: role:
example: admin
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
dto.UserUpdateDto: dto.UserUpdateDto:
properties: properties:
companyId: companyId:
example: 01HGW2BBG0000000000000000 type: integer
type: string
createdAt: createdAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
email: email:
example: test@example.com
type: string type: string
hourlyRate: hourlyRate:
example: 50
type: number type: number
id: id:
example: 01HGW2BBG0000000000000000
type: string type: string
lastEditorID: lastEditorID:
example: 01HGW2BBG0000000000000000
type: string type: string
password: password:
example: password123
type: string type: string
role: role:
example: admin
type: string type: string
updatedAt: updatedAt:
example: "2024-01-01T00:00:00Z"
type: string type: string
type: object type: object
utils.ErrorInfo: utils.ErrorInfo:

View File

@ -5,24 +5,24 @@ import (
) )
type ActivityDto struct { type ActivityDto struct {
ID string `json:"id" example:"a1b2c3d4e5f6"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"u1v2w3x4y5z6"` LastEditorID string `json:"lastEditorID"`
Name string `json:"name" example:"Development"` Name string `json:"name"`
BillingRate float64 `json:"billingRate" example:"100.00"` BillingRate float64 `json:"billingRate"`
} }
type ActivityCreateDto struct { type ActivityCreateDto struct {
Name string `json:"name" example:"Development"` Name string `json:"name"`
BillingRate float64 `json:"billingRate" example:"100.00"` BillingRate float64 `json:"billingRate"`
} }
type ActivityUpdateDto struct { type ActivityUpdateDto struct {
ID string `json:"id" example:"a1b2c3d4e5f6"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"u1v2w3x4y5z6"` LastEditorID *string `json:"lastEditorID"`
Name *string `json:"name" example:"Development"` Name *string `json:"name"`
BillingRate *float64 `json:"billingRate" example:"100.00"` BillingRate *float64 `json:"billingRate"`
} }

View File

@ -2,12 +2,12 @@ package dto
// LoginDto represents the login request // LoginDto represents the login request
type LoginDto struct { type LoginDto struct {
Email string `json:"email" example:"admin@example.com"` Email string `json:"email"`
Password string `json:"password" example:"Admin@123456"` Password string `json:"password"`
} }
// TokenDto represents the response after successful authentication // TokenDto represents the response after successful authentication
type TokenDto struct { type TokenDto struct {
Token string `json:"token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"` Token string `json:"token"`
User UserDto `json:"user"` User UserDto `json:"user"`
} }

View File

@ -5,21 +5,21 @@ import (
) )
type CompanyDto struct { type CompanyDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID string `json:"lastEditorID"`
Name string `json:"name" example:"Acme Corp"` Name string `json:"name"`
} }
type CompanyCreateDto struct { type CompanyCreateDto struct {
Name string `json:"name" example:"Acme Corp"` Name string `json:"name"`
} }
type CompanyUpdateDto struct { type CompanyUpdateDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID *string `json:"lastEditorID"`
Name *string `json:"name" example:"Acme Corp"` Name *string `json:"name"`
} }

View File

@ -5,24 +5,24 @@ import (
) )
type CustomerDto struct { type CustomerDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID string `json:"lastEditorID"`
Name string `json:"name" example:"John Doe"` Name string `json:"name"`
CompanyID string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID string `json:"companyId"`
} }
type CustomerCreateDto struct { type CustomerCreateDto struct {
Name string `json:"name" example:"John Doe"` Name string `json:"name"`
CompanyID string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID string `json:"companyId"`
} }
type CustomerUpdateDto struct { type CustomerUpdateDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID *string `json:"lastEditorID"`
Name *string `json:"name" example:"John Doe"` Name *string `json:"name"`
CompanyID *string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID *string `json:"companyId"`
} }

View File

@ -5,24 +5,24 @@ import (
) )
type ProjectDto struct { type ProjectDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID string `json:"lastEditorID"`
Name string `json:"name" example:"Time Tracking App"` Name string `json:"name"`
CustomerID string `json:"customerId" example:"01HGW2BBG0000000000000000"` CustomerID string `json:"customerId"`
} }
type ProjectCreateDto struct { type ProjectCreateDto struct {
Name string `json:"name" example:"Time Tracking App"` Name string `json:"name"`
CustomerID string `json:"customerId" example:"01HGW2BBG0000000000000000"` CustomerID string `json:"customerId"`
} }
type ProjectUpdateDto struct { type ProjectUpdateDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID *string `json:"lastEditorID"`
Name *string `json:"name" example:"Time Tracking App"` Name *string `json:"name"`
CustomerID *string `json:"customerId" example:"01HGW2BBG0000000000000000"` CustomerID *string `json:"customerId"`
} }

View File

@ -5,39 +5,39 @@ import (
) )
type TimeEntryDto struct { type TimeEntryDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID string `json:"lastEditorID"`
UserID string `json:"userId" example:"01HGW2BBG0000000000000000"` UserID string `json:"userId"`
ProjectID string `json:"projectId" example:"01HGW2BBG0000000000000000"` ProjectID string `json:"projectId"`
ActivityID string `json:"activityId" example:"01HGW2BBG0000000000000000"` ActivityID string `json:"activityId"`
Start time.Time `json:"start" example:"2024-01-01T08:00:00Z"` Start time.Time `json:"start"`
End time.Time `json:"end" example:"2024-01-01T17:00:00Z"` End time.Time `json:"end"`
Description string `json:"description" example:"Working on the Time Tracking App"` Description string `json:"description"`
Billable int `json:"billable" example:"100"` // Percentage (0-100) Billable int `json:"billable"` // Percentage (0-100)
} }
type TimeEntryCreateDto struct { type TimeEntryCreateDto struct {
UserID string `json:"userId" example:"01HGW2BBG0000000000000000"` UserID string `json:"userId"`
ProjectID string `json:"projectId" example:"01HGW2BBG0000000000000000"` ProjectID string `json:"projectId"`
ActivityID string `json:"activityId" example:"01HGW2BBG0000000000000000"` ActivityID string `json:"activityId"`
Start time.Time `json:"start" example:"2024-01-01T08:00:00Z"` Start time.Time `json:"start"`
End time.Time `json:"end" example:"2024-01-01T17:00:00Z"` End time.Time `json:"end"`
Description string `json:"description" example:"Working on the Time Tracking App"` Description string `json:"description"`
Billable int `json:"billable" example:"100"` // Percentage (0-100) Billable int `json:"billable"` // Percentage (0-100)
} }
type TimeEntryUpdateDto struct { type TimeEntryUpdateDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID *string `json:"lastEditorID"`
UserID *string `json:"userId" example:"01HGW2BBG0000000000000000"` UserID *string `json:"userId"`
ProjectID *string `json:"projectId" example:"01HGW2BBG0000000000000000"` ProjectID *string `json:"projectId"`
ActivityID *string `json:"activityId" example:"01HGW2BBG0000000000000000"` ActivityID *string `json:"activityId"`
Start *time.Time `json:"start" example:"2024-01-01T08:00:00Z"` Start *time.Time `json:"start"`
End *time.Time `json:"end" example:"2024-01-01T17:00:00Z"` End *time.Time `json:"end"`
Description *string `json:"description" example:"Working on the Time Tracking App"` Description *string `json:"description"`
Billable *int `json:"billable" example:"100"` // Percentage (0-100) Billable *int `json:"billable"` // Percentage (0-100)
} }

View File

@ -5,32 +5,32 @@ import (
) )
type UserDto struct { type UserDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updatedAt"`
LastEditorID string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID string `json:"lastEditorID"`
Email string `json:"email" example:"test@example.com"` Email string `json:"email"`
Role string `json:"role" example:"admin"` Role string `json:"role"`
CompanyID string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID string `json:"companyId"`
HourlyRate float64 `json:"hourlyRate" example:"50.00"` HourlyRate float64 `json:"hourlyRate"`
} }
type UserCreateDto struct { type UserCreateDto struct {
Email string `json:"email" example:"test@example.com"` Email string `json:"email"`
Password string `json:"password" example:"password123"` Password string `json:"password"`
Role string `json:"role" example:"admin"` Role string `json:"role"`
CompanyID string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID string `json:"companyId"`
HourlyRate float64 `json:"hourlyRate" example:"50.00"` HourlyRate float64 `json:"hourlyRate"`
} }
type UserUpdateDto struct { type UserUpdateDto struct {
ID string `json:"id" example:"01HGW2BBG0000000000000000"` ID string `json:"id"`
CreatedAt *time.Time `json:"createdAt" example:"2024-01-01T00:00:00Z"` CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt" example:"2024-01-01T00:00:00Z"` UpdatedAt *time.Time `json:"updatedAt"`
LastEditorID *string `json:"lastEditorID" example:"01HGW2BBG0000000000000000"` LastEditorID *string `json:"lastEditorID"`
Email *string `json:"email" example:"test@example.com"` Email *string `json:"email"`
Password *string `json:"password" example:"password123"` Password *string `json:"password"`
Role *string `json:"role" example:"admin"` Role *string `json:"role"`
CompanyID *string `json:"companyId" example:"01HGW2BBG0000000000000000"` CompanyID *string `json:"companyId"`
HourlyRate *float64 `json:"hourlyRate" example:"50.00"` HourlyRate *float64 `json:"hourlyRate"`
} }

View File

@ -1,5 +1,5 @@
packages: packages:
- path: github.com/timetracker/backend/internal/dtos - path: github.com/timetracker/backend/dto
type_mappings: type_mappings:
"time.Time": "string" "time.Time": "string"
"ulid.ULID": "string" "ulid.ULID": "string"

17
docu/deployment_devops.md Normal file
View File

@ -0,0 +1,17 @@
# Deployment and DevOps
## Containerization
- Docker containers for backend and frontend
- Docker Compose for development environment
- Kubernetes manifests for production environment
## CI/CD Pipeline
- Automated tests (Unit, Integration, E2E)
- Automated deployment
- Version management
## Monitoring and Logging
- Prometheus for metrics
- Grafana for visualization
- ELK Stack or similar for logging
- Alerting for critical events

View File

@ -24,24 +24,6 @@ export interface ActivityUpdateDto {
billingRate?: number /* float64 */; billingRate?: number /* float64 */;
} }
//////////
// source: auth_dto.go
/**
* LoginDto represents the login request
*/
export interface LoginDto {
email: string;
password: string;
}
/**
* TokenDto represents the response after successful authentication
*/
export interface TokenDto {
token: string;
user: UserDto;
}
////////// //////////
// source: company_dto.go // source: company_dto.go
@ -72,11 +54,11 @@ export interface CustomerDto {
updatedAt: string; updatedAt: string;
lastEditorID: string; lastEditorID: string;
name: string; name: string;
companyId: string; companyId: number /* int */;
} }
export interface CustomerCreateDto { export interface CustomerCreateDto {
name: string; name: string;
companyId: string; companyId: number /* int */;
} }
export interface CustomerUpdateDto { export interface CustomerUpdateDto {
id: string; id: string;
@ -84,7 +66,7 @@ export interface CustomerUpdateDto {
updatedAt?: string; updatedAt?: string;
lastEditorID?: string; lastEditorID?: string;
name?: string; name?: string;
companyId?: string; companyId?: number /* int */;
} }
////////// //////////
@ -96,11 +78,11 @@ export interface ProjectDto {
updatedAt: string; updatedAt: string;
lastEditorID: string; lastEditorID: string;
name: string; name: string;
customerId: string; customerId: number /* int */;
} }
export interface ProjectCreateDto { export interface ProjectCreateDto {
name: string; name: string;
customerId: string; customerId: number /* int */;
} }
export interface ProjectUpdateDto { export interface ProjectUpdateDto {
id: string; id: string;
@ -108,7 +90,7 @@ export interface ProjectUpdateDto {
updatedAt?: string; updatedAt?: string;
lastEditorID?: string; lastEditorID?: string;
name?: string; name?: string;
customerId?: string; customerId?: number /* int */;
} }
////////// //////////
@ -119,18 +101,18 @@ export interface TimeEntryDto {
createdAt: string; createdAt: string;
updatedAt: string; updatedAt: string;
lastEditorID: string; lastEditorID: string;
userId: string; userId: number /* int */;
projectId: string; projectId: number /* int */;
activityId: string; activityId: number /* int */;
start: string; start: string;
end: string; end: string;
description: string; description: string;
billable: number /* int */; // Percentage (0-100) billable: number /* int */; // Percentage (0-100)
} }
export interface TimeEntryCreateDto { export interface TimeEntryCreateDto {
userId: string; userId: number /* int */;
projectId: string; projectId: number /* int */;
activityId: string; activityId: number /* int */;
start: string; start: string;
end: string; end: string;
description: string; description: string;
@ -141,9 +123,9 @@ export interface TimeEntryUpdateDto {
createdAt?: string; createdAt?: string;
updatedAt?: string; updatedAt?: string;
lastEditorID?: string; lastEditorID?: string;
userId?: string; userId?: number /* int */;
projectId?: string; projectId?: number /* int */;
activityId?: string; activityId?: number /* int */;
start?: string; start?: string;
end?: string; end?: string;
description?: string; description?: string;
@ -159,15 +141,16 @@ export interface UserDto {
updatedAt: string; updatedAt: string;
lastEditorID: string; lastEditorID: string;
email: string; email: string;
password: string; // Note: In a real application, you would NEVER send the password in a DTO. This is just for demonstration.
role: string; role: string;
companyId: string; companyId: number /* int */;
hourlyRate: number /* float64 */; hourlyRate: number /* float64 */;
} }
export interface UserCreateDto { export interface UserCreateDto {
email: string; email: string;
password: string; password: string; // Note: In a real application, you would NEVER send the password in a DTO. This is just for demonstration.
role: string; role: string;
companyId: string; companyId: number /* int */;
hourlyRate: number /* float64 */; hourlyRate: number /* float64 */;
} }
export interface UserUpdateDto { export interface UserUpdateDto {
@ -176,8 +159,8 @@ export interface UserUpdateDto {
updatedAt?: string; updatedAt?: string;
lastEditorID?: string; lastEditorID?: string;
email?: string; email?: string;
password?: string; password?: string; // Note: In a real application, you would NEVER send the password in a DTO. This is just for demonstration.
role?: string; role?: string;
companyId?: string; companyId?: number /* int */;
hourlyRate?: number /* float64 */; hourlyRate?: number /* float64 */;
} }