Код стиля кодирования 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!
}

0 ответов

Другие вопросы по тегам