Код стиля кодирования gqlgen тесно связан с neo4j golang.
Я только начинаю привыкать к gqlgen для создания API-интерфейса graphql на основе golang для личного проекта, над которым я работаю. Это моя первая попытка добавить пользовательский узел в БД, код работает (это заняло некоторое время, я новичок в neo4j и graphql).
Моя проблема в том, что он кажется очень связанным с БД, мой стиль кодирования заключался бы в том, чтобы абстрагировать операции БД от этого кода. Я не чувствую себя достаточно опытным, чтобы достичь этого, поэтому я ищу совет, чтобы улучшить, прежде чем перейти к дальнейшему программированию. У меня более 25 лет опыта работы с разными языками SQL, C++, PHP, Basic, Java, Javascript, Pascal и т. д., поэтому я доволен программированием и базами данных (не так много графовых баз данных).
Код со schema.resolvers.go
// UpsertUser adds or updates a user in the system
func (r *mutationResolver) UpsertUser(ctx context.Context, input model.UserInput) (*model.User, error) {
// Update or insert?
var userId string
if input.ID != nil {
userId = *input.ID
} else {
newUuid, err := uuid.NewV4() // Create a Version 4 UUID.
if err != nil {
return nil, fmt.Errorf("UUID creation error %v", err)
}
userId = newUuid.String()
}
// Open session
session := r.DbDriver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
defer func(session neo4j.Session) {
err := session.Close()
if err != nil {
}
}(session)
// Start write data to neo4j
neo4jWriteResult, neo4jWriteErr := session.WriteTransaction(
func(transaction neo4j.Transaction) (interface{}, error) {
transactionResult, driverNativeErr :=
transaction.Run(
"MERGE (u:User {uuid: $uuid}) ON CREATE SET u.uuid = $uuid, u.name = $name, u.userType = $userType ON MATCH SET u.uuid = $uuid, u.name = $name, u.userType = $userType RETURN u.uuid, u.name, u.userType",
map[string]interface{}{"uuid": userId, "name": input.Name, "userType": input.UserType})
// Raw driver error
if driverNativeErr != nil {
return nil, driverNativeErr
}
// If result returned
if transactionResult.Next() {
// Return the created nodes data
return &model.User{
ID: transactionResult.Record().Values[0].(string),
Name: transactionResult.Record().Values[1].(string),
UserType: model.UserType(transactionResult.Record().Values[2].(string)),
}, nil
}
// Node wasn't created there was an error return this
return nil, transactionResult.Err()
})
// End write data to neo4j
// write failed
if neo4jWriteErr != nil {
return nil, neo4jWriteErr
}
// write success
return neo4jWriteResult.(*model.User), nil
}
Код с сайта resolver.go
type Resolver struct {
DbDriver neo4j.Driver
}
схема.graphqls
enum UserType {
"Administrator account"
ADMIN
"Tutor account"
TUTOR
"Student account"
STUDENT
"Unvalidated Account"
UNVALIDATED
"Suspended Account"
SUSPENDED
"Retired account"
RETIRED
"Scheduled for deletion"
DELETE
}
type User {
id: ID!
name: String!
userType: UserType!
}
input UserInput {
id: String
name: String!
userType: UserType!
}
type Mutation {
upsertUser(input: UserInput!) : User!
}