322 lines
15 KiB
Go
322 lines
15 KiB
Go
package domain
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// Repository interfaces define data access contracts
|
|
|
|
// CustomerRepository defines methods for customer (mobile user) data access
|
|
type CustomerRepository interface {
|
|
Create(ctx context.Context, customer *Customer) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*Customer, error)
|
|
GetByEmail(ctx context.Context, email string) (*Customer, error)
|
|
Update(ctx context.Context, customer *Customer) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
List(ctx context.Context, limit, offset int) ([]*Customer, error)
|
|
GetByCompanyID(ctx context.Context, companyID uuid.UUID, limit, offset int) ([]*Customer, error)
|
|
UpdatePreferences(ctx context.Context, id uuid.UUID, preferences *CustomerPreferences) error
|
|
AddDeviceToken(ctx context.Context, id uuid.UUID, token string) error
|
|
RemoveDeviceToken(ctx context.Context, id uuid.UUID, token string) error
|
|
}
|
|
|
|
// UserRepository defines methods for panel user data access
|
|
type UserRepository interface {
|
|
Create(ctx context.Context, user *User) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*User, error)
|
|
GetByEmail(ctx context.Context, email string) (*User, error)
|
|
Update(ctx context.Context, user *User) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
List(ctx context.Context, limit, offset int) ([]*User, error)
|
|
GetByRole(ctx context.Context, role UserRole, limit, offset int) ([]*User, error)
|
|
UpdatePermissions(ctx context.Context, id uuid.UUID, permissions []string) error
|
|
}
|
|
|
|
// CompanyRepository defines methods for company data access
|
|
type CompanyRepository interface {
|
|
Create(ctx context.Context, company *Company) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*Company, error)
|
|
Update(ctx context.Context, company *Company) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
List(ctx context.Context, limit, offset int) ([]*Company, error)
|
|
UpdateInterests(ctx context.Context, id uuid.UUID, interests *InterestProfile) error
|
|
}
|
|
|
|
// TenderRepository defines methods for tender data access
|
|
type TenderRepository interface {
|
|
Create(ctx context.Context, tender *Tender) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*Tender, error)
|
|
Update(ctx context.Context, tender *Tender) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
List(ctx context.Context, filters TenderFilters, limit, offset int) ([]*Tender, error)
|
|
ListByStatus(ctx context.Context, status TenderStatus, limit, offset int) ([]*Tender, error)
|
|
Search(ctx context.Context, query string, filters TenderFilters, limit, offset int) ([]*Tender, error)
|
|
GetExpiringTenders(ctx context.Context, days int) ([]*Tender, error)
|
|
BulkCreate(ctx context.Context, tenders []*Tender) error
|
|
}
|
|
|
|
// TenderSourceRepository defines methods for tender source data access
|
|
type TenderSourceRepository interface {
|
|
Create(ctx context.Context, source *TenderSource) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*TenderSource, error)
|
|
Update(ctx context.Context, source *TenderSource) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
List(ctx context.Context, limit, offset int) ([]*TenderSource, error)
|
|
GetActiveources(ctx context.Context) ([]*TenderSource, error)
|
|
UpdateLastChecked(ctx context.Context, id uuid.UUID) error
|
|
}
|
|
|
|
// TenderMatchRepository defines methods for tender match data access
|
|
type TenderMatchRepository interface {
|
|
Create(ctx context.Context, match *TenderMatch) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*TenderMatch, error)
|
|
Update(ctx context.Context, match *TenderMatch) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
GetByCompany(ctx context.Context, companyID uuid.UUID, limit, offset int) ([]*TenderMatch, error)
|
|
GetByTender(ctx context.Context, tenderID uuid.UUID, limit, offset int) ([]*TenderMatch, error)
|
|
UpdateUserAction(ctx context.Context, id uuid.UUID, action *UserAction) error
|
|
BulkCreate(ctx context.Context, matches []*TenderMatch) error
|
|
}
|
|
|
|
// DocumentRepository defines methods for document data access
|
|
type DocumentRepository interface {
|
|
Create(ctx context.Context, document *Document) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*Document, error)
|
|
Update(ctx context.Context, document *Document) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
GetByCompany(ctx context.Context, companyID uuid.UUID) ([]*Document, error)
|
|
GetByCategory(ctx context.Context, companyID uuid.UUID, category string) ([]*Document, error)
|
|
}
|
|
|
|
// NotificationRepository defines methods for notification data access
|
|
type NotificationRepository interface {
|
|
Create(ctx context.Context, notification *Notification) error
|
|
GetByID(ctx context.Context, id uuid.UUID) (*Notification, error)
|
|
Update(ctx context.Context, notification *Notification) error
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
|
GetByUser(ctx context.Context, userID uuid.UUID, limit, offset int) ([]*Notification, error)
|
|
GetUnreadByUser(ctx context.Context, userID uuid.UUID) ([]*Notification, error)
|
|
MarkAsRead(ctx context.Context, id uuid.UUID) error
|
|
MarkAsSent(ctx context.Context, id uuid.UUID) error
|
|
}
|
|
|
|
// Service interfaces define business logic contracts
|
|
|
|
// CustomerAuthService defines authentication methods for mobile customers
|
|
type CustomerAuthService interface {
|
|
Register(ctx context.Context, req CustomerRegisterRequest) (*CustomerAuthResponse, error)
|
|
Login(ctx context.Context, req LoginRequest) (*CustomerAuthResponse, error)
|
|
RefreshToken(ctx context.Context, refreshToken string) (*CustomerAuthResponse, error)
|
|
ValidateToken(ctx context.Context, token string) (*Customer, error)
|
|
ChangePassword(ctx context.Context, customerID uuid.UUID, oldPassword, newPassword string) error
|
|
ResetPassword(ctx context.Context, email string) error
|
|
VerifyEmail(ctx context.Context, customerID uuid.UUID, token string) error
|
|
ResendVerification(ctx context.Context, email string) error
|
|
}
|
|
|
|
// UserAuthService defines authentication methods for panel users
|
|
type UserAuthService interface {
|
|
Login(ctx context.Context, req LoginRequest) (*UserAuthResponse, error)
|
|
RefreshToken(ctx context.Context, refreshToken string) (*UserAuthResponse, error)
|
|
ValidateToken(ctx context.Context, token string) (*User, error)
|
|
ChangePassword(ctx context.Context, userID uuid.UUID, oldPassword, newPassword string) error
|
|
CreatePanelUser(ctx context.Context, req CreateUserRequest, createdBy uuid.UUID) (*User, error)
|
|
UpdateUserPermissions(ctx context.Context, userID uuid.UUID, permissions []string, updatedBy uuid.UUID) error
|
|
}
|
|
|
|
// TenderService defines tender management methods
|
|
type TenderService interface {
|
|
GetTenders(ctx context.Context, filters TenderFilters, limit, offset int) ([]*Tender, error)
|
|
GetTenderByID(ctx context.Context, id uuid.UUID) (*Tender, error)
|
|
SearchTenders(ctx context.Context, query string, filters TenderFilters, limit, offset int) ([]*Tender, error)
|
|
GetTenderMatches(ctx context.Context, companyID uuid.UUID, limit, offset int) ([]*TenderMatch, error)
|
|
ProcessTenderAction(ctx context.Context, matchID uuid.UUID, action MatchStatus, customerID uuid.UUID) error
|
|
}
|
|
|
|
// CompanyService defines company management methods
|
|
type CompanyService interface {
|
|
CreateCompany(ctx context.Context, req CreateCompanyRequest) (*Company, error)
|
|
GetCompany(ctx context.Context, id uuid.UUID) (*Company, error)
|
|
UpdateCompany(ctx context.Context, id uuid.UUID, req UpdateCompanyRequest, updatedBy uuid.UUID) (*Company, error)
|
|
UpdateInterests(ctx context.Context, companyID uuid.UUID, interests *InterestProfile) error
|
|
UploadDocument(ctx context.Context, companyID uuid.UUID, req UploadDocumentRequest) (*Document, error)
|
|
GetDocuments(ctx context.Context, companyID uuid.UUID) ([]*Document, error)
|
|
}
|
|
|
|
// CustomerService defines customer management methods (for panel users)
|
|
type CustomerService interface {
|
|
GetCustomers(ctx context.Context, limit, offset int) ([]*Customer, error)
|
|
GetCustomerByID(ctx context.Context, id uuid.UUID) (*Customer, error)
|
|
GetCustomersByCompany(ctx context.Context, companyID uuid.UUID, limit, offset int) ([]*Customer, error)
|
|
UpdateCustomerStatus(ctx context.Context, customerID uuid.UUID, isActive bool, updatedBy uuid.UUID) error
|
|
UpdateCustomerPreferences(ctx context.Context, customerID uuid.UUID, preferences *CustomerPreferences) error
|
|
}
|
|
|
|
// ScrapingService defines tender scraping methods
|
|
type ScrapingService interface {
|
|
ScrapeTenderSource(ctx context.Context, sourceID uuid.UUID) error
|
|
ProcessTenderData(ctx context.Context, rawData []byte, sourceID uuid.UUID) ([]*Tender, error)
|
|
DownloadTenderDocuments(ctx context.Context, tenderID uuid.UUID) error
|
|
ScheduleScrapingJobs(ctx context.Context) error
|
|
}
|
|
|
|
// AIService defines AI and machine learning methods
|
|
type AIService interface {
|
|
GenerateEmbeddings(ctx context.Context, text string) ([]float32, error)
|
|
MatchTenders(ctx context.Context, companyID uuid.UUID) ([]*TenderMatch, error)
|
|
ExtractTenderRequirements(ctx context.Context, tenderID uuid.UUID) ([]*Requirement, error)
|
|
TranslateDocument(ctx context.Context, text, sourceLanguage, targetLanguage string) (string, error)
|
|
ClassifyTender(ctx context.Context, tender *Tender) ([]string, error)
|
|
ExtractKeywords(ctx context.Context, text string) ([]string, error)
|
|
}
|
|
|
|
// NotificationService defines notification methods
|
|
type NotificationService interface {
|
|
SendNotification(ctx context.Context, notification *Notification) error
|
|
SendBulkNotifications(ctx context.Context, notifications []*Notification) error
|
|
GetUserNotifications(ctx context.Context, userID uuid.UUID, limit, offset int) ([]*Notification, error)
|
|
MarkNotificationAsRead(ctx context.Context, id uuid.UUID) error
|
|
CreateTenderNotification(ctx context.Context, tender *Tender, companyIDs []uuid.UUID) error
|
|
}
|
|
|
|
// Cache interface defines caching methods
|
|
type CacheService interface {
|
|
Set(ctx context.Context, key string, value interface{}, ttl int) error
|
|
Get(ctx context.Context, key string, dest interface{}) error
|
|
Delete(ctx context.Context, key string) error
|
|
Exists(ctx context.Context, key string) (bool, error)
|
|
SetHash(ctx context.Context, key, field string, value interface{}) error
|
|
GetHash(ctx context.Context, key, field string, dest interface{}) error
|
|
}
|
|
|
|
// Queue interface defines message queue methods
|
|
type QueueService interface {
|
|
Publish(ctx context.Context, queue string, message interface{}) error
|
|
Subscribe(ctx context.Context, queue string, handler func([]byte) error) error
|
|
PublishDelayed(ctx context.Context, queue string, message interface{}, delay int) error
|
|
}
|
|
|
|
// Search interface defines search engine methods
|
|
type SearchService interface {
|
|
IndexTender(ctx context.Context, tender *Tender) error
|
|
SearchTenders(ctx context.Context, query string, filters map[string]interface{}, limit, offset int) ([]*Tender, error)
|
|
DeleteTender(ctx context.Context, tenderID uuid.UUID) error
|
|
BulkIndexTenders(ctx context.Context, tenders []*Tender) error
|
|
}
|
|
|
|
// DTOs and Request/Response types
|
|
|
|
// TenderFilters defines filters for tender queries
|
|
type TenderFilters struct {
|
|
Type *TenderType `json:"type,omitempty"`
|
|
Status *TenderStatus `json:"status,omitempty"`
|
|
CPVCodes []string `json:"cpv_codes,omitempty"`
|
|
Categories []string `json:"categories,omitempty"`
|
|
Region *string `json:"region,omitempty"`
|
|
Country *string `json:"country,omitempty"`
|
|
MinBudget *float64 `json:"min_budget,omitempty"`
|
|
MaxBudget *float64 `json:"max_budget,omitempty"`
|
|
Keywords []string `json:"keywords,omitempty"`
|
|
DateFrom *string `json:"date_from,omitempty"`
|
|
DateTo *string `json:"date_to,omitempty"`
|
|
}
|
|
|
|
// Customer Authentication DTOs
|
|
type CustomerRegisterRequest struct {
|
|
Email string `json:"email" validate:"required,email"`
|
|
Password string `json:"password" validate:"required,min=8"`
|
|
FirstName string `json:"first_name" validate:"required"`
|
|
LastName string `json:"last_name" validate:"required"`
|
|
Phone string `json:"phone"`
|
|
CompanyID string `json:"company_id,omitempty"` // Optional, will create new company if not provided
|
|
}
|
|
|
|
type CustomerAuthResponse struct {
|
|
Customer *Customer `json:"customer"`
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
ExpiresIn int64 `json:"expires_in"`
|
|
}
|
|
|
|
// Panel User Authentication DTOs
|
|
type CreateUserRequest struct {
|
|
Email string `json:"email" validate:"required,email"`
|
|
Password string `json:"password" validate:"required,min=8"`
|
|
FirstName string `json:"first_name" validate:"required"`
|
|
LastName string `json:"last_name" validate:"required"`
|
|
Role UserRole `json:"role" validate:"required"`
|
|
Department string `json:"department"`
|
|
Permissions []string `json:"permissions"`
|
|
}
|
|
|
|
type UserAuthResponse struct {
|
|
User *User `json:"user"`
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
ExpiresIn int64 `json:"expires_in"`
|
|
}
|
|
|
|
// Shared Authentication DTOs
|
|
type LoginRequest struct {
|
|
Email string `json:"email" validate:"required,email"`
|
|
Password string `json:"password" validate:"required"`
|
|
}
|
|
|
|
// RegisterRequest defines user registration request (kept for backward compatibility)
|
|
type RegisterRequest struct {
|
|
Email string `json:"email" validate:"required,email"`
|
|
Password string `json:"password" validate:"required,min=8"`
|
|
FirstName string `json:"first_name" validate:"required"`
|
|
LastName string `json:"last_name" validate:"required"`
|
|
CompanyID string `json:"company_id,omitempty"`
|
|
}
|
|
|
|
// AuthResponse defines authentication response (kept for backward compatibility)
|
|
type AuthResponse struct {
|
|
User *User `json:"user,omitempty"`
|
|
Customer *Customer `json:"customer,omitempty"`
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
ExpiresIn int64 `json:"expires_in"`
|
|
}
|
|
|
|
// CreateCompanyRequest defines company creation request
|
|
type CreateCompanyRequest struct {
|
|
Name string `json:"name" validate:"required"`
|
|
Description string `json:"description"`
|
|
Industry string `json:"industry" validate:"required"`
|
|
Country string `json:"country" validate:"required"`
|
|
Website string `json:"website"`
|
|
Keywords []string `json:"keywords"`
|
|
Products []string `json:"products"`
|
|
Services []string `json:"services"`
|
|
}
|
|
|
|
// UpdateCompanyRequest defines company update request
|
|
type UpdateCompanyRequest struct {
|
|
Name *string `json:"name,omitempty"`
|
|
Description *string `json:"description,omitempty"`
|
|
Industry *string `json:"industry,omitempty"`
|
|
Country *string `json:"country,omitempty"`
|
|
Website *string `json:"website,omitempty"`
|
|
Keywords []string `json:"keywords,omitempty"`
|
|
Products []string `json:"products,omitempty"`
|
|
Services []string `json:"services,omitempty"`
|
|
Capabilities []string `json:"capabilities,omitempty"`
|
|
}
|
|
|
|
// UploadDocumentRequest defines document upload request
|
|
type UploadDocumentRequest struct {
|
|
Name string `json:"name" validate:"required"`
|
|
Type DocumentType `json:"type" validate:"required"`
|
|
Category string `json:"category" validate:"required"`
|
|
Description string `json:"description"`
|
|
FilePath string `json:"file_path" validate:"required"`
|
|
Size int64 `json:"size"`
|
|
ContentType string `json:"content_type"`
|
|
ExpiryDate *string `json:"expiry_date,omitempty"`
|
|
Keywords []string `json:"keywords"`
|
|
}
|