trustification / trustify

Apache License 2.0
10 stars 19 forks source link

internal error hitting api/v1/purl/{url encoded purl} #676

Closed JimFuller-RedHat closed 1 month ago

JimFuller-RedHat commented 1 month ago

When I invoke:

 curl -H "Authorization:$(oidc token testing-client --bearer)" "http://localhost:8080/api/v1/purl/pkg%3A%2F%2Frpm%2Fredhat%2Fcryptsetup-reencrypt%402.4.3-4.el9_0.2"

We get

Query Error: error returned from database: missing FROM-clause entry for table "versioned_purl"

looking at the underlying query

SELECT "qualified_purl"."id", "qualified_purl"."versioned_purl_id", "qualified_purl"."qualifiers" FROM "qualified_purl" LEFT JOIN "base_purl" ON "versioned_purl"."base_purl_id" = "base_purl"."id" WHERE "base_purl"."type" = 'rpm' AND "base_purl"."name" = 'cryptsetup-reencrypt' AND "versioned_purl"."version" = '2.4.3-4.el9_0.2' AND "qualified_purl"."qualifiers" = '{}' AND "base_purl"."namespace" = 'redhat' LIMIT 1

the left join is referring to versioned_purl.base_purl_id which is missing eg. versioned_purl is never joined ... either there is a missing join or this is just a typo or something more ... will investigate rust code.

JimFuller-RedHat commented 1 month ago

problem is in modules/fundamental/src/purl/service/mod.rs

            let mut query = qualified_purl::Entity::find()
                .left_join(base_purl::Entity)
                .filter(base_purl::Column::Type.eq(&purl.ty))
                .filter(base_purl::Column::Name.eq(&purl.name))
                .filter(versioned_purl::Column::Version.eq(version))
                .filter(qualified_purl::Column::Qualifiers.eq(Qualifiers(purl.qualifiers.clone())));

all works if we add left_join to versioned_purl and comment out qualifier filter

            let mut query = qualified_purl::Entity::find()
                .left_join(versioned_purl::Entity)
                .left_join(base_purl::Entity)
                .filter(base_purl::Column::Type.eq(&purl.ty))
                .filter(base_purl::Column::Name.eq(&purl.name))
                .filter(versioned_purl::Column::Version.eq(version))
                //.filter(qualified_purl::Column::Qualifiers.eq(Qualifiers(purl.qualifiers.clone())));

because in the SQL WHERE clause, this

AND "qualified_purl"."qualifiers" = '{}'

does not ever match, probably something with how jsonb equiv in sea_orm.

JimFuller-RedHat commented 1 month ago

@helio-frota reminds us we should add a api/v1/purl/{key} test as well ;)