// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package interfaces

import (
	"v.io/v23/context"
	"v.io/v23/rpc"
	"v.io/v23/security/access"
	wire "v.io/v23/services/syncbase/nosql"
)

// App is an internal interface to the app layer.
type App interface {
	// Service returns the service handle for this app.
	Service() Service

	// NoSQLDatabase returns the Database for the specified NoSQL database.
	NoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string) (Database, error)

	// NoSQLDatabaseNames returns the names of the NoSQL databases within the App.
	NoSQLDatabaseNames(ctx *context.T, call rpc.ServerCall) ([]string, error)

	// CreateNoSQLDatabase creates the specified NoSQL database.
	CreateNoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string, perms access.Permissions, metadata *wire.SchemaMetadata) error

	// DestroyNoSQLDatabase deletes the specified NoSQL database.
	DestroyNoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string) error

	// SetDatabasePerms sets the perms for the specified database.
	SetDatabasePerms(ctx *context.T, call rpc.ServerCall, dbName string, perms access.Permissions, version string) error

	// Name returns the name of this app.
	Name() string
}
