Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import org.apache.texera.dao.jooq.generated.tables.pojos.User
import org.apache.texera.web.resource.EmailTemplate.createRoleChangeTemplate
import org.apache.texera.web.resource.GmailResource.sendEmail
import org.apache.texera.web.resource.dashboard.admin.user.AdminUserResource.userDao
import org.apache.texera.web.resource.dashboard.user.dataset.utils.DatasetStatisticsUtils.getUserCreatedDatasets
import org.apache.texera.web.resource.dashboard.user.quota.UserQuotaResource._
import org.jasypt.util.password.StrongPasswordEncryptor

Expand Down Expand Up @@ -126,6 +127,16 @@ class AdminUserResource {
userDao.insert(newUser)
}

@GET
@Path("/created_datasets")
@Produces(Array(MediaType.APPLICATION_JSON))
def getCreatedDatasets(@QueryParam("user_id") user_id: Integer): List[DatasetQuota] = {
if (user_id == null) {
throw new BadRequestException("user_id is required")
}
getUserCreatedDatasets(user_id)
}

@GET
@Path("/created_workflows")
@Produces(Array(MediaType.APPLICATION_JSON))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import org.apache.texera.dao.MockTexeraDB
import org.apache.texera.dao.jooq.generated.Tables._
import org.apache.texera.dao.jooq.generated.enums.{PrivilegeEnum, UserRoleEnum}
import org.apache.texera.dao.jooq.generated.tables.daos.{
DatasetDao,
UserDao,
WorkflowDao,
WorkflowExecutionsDao,
Expand All @@ -31,6 +32,7 @@ import org.apache.texera.dao.jooq.generated.tables.daos.{
WorkflowVersionDao
}
import org.apache.texera.dao.jooq.generated.tables.pojos.{
Dataset,
User,
Workflow,
WorkflowExecutions,
Expand All @@ -44,7 +46,7 @@ import org.scalatest.matchers.should.Matchers

import java.sql.Timestamp
import java.util.UUID
import javax.ws.rs.WebApplicationException
import javax.ws.rs.{BadRequestException, WebApplicationException}
import scala.jdk.CollectionConverters._

class AdminUserResourceSpec
Expand All @@ -59,6 +61,7 @@ class AdminUserResourceSpec
private val testWid = 90000 + scala.util.Random.nextInt(5000)

private var userDao: UserDao = _
private var datasetDao: DatasetDao = _
private var workflowDao: WorkflowDao = _
private var workflowVersionDao: WorkflowVersionDao = _
private var workflowExecutionsDao: WorkflowExecutionsDao = _
Expand All @@ -70,6 +73,7 @@ class AdminUserResourceSpec
override protected def beforeAll(): Unit = {
initializeDBAndReplaceDSLContext()
userDao = new UserDao(getDSLContext.configuration())
datasetDao = new DatasetDao(getDSLContext.configuration())
workflowDao = new WorkflowDao(getDSLContext.configuration())
workflowVersionDao = new WorkflowVersionDao(getDSLContext.configuration())
workflowExecutionsDao = new WorkflowExecutionsDao(getDSLContext.configuration())
Expand All @@ -92,6 +96,10 @@ class AdminUserResourceSpec
.execute()
getDSLContext.deleteFrom(WORKFLOW_OF_USER).where(WORKFLOW_OF_USER.WID.eq(testWid)).execute()
getDSLContext.deleteFrom(WORKFLOW).where(WORKFLOW.WID.eq(testWid)).execute()
getDSLContext
.deleteFrom(DATASET)
.where(DATASET.OWNER_UID.in(primaryUid, secondaryUid))
.execute()
getDSLContext.deleteFrom(USER).where(USER.UID.in(primaryUid, secondaryUid)).execute()
// addUser() inserts an INACTIVE user with an auto-generated uid and a "User<millis>" name.
getDSLContext
Expand Down Expand Up @@ -124,6 +132,19 @@ class AdminUserResourceSpec
workflow
}

private def seedDataset(uid: Int): Dataset = {
val dataset = new Dataset
dataset.setOwnerUid(uid)
dataset.setName("admin_user_spec_ds_" + UUID.randomUUID().toString.substring(0, 8))
dataset.setRepositoryName("repo-" + UUID.randomUUID().toString.substring(0, 8))
dataset.setIsPublic(false)
dataset.setIsDownloadable(true)
dataset.setDescription("")
dataset.setCreationTime(new Timestamp(System.currentTimeMillis()))
datasetDao.insert(dataset)
dataset
}

private def seedExecution(uid: Int): WorkflowExecutions = {
seedWorkflow()
val version = new WorkflowVersion
Expand Down Expand Up @@ -218,6 +239,28 @@ class AdminUserResourceSpec
a[WebApplicationException] should be thrownBy resource.updateUser(edit)
}

// ─── getCreatedDatasets ───────────────────────────────────────────────────

"getCreatedDatasets" should "return an empty list for a user with no datasets" in {
userDao.insert(makeUser(primaryUid, "dataset_user"))
resource.getCreatedDatasets(primaryUid) shouldBe empty
}

it should "reject a missing user_id with a BadRequestException" in {
assertThrows[BadRequestException](resource.getCreatedDatasets(null))
}

it should "return only the datasets owned by the queried user" in {
userDao.insert(makeUser(primaryUid, "dataset_owner"))
userDao.insert(makeUser(secondaryUid, "other_owner"))
val owned = seedDataset(primaryUid)
seedDataset(secondaryUid)

val created = resource.getCreatedDatasets(primaryUid)
created.map(_.name) shouldBe List(owned.getName)
created.head.size shouldBe 0L
}

// ─── getCreatedWorkflow ───────────────────────────────────────────────────

"getCreatedWorkflow" should "return an empty list for a user with no created workflows" in {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,12 @@ describe("AdminUserService", () => {
req.flush([]);
});

it("getCreatedDatasets() GETs without a query param", () => {
it("getCreatedDatasets() sends the uid as a user_id query param", () => {
service.getCreatedDatasets(9).subscribe();

const req = httpMock.expectOne(USER_CREATED_DATASETS);
const req = httpMock.expectOne(r => r.url === USER_CREATED_DATASETS);
expect(req.request.method).toEqual("GET");
expect(req.request.params.keys().length).toEqual(0);
expect(req.request.params.get("user_id")).toEqual("9");
req.flush([]);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ export class AdminUserService {
}

public getCreatedDatasets(uid: number): Observable<ReadonlyArray<DatasetQuota>> {
return this.http.get<ReadonlyArray<DatasetQuota>>(`${USER_CREATED_DATASETS}`);
let params = new HttpParams().set("user_id", uid.toString());
return this.http.get<ReadonlyArray<DatasetQuota>>(`${USER_CREATED_DATASETS}`, { params: params });
}

public getCreatedWorkflows(uid: number): Observable<ReadonlyArray<Workflow>> {
Expand Down
Loading