Golang GraphQL array type returning

I have this type of GraphQL schema

type FileInfo {
    fileId: Int!
    sources:  [ProcessedFiles!]!
}

type ProcessedFiles {
    filename:     String!
    url: String!
    type:   String!
    quality: String!
}

type Episode{
    id: Int!
    position: Int!
    seriesId: Int!
    seriesName: String!
    seasonId: Int!
    seasonName: String!
    name: String!
    description: String!
    duration: Int!
    images: MovieImage!
    episodeLanguages: [LanguageWithDescription!]!
    languages: [Language!]!
    warnings: [Warning!]!
    status: Int!
    mediaInfo: [MediaInfo!]!
    note: String!
    fileInfo: FileInfo!
    transcodeStatus:[TranscodeStatus!]!
}

type Query{
    getEpisodesOfSeason(seasonId: Int!): [Episode!]!
}

And here is my gqlgen.yml

models:
  Episode:
    fields:
      episodeLanguages:
        resolver: true
      languages:
        resolver: true
      warnings:
        resolver: true
      mediaInfo:
        resolver: true
      fileInfo:
        resolver: true
      transcodeStatus:
        resolver: true

It generates me additional resolvers for each of them. Like code below:

func (e episodeResolver) FileInfo(ctx context.Context, obj *models.Episode) (*models.FileInfo, error) {
    fileInfo, err := e.Services.Movie.GetFileInfoByMovieId(obj.ID)
    if err != nil {
        return nil, err
    }
    return fileInfo, nil
}

e.Services.Movie.GetFileInfoByMovieId(obj.ID)

func (m *MovieService) GetFileInfoByMovieId(movieId int) (*models.FileInfo, error) {
    fileInfo, err := m.repos.Movie.GetFileInfoByMovieId(movieId)
    if err != nil {
        return nil, err
    }
    return fileInfo, nil
}

m.repos.Movie.GetFileInfoByMovieId(movieId)

func (m *MoviePostgres) GetFileInfoByMovieId(movieId int) (*models.FileInfo, error) {
    var fileId int
    query := `select id from files where movie_id=$1`
    err := m.db.QueryRow(query, movieId).Scan(&fileId)
    if errors.Is(err, sql.ErrNoRows) {
        return &models.FileInfo{
            FileID:  0,
            Sources: nil,
        }, nil
    }
    if err != nil {
        return nil, err
    }

    var processedFiles *models.MoviesSources
    var processedFilesString string

    query = `select tf.data from transcode_files as tf where movie_id=$1`
    err = m.db.QueryRow(query, movieId).Scan(&processedFilesString)
    if err != nil && !errors.Is(err, sql.ErrNoRows) {
        return nil, err
    }
    err = json.Unmarshal([]byte(processedFilesString), &processedFiles)

    return &models.FileInfo{
        FileID:  fileId,
        Sources: processedFiles.Sources,
    }, nil

}

// this is structure of MoviesSources above
//type MoviesSources struct {
//  Sources []*ProcessedFiles `json:"sources"`
//}

Gqlgen throws me Internal system error when code is returned from if statement below. But my code return no errors. I tried removing all ! from schema. But it also throws error on gqlgen. Gqlgen version v0.17.45

if errors.Is(err, sql.ErrNoRows) {
        return &models.FileInfo{
            FileID:  0,
            Sources: nil,
        }, nil
    }

I want to get response like this:

"fileInfo": { "fileId": 12345, "sources": null } if there is no rows in database in fileInfo field.

Upvotes: 1

Views: 52

Answers (0)

Related Questions