def find[B]()

in app/com/gu/memsub/services/JsonDynamoService.scala [35:47]


  def find[B](b: B)(implicit of: OWrites[B], r: Reads[A]): M[List[A]] = Monad[M].point {
    val primaryKey = table.describe().getKeySchema.get(0).getAttributeName
    val jsonItem = Json.toJson(b)
    val dynamoResult = (jsonItem \ primaryKey).validate[String].asOpt.fold {
      itemFormat.reads(jsonItem).fold(err => Seq.empty, { itemFromJson =>
        val filters = itemFromJson.asMap().asScala.map { case (k, v) => new ScanFilter(k).eq(v): ScanFilter }.toSeq
        table.scan(new ScanSpec().withScanFilters(filters:_*)).iterator().asScala.toSeq
      })
    } { keyValue =>
      Option(table.getItem(new GetItemSpec().withPrimaryKey(primaryKey, keyValue))).toSeq
    }
    dynamoResult.flatMap(i => Json.fromJson[A](Json.toJson[Item](i)).asOpt).toList
  }