Add non-legacy backend interface for adding new decks

This commit is contained in:
Damien Elmes 2022-09-04 13:39:41 +10:00
parent e2193950a9
commit 0bcb3a3564
3 changed files with 22 additions and 3 deletions

View file

@ -11,6 +11,8 @@ import "anki/generic.proto";
import "anki/collection.proto";
service DecksService {
rpc NewDeck(generic.Empty) returns (Deck);
rpc AddDeck(Deck) returns (collection.OpChangesWithId);
rpc AddDeckLegacy(generic.Json) returns (collection.OpChangesWithId);
rpc AddOrUpdateDeckLegacy(AddOrUpdateDeckLegacyRequest) returns (DeckId);
rpc DeckTree(DeckTreeRequest) returns (DeckTreeNode);

View file

@ -25,6 +25,7 @@ FilteredDeckConfig = decks_pb2.Deck.Filtered
DeckCollapseScope = decks_pb2.SetDeckCollapsedRequest.Scope
DeckConfigsForUpdate = deckconfig_pb2.DeckConfigsForUpdate
UpdateDeckConfigs = deckconfig_pb2.UpdateDeckConfigsRequest
Deck = decks_pb2.Deck
# type aliases until we can move away from dicts
DeckDict = dict[str, Any]
@ -104,9 +105,9 @@ class DeckManager(DeprecatedNamesMixin):
if id := self.col.decks.id_for_name(name):
return OpChangesWithId(id=id)
else:
deck = self.col.decks.new_deck_legacy(filtered=False)
deck["name"] = name
return self.add_deck_legacy(deck)
deck = self.col.decks.new_deck()
deck.name = name
return self.add_deck(deck)
def add_deck_legacy(self, deck: DeckDict) -> OpChangesWithId:
"Add a deck created with new_deck_legacy(). Must have id of 0."
@ -161,6 +162,13 @@ class DeckManager(DeprecatedNamesMixin):
def get_all_legacy(self) -> list[DeckDict]:
return list(from_json_bytes(self.col._backend.get_all_decks_legacy()).values())
def new_deck(self) -> Deck:
"Return a new normal deck. It must be added with .add_deck() after a name assigned."
return self.col._backend.new_deck()
def add_deck(self, deck: Deck) -> OpChangesWithId:
return self.col._backend.add_deck(message=deck)
def new_deck_legacy(self, filtered: bool) -> DeckDict:
deck = from_json_bytes(self.col._backend.new_deck_legacy(filtered))
if deck["dyn"]:

View file

@ -13,6 +13,15 @@ use crate::{
};
impl DecksService for Backend {
fn new_deck(&self, _input: pb::Empty) -> Result<pb::Deck> {
Ok(Deck::new_normal().into())
}
fn add_deck(&self, deck: pb::Deck) -> Result<pb::OpChangesWithId> {
let mut deck: Deck = deck.try_into()?;
self.with_col(|col| Ok(col.add_deck(&mut deck)?.map(|_| deck.id.0).into()))
}
fn add_deck_legacy(&self, input: pb::Json) -> Result<pb::OpChangesWithId> {
let schema11: DeckSchema11 = serde_json::from_slice(&input.json)?;
let mut deck: Deck = schema11.into();